页面中的每一个元素的每一个CSS属性都是有值的的,从无属性值,到每个属性都有值,这个过程,叫做CSS属性值计算过程
计算过程一共4个阶段:
- 确定声明值
- 层叠冲突
- 使用继承
- 使用默认值
1. 确定声明值
参考样式表中没有冲突的声明,直接作为CSS属性值
<h1 class="title">Title</h1>
/* 开发者(写的)样式表 */
.title { color: red; font-size: 40px; }
h1 { font-size: 26px; }
div h1.red { font-size: 3em; font-size: 30px; }
/* 浏览器默认样式表 */
h1 { display: block; font-size: 2em; font-weight: bold; }
在第一步中,取出color,display,font-weight三个属性没有冲突,所以直接取出它们的值作为最终CSS属性值
2. 层叠冲突
在这一步中,还会分成三小步:
- 比较重要性:用开发者样式表覆盖浏览器默认样式表
- 比较特殊性:比较选择器的权重
- 比较源次序:代码靠后的覆盖代码靠前的
比如上述代码中的font-size:第一步比较,淘汰了浏览器默认样式2em;第二步比较,淘汰了40px和26px;第三步比较,淘汰了3em,最终,font-size的属性值为30px
3. 使用继承
对仍然没有值的属性,若可以继承,则继承父元素的值(离当前元素最近的父元素)
可继承的样式有很多,比如:
- 行内元素可继承:letter-spacing、word-spacing、white-space、color、font、font-family、font-size、font-style、font-weight、text-decoration、text-transfrom等
- 块级元素可继承:color、text-indent、text-align等
- 列表元素可继承:list-style(list-style-type、list-style-position、list-style-image)等
4. 使用默认值
对仍然没有值的属性,使用默认值
小拓展:
- 如果属性值为inherit,那么在第三步之前,即会取父元素的属性值来为自己赋值
- 所有的相对单位,比如%,em,rem,auto等等,最终都会换算成绝对单位px