height
属性的百分比值有些复杂,而width
和height
属性实际上行为不同。让我带您了解一下规范。
height
属性:
让我们看一下CSS Snapshot 2010 规范对 height
的说明:
百分比是相对于生成框的包含块的高度计算的。如果未明确指定包含块的高度(即它取决于内容高度),并且此元素没有绝对定位,则该值计算为“auto”。根元素上的百分比高度相对于初始包含块。注意:对于其包含块基于块级元素的绝对定位元素,百分比是相对于该元素的内边距框的高度来计算的。
好的,让我们一步一步来拆解:
百分比是相对于生成框的包含块的高度计算的。
什么是包含块?虽然有点复杂,但对于默认 static
位置的普通元素来说,它是:
最近的块级容器祖先盒子
或者用英语说,就是它的父级盒子。(了解对于 fixed
和 absolute
位置分别是什么也很值得,但为了让答案简明扼要,我忽略了这些。)
因此,看看这两个例子:
<div id="a" style="width: 100px; height: 200px; background-color: orange">
<div id="aa" style="width: 100px; height: 50%; background-color: blue"></div>
</div>
<div id="b" style="width: 100px; background-color: orange">
<div id="bb" style="width: 100px; height: 50%; background-color: blue"></div>
</div>
在这个例子中,
#aa
的包含块是
#a
,
#b
和
#bb
同理。到目前为止,一切都很好。
height
属性规范的下一句话是我在答案开头提到的复杂之处:
如果没有明确指定包含块的高度(即它取决于内容高度),并且该元素没有绝对定位,则该值计算为“auto”。
啊哈!包含块的高度是否已经明确指定很重要!
- 在
#aa
的情况下,
height:200px
的50%为100px
- 但是,在
#bb
的情况下,
height:auto
的50%是
auto
,因为没有内容可以扩展到
auto
,所以为0px
正如规范所说,包含块是否已经绝对定位也很重要,但让我们继续看
width
属性。
那么对于width
,它的工作方式是否相同呢?让我们看一下规范:
百分比是相对于生成框所在块的宽度计算的。
看看这些熟悉的例子,从之前的例子中调整而来,以变化width
而不是height
:
<div id="c" style="width: 200px; height: 100px; background-color: orange">
<div id="cc" style="width: 50%; height: 100px; background-color: blue"></div>
</div>
<div id="d" style=" height: 100px; background-color: orange">
<div id="dd" style="width: 50%; height: 100px; background-color: blue"></div>
</div>
- 在
#cc
的情况下,width:200px
的50%是100px。
width:auto
的50%取决于width:auto
最终成为多少的50%,与height
不同,没有特殊规则来处理这种情况。
现在,这里有一个棘手的问题:auto
的含义取决于它是否已为width
或height
指定!对于height
,它只是表示适合内容所需的高度*,但对于width
,auto
实际上更加复杂。您可以从代码片段中看到,在这种情况下,它最终成为了视口的宽度。
规范对于宽度的自动值有何说明?
宽度取决于其他属性的值。请参见以下各节。
嘿,那不是很有帮助。为了节省您的麻烦,我已经为您找到了与我们用例相关的部分,标题为“计算宽度和边距”,副标题为{{link1:“普通流中的块级非替换元素”}}:
其他属性的使用值之间必须满足以下约束条件:
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = 包含块的宽度
好的,所以width
加上相关的边距、边框和内边距必须总和等于包含块的宽度(而不是像height
一样处理后代)。只有一个规范句子:
如果将'width'设置为'auto',则任何其他'auto'值都变为'0',并且'width'遵循由此产生的等式。
啊哈!所以在这种情况下,width:auto
的50%是视口的50%。希望现在一切都讲得很清楚!
脚注
* 至少在这种情况下是有意义的。spec 好了,现在一切只是有点讲得通。
height
属性与百分比值的简单明了的解释:https://dev59.com/51wZ5IYBdhLWcg3wM97Z#31728799 - Michael Benjamin