为何存在
级联算法就是当样式冲突的时候,通过这个算法,来输出唯一一个优先度高的样式
组成部分
-
来源于重要性(Origin and Inportance):样式的“出身”,优先级从高到低顺序为:
- 开发者样式 (Author Stylesheets): 你作为网站开发者写的样式。
- 用户样式 (User Stylesheets): 用户为自己浏览器设置的样式。
- 浏览器默认样式 (User-Agent Stylesheets): 浏览器自带的默认样式。
!important标记: 这个标记可以“颠覆”上述天生的优先级。一个带有!important的规则会比任何不带!important的规则优先级更高。
-
特殊性(Specificity):所指的元素越具体,特殊性越高,优先度也越高CSS选择器的权重
- 内联样式 (如
<div style="...">) - 特殊性最高。 - ID 选择器 (如
#header) - 类选择器、属性选择器、伪类 (如
.button,[type="submit"],:hover) - 元素选择器、伪元素 (如
div,::before) - 特殊性最低。
- 内联样式 (如
-
源顺序(Source Order):上两个比较都相同的时候利用这个规则,即后来居上,后写的优先度更高
运作机制
浏览器严格按照以下三步流程来解决冲突:
-
第一步:比较“来源与重要性”。
- 首先看规则是否带有
!important。带有!important的开发者样式 > 带有!important的用户样式 > 任何不带!important的规则。 - 在不带
!important的规则中,开发者的样式 > 用户的样式 > 浏览器的默认样式。 - 在这一步,冲突的规则被分到一个“优先级最高的小组”里,进入下一步比较。
- 首先看规则是否带有
-
第二步:比较“特殊性”。
- 在同一个来源小组中,浏览器会计算每个规则选择器的特殊性值。
- 特殊性值越高的规则胜出。例如,
#nav .link(一个ID和一个类) 的特殊性就高于div .link(一个元素和一个类)。
-
第三步:比较“源顺序”。
- 如果在前两步之后,仍然有两条或多条规则打成了平手(来源、重要性和特殊性都完全相同),那么在样式表中最后出现的那条规则胜出。后来者居上。
级联与继承的关系
级联只是负责处理样式冲突,而CSS中的继承是一种属性值的传递机制
“级联”是用来解决多条规则应用在同一个元素上的冲突,而“继承”是在没有任何直接规则应用到该元素上时,提供一个备用值的机制