谈到层叠机制,首先我们要知道什么是声明冲突。

  声明冲突有三个条件:①多个选择器选中同一个元素;②声明块里的属性相同;③属性的属性值不同。同时满足这三点时就会产生声明冲突。比如下图html代码:

1     <div>
2         <p><span>hello word</span></p>
3     </div>

他的css文件如下:

1 span{
2     color:red;
3 }
4 p>span{
5     color:blue;
6 }
7 div>p>span{
8     color:green;
9 }

此时就会产生声明冲突。

  浏览器只会挑其中一个选择器中的样式来渲染网页,关于如何挑选就是层叠机制的内容。

  层叠机制:是一种机制,当发生声明冲突时自动触发,浏览器通过层叠机制解决声明冲突。主要内容为:

  1、首先比较样式表的优先级。

    样式表的优先级受来源和重要性影响。

    来源:作者样式表>浏览器默认样式表

    重要性:针对作者样式表而言的,有!important>无重要样式声明

    因此作者重要>作者普通>浏览器默认,比如:

1     <div>
2         <p>
3             <span>
4                 <a href="http://www.baidu.com">百度一下</a>
5             </span>
6         </p>
7     </div>
1 a{
2     color: green!important;
3 }
4 
5 a{
6     color:red;
7 }

a标签浏览器默认为蓝色,普通定义了样式为红色,重要样式定义了绿色,因此最终被渲染成绿色。

   

  2.比较特殊性,也叫权重or特指度。

    规则:行内样式>ID选择器>类、伪类、属性选择器>元素、伪元素选择器>通配符选择器

    当发生声明冲突且他们优先级相同时,我们比较特殊性,通过上述规则,我们对每一个样式会产生一个四元数组(a,b,c,d),其中:

     a:行内样式为1,否则为0

     b:ID选择器的个数

     c:类、伪类、属性选择器的个数

     d:元素、伪元素选择器的个数

    依次从前往后比,大的胜出,一旦胜出,无需再比较之后的数值。例如:

  页面中的一个a元素:

1     <div class="main">
2         <div>
3             <p id="nav">
4                 <span class="home">
5                     <a href="http://www.baidu.com">百度一下</a>
6                 </span>
7             </p>
8         </div>
9     </div>
 1 /*样式1*/
 2 a{
 3     color: green;
 4 }
 5 /*样式2*/
 6 .foo{
 7     color:yellow;
 8 }
 9 /*样式3*/
10 #bar{
11     color: red;
12 }
13 /*样式4*/
14 .main>div #nav *.home a:link{
15     color:pink;
16 }

样式1:  0,0,0,1; 

样式2:  0,0,1,0;

样式3:  0,1,0,0;

样式4:  0,1,3,2;  

 

    3. 比较源次序。当优先级和特殊性都一样时,书写顺序上,后写的会覆盖先写的。

  以上,就是层叠机制的主要内容。

 

  以下,写几个常见的误区;

  误区一:认为ID选择器适用范围最小,因此特殊性最高。这种说法是错的,应该按照“四元数组”法判断。

  误区二:

1     <div id="bar">
2         <a href="http://www.baidu.com">百度一下</a>
3     </div>
1 /*样式1*/
2 #bar{
3     color: red;
4 }
5 /*样式2*/
6 a{
7     color: green;
8 }

  认为a标签最后是红色。这里其实样式1和样式2并没有发生声明冲突,由于浏览器中对a元素有默认的样式,作者样式表也写了对a元素的样式,因此没有发生继承。产生声明冲突的是浏览器的默认样式和作者样式表中的样式2,优先级比较知道样式2胜出,无需比较特殊性。

    欢迎补充。