替换元素和非替换元素

印象很深,一年前觉得这么简单的概念不需要专门记,结果一年后就打脸了,又要重新翻找……好记性不如烂笔头。

替换元素(replaced element)

替换元素是指内容不在CSS格式化模型范围的元素,比如图片、嵌入的文档或者应用程序。举例说,HTML IMG元素的内容常常被它的src属性指定的图片所替换。替换元素常常本身就有尺寸:一个本身的宽、一个本身的高和一个本身的比例。比如说,一个位图图片本身有绝对单位决定的宽和高(其比例显然也被确定)。另一方面,其他文档也有可能没有任何本身的尺寸(如果一个空白的HTML文档)。

计算width和margin

计算值(computed value):给CSS属性设置的值。比如,如果是width属性,其计算值可以是百分比或auto或绝对长度。
使用值(used value):在布局时被使用的值,即最终实际看到的效果值。

行内非替换元素

  • margin-left或margin-right的计算值为auto,使用值为0。
  • width属性不被接受。

行内替换元素

  • margin-left或margin-right的计算值为auto,使用值为0。
  • 如果height和width的计算值都为auto,元素也有本身的宽度,那么这个本身的宽度就是width的使用值。例子:img、input。
  • 如果width的计算值为auto,元素也有本身的宽度,那么这个本身的宽度就是width的使用值。
  • 如果height和width的计算值都为auto,元素没有本身的宽度,但有本身的高度和比例;或者width的计算值为auto,height有其他的计算值,且元素有本身的比例,那么width的计算值为:高度的使用值(height的计算值或元素本身的高度) * 本身的比例。简单说,就是在此情况下,如果元素的高度(设置的或者本身的)和比例确定,则宽度根据此确定。
  • 除此之外,如果width的计算值为auto,那么width的使用值为300px。如果300px太宽了不能适应屏幕,UA应该使用2:1比例的最大矩形的宽度来适应屏幕。例子:iframe、canvas。

其他类型的替换元素,其宽度的定义都参照行内替换元素的定义。

计算height和margin

行内非替换元素

height属性不被接受。

行内替换元素

  • margin-top或margin-bottom的计算值为auto,使用值为0。
  • 如果height和width的计算值都为auto,元素本身有高度,那么这个本身的高度就是height的使用值。
  • 如果height的计算值为auto,元素本身有高度,那么这个本身的高度就是height的使用值。
  • 如果height的计算值为auto,元素本身有比例,且width有计算值或元素本身有宽度,那么height的使用值为:width的使用值(width的计算值或元素本身的宽度)/ 本身的比例。
  • 如果height的计算值为auto且不符合上面任何一种条件,那么height的使用值为2:1比例的最大矩形的高度,且不能超过150px,宽度不能超过屏幕宽度。

其他类型的替换元素,其高度的定义都参照行内替换元素的定义。

参考文献