4.4 指定值、计算值和实际值
2008年5月11日
制作者定义CSS时,不需要对每个属性都指定一个值,而对于解释网页的用户端(例如:浏览器),当它解析了一个文档并且生成了文档树,它必须为文档树中的每一个元素,根据目标媒介类型所适用的每一个属性,指定一个值。也就是说,无论制作者是否在CSS中定义了某个属性,每个属性都有一个值,可能是制作者定义得值,也可能是属性的初始值,或者浏览器内部样式的值。
制作者所写的CSS值,可以是一个具体的数字,也可能是一个百分比,或者一个缩放因子,而对于浏览器来说,它必须将用户定义的值转变为可以在屏幕上显示的具体的数值。
一个属性最终的值的确定需要经过4步计算:首先是通过规则确定一个“指定值”,然后转换成用以继承的“计算值”,如果需要再转换为一个绝对的“使用值”,最后依照局部的环境限定转换为“实际值”。
1. 指定值
用户端根据下列规则给每个属性分配指定值(按照优先级排序):
1) 如果值中包含层叠,使用层叠。
2) 否则,如果属性是继承的且元素不是文档的根元素,使用它父元素的计算值。
3) 否则使用初始值。(初始值在每个属性的定义列表内有说明。)
2. 计算值
在层叠中,指定值决定计算值,而指定值可以是一个绝对值(例如颜色值“red”),也可以是一个相对值(例如“em”和“ex”需要根据像素或者绝对长度来计算)。
对于绝对值,不需要经过计算来得到计算值。
而相对值必须转换为计算值:百分比要乘以一个参考值(每一个属性都会定义参考值是什么),包含相对单位的值(em,ex,px)必须乘以相应的字体或点的尺寸以得到绝对值,“auto”值必须由各属性给出的公式加以计算,某些关键字(smaller,bolder,inherit)根据它们的定义而加以替换。
大部分情形下,元素继承的是计算值。不过有一些属性的指定值也可以被继承(例如line-height属性的数字值)。子元素不继承计算值的情况在属性定义中有描述。
当指定值不是“inherit”时,属性的计算值根据属性定义列表中“计算值”一项来确定。
3. 使用值
有时候,计算值可能要到文档被用户端解释的时候才能确定,例如,某个div设定了宽度为其包含块宽度的80%,那么,其计算值需要在用户端确定了其包含块的宽度以后,才能计算出来。
使用值就是指从绝对值中去除了其他因素以后计算出来的值。
4. 实际值
原则上,使用值是用户端用来绘制元素的值,但是用户端在某些特定的环境下可能不能使用这个值。例如边框的宽度只能以整数的像素值来显示,因此可能会计算出一个近似的宽度值,再例如,某些显示设备只能用黑白及灰度值来显示彩色的内容。
实际值就是使用值实际应用中的近似值。