CSS的“层叠”规则的总结

当你随机打开一个页面,查看源代码,你会发现,同一个元素,不止有一个CSS选择器及对应的样式。而一个元素只能应用一个样式,那么一堆样式中究竟是应用哪一个呢?这就涉及到CSS的层叠规则了。下面就来总结下CSS的层叠规则。

概念:CSS中的层叠就是让多个来源的样式叠加在一起,然后结合样式的特殊性(后面详细介绍)、继承性,确定最终应用的样式。

样式的来源分五种:

1、浏览器默认的样式;

2、用户自定义样式。一些页面中会提供一些让用户自定义字体大小颜色等的快捷键;

3、外部样式,即<link>引用的CSS后缀文件;

4、内部样式,即写在<style></style>标签内的样式;

5、内联样式,即直接写在style属性内的样式(现在的网页设计强调结构、表现、行为三者分离,所以这个还是少用为好。我会强迫性移除内联样式的,哈哈);

CSS权威指南中对样式来源的分类分成三种:

1、创作人员(上面提到的第3、4、5点都可归到这一点)

2、读者(用户自定义样式)

3、用户代理(这个就是上面所说的浏览器默认样式了)

来看一个例子:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <link rel="stylesheet" href="style.css" type="text/css">
 5 <style>
 6     #p1 #p2{
 7         color:yellow;
 8     }
 9     .div1 .div2 #p1{
10         color:green;
11     }
12     .div1 .div2 p{
13         color:gray;
14     }
15     .div1 .div2 .impo{
16         color:green;
17     }
18     .impo{
19         color: brown !important;
20     }
21 </style>
22 </head>
23 <body>
24     <div class="div1">
25         <div class="div2">
26             <p id="p1">Hello  world</p>
27             <p id="p2" style="color: red">Hello, how are you!</p>
28             <p class="impo">I‘m important!</p>
29         </div>
30     </div>
31 </body>
32 </html>
33
34 Style.css文件的代码:
35 .div1 .div2 #p1{
36     color: blue;
37 }

这个例子中,这三行文字的颜色分别是什么呢?相信你们很多人也知道了。答案先不揭晓,继续往下看。

CSS2.1层叠规则是:

1、找出所有相关的规则,这些规则都包含与一个给定元素匹配的选择器。

2、按显式权重对应用到该元素的所有声明进行排序,有!important标志的声明的权重要高于不带!important标志的声明。

3、按来源对应用到给定元素的所有声明进行排序。正常情况下,创作人员的样式要胜过读者的样式。有!important标志的的读者样式要强于所有其他样式,包括有!important标志的创作人员样式。创作人员的样式和读者样式斗都比用户代理的默认样式强。

4、按特殊性对应用到给定元素的所有声明进行排序,有较高特殊性的元素权重要大于有较低特殊性的元素。

5、按出现顺序对应用到给定元素的所有声明进行排序,后面出现的声明权重要大于前面出现的声明,及后定义的样式会覆盖前面定义的样式。

简单总结:找出一个给定元素的所有声明后,先按显式权重和来源进行排序。如果相同,则比较特殊性。若再相同,则比较顺序。

根据以上的知识,我们很明确知道了上面的例子三行文字的颜色是什么了:

第一行是文字的颜色是green;第二行文字的颜色是red;第三行文字颜色是brown。

下面着重讲解下选择器的特殊性:

1、对于内联样式,特殊性首位加1,即1,0,0,0。

2、对于选择器中出现的ID属性值,加0,1,0,0, 有多少个ID值就在第二位加几位。

3、对于选择器中出现的类属性值,属性选择及伪类,加0,0,1,0,共出现多少个就在第三位加几位。

4、对于选择器中出现的元素,以及伪元素,加0,0,0,1,共出现多少个就在第四位加几位。

5、通配符对特殊性没有任何贡献,即特殊性是0,0,0,0。

6、结合符没有特殊性,连0特殊性也没有。

7、继承的CSS完全没有特殊性,连0特殊性也没有。

下面再来看一个例子:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <style type="text/css">
 5      #content #main-content h2{
 6      color:red;
 7       }
 8
 9      #content #main-content>h2{
10      color:blue ;
11       }
12      body #content div[id="main-content"] h2{
13      color:green;
14       }
15
16      #main-content div.paragraph h2{
17      color:orange;
18       }
19      #main-content [class="paragraph"] h2{
20      color:yellow;
21       }
22      div#main-content div.paragraph h2.first{
23      color:pink;
24
25      }
26 </style>
27
28 </head>
29 <body>
30 <div id="content">
31   <div id="main-content">
32     <h2>学习HTML</h2>
33     <div class="paragraph">
34       <h2 class="first">学习CSS</h2>
35     </div>
36   </div>
37 </div>
38
39 </body>
40 </html>

这两个标题的颜色分别是什么呢?

用刚刚讲的特殊性规则计算下这六个样式的特殊性:

第一个规则特殊性的值是:0,2,0,1

第二个规则特殊性的值是:0,2,0,1

第三个规则特殊性的值是:0,1,1,3

第四个规则特殊性的值是:0,1,1,2

第五个规则特殊性的值是:0,1,1,1

第六个规则特殊性的值是:0,1,2,3

这样很明确知道了,特殊性最高的是第一和第二条规则,但第二条规则在后面,所以第一个标题的颜色是blue,第二个标题的颜色是red.

在这里要重点提一下,0特殊性(通配符)和没有特殊性是有很大差别的,这种差别决不能忽视。

看下面的例子,就可以看出两者的区别了:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <style type="text/css">
 5 *{
 6     color:gray;
 7 }
 8 h1#page-title{
 9     color:red;
10 }
11 </style>
12 </head>
13 <body>
14 <h1 id="page-title">Meerkat<em>Central</em></h1>
15 <p>
16 Welcome to the best place on the web for
17 </p>
18 </body>
19 </html>

这其中Meerkat的颜色是red,但Central的颜色是gray。因为通配符*的特殊性是0, 而继承的CSS是没有特殊性的,连0也没有,所以,通配符的权重要大于继承。

说了特殊性,这里也顺便引入一遍文章,这是对特殊性的另一方面的说明。

id 的选择器为什么要这么写 li#first?

时间: 2024-11-08 13:16:00

CSS的“层叠”规则的总结的相关文章

CSS 层叠规则

CSS 规则特殊性计算 特殊性 选择器的特殊性由选择器本身的组件确定.特殊性值表述为4个部分:0,0,0,0. 对于选择器中给定的各个id属性值,加0,1,0,0. 对于选择中给定的各个类属性值,属性选择或伪类,加0,0,1,0. 对于选择器中给定的各个元素和伪元素,加0,0,0,1. 结合符合通配符选择器对特殊性没有任何贡献 比较规则 因为值是从左向右排序的,所有1,0,0,0大于以0开头的所有特殊值,而不论后面的数是什么.比如,0,0,1,0比值0,0,0,13更高. 通配符的特殊性为0,0

css层叠规则(层叠样式表)

CSS层叠规则是: 1.找出所有相关的规则,这些规则都包含与一个给定元素匹配的选择器. 2.按权重(!important)和来源对应用到给定元素的所有声明进行排序. 3.按特殊性对应用到给定元素的所有声明进行排序,有较高特殊性的元素权重要大于有较低特殊性的元素,0特殊性比无特殊性要强(继承). 4.按出现顺序对应用到给定元素的所有声明进行排序,后面出现的声明权重要大于前面出现的声明,即后定义的样式会覆盖前面定义的样式.(适用于特殊性一样的时候) 解读: 一.权重和来源 来源: 1.创作人员(开发

1.6 CSS的层叠特性

作为本章的最后一节,这里主要讲解CSS的层叠属性.CSS的全名叫做“层叠样式表”,读者有没有考虑过,这里的“层叠”是什么意思?为什么这个词如此重要,以至于要出现在它的名称里. CSS的层叠特性确实很重要,但是要注意,千万不要和前面介绍的“继承”相混淆,二者有着本质的区别.实际上,层叠可以简单地理解为“冲突”的解决方案. 例如有如下一段代码,示例文件位于网页学习网CSS教程资源“第1章\16.htm”. <html> <head> <title>层叠特性</titl

深入解析CSS样式层叠权重值(转)

前言:折腾了半天圆角,发觉border-radius是css3的新特性,简单粗暴的解决了button的圆角显示,中间由于css权重问题,导致即使我设置了圆角也一直没有生效.以下是找到的相当不错的一篇css样式权重讲解的,清晰明了,看完就懂是啥了. 永记在心: important > 内联 > ID > 类|属性|伪类 > 标签|伪元素  > 通配符 > 继承  (相对于原文的调整  属性选择和为对象均与类并列~) 简单记住这几个就够用了: important >

css优先级计算规则

原文:css优先级计算规则 最近面试了一些求职者,我问css优先级计算规则是怎样的?答曰ID优先级>class>元素选择器,外联样式优先级低于内联样式,内联样式优先级低于行间样式,然后就没有然后了……,ID选择器的优先级确实>class选择器的优先级>元素选择器的优先级,但是外联样式优先级并不一定低于内联样式优先级.做为一个合格的前端工程师,让我们彻底搞清楚css优先级计算规则吧! 特殊性 css继承是从一个元素向其后代元素传递属性值所采用的机制.确定应当向一个元素应用哪些值时,浏

关于css的层叠上下文和层叠顺序问题

关于css的层叠上下文和层叠样式问题 最近在项目中遇到了一个让我欲仙欲死的问题,我给项目中的图片设置了一个淡入效果,几opacity变化,但当我在它的上面有一个定位元素时,动画结束后,定位元素居然被遮住了,百思不得解,谷歌了白天,才知道是层叠上下文.层叠顺序搞得鬼,所以这里把搜索的结果记下来,帮自己,也帮能够看到的盆友. 这里贴出一个解释很详细的地址,要是看了不太明白的,可以戳这里哦 首先层叠上下文是什么鬼呢? 层叠上下文,英文称作"stacking context". 是HTML中的

CSS和层叠

##常见的CSS属性## color:red  设置元素内容的颜色 <br>text-align:center  设置文字的对齐方式(例:centeer 居中) <br>font-size  设置文字大小 <br>font-weight:  设置文字粗细 <br>background:  设置文字背景颜色 ##通配选择器## 写法:*{} <br>通配选择器会选择body中所有内容. ##伪类选择器## 写法:.weilei{}=>.wei

CSS继承性+层叠性+盒子+浮动

CSS继承性+层叠性+盒子+浮动 CSS继承性 <style> div{ color: pink; font-size: 30px; width: 500px; background: green; padding: 100px; } p{ color: red; } </style> <div> <p>我们都是好孩子</p> <ul> <li> <p>我们都是栋梁之才</p> </li>

CSS+DIV入门第一天基础视频 CSS选择器层叠性和继承性

大家好,我是小强老师, 现在网上的CSS+DIV视频,要么讲的太深,要么太浅,很多初学的同学们总是遇到困难,今天小强老师专门给大家准备了css课程的视频.带你从零基础学习CSS+DIV一直到能独立完成前台网页制作.小强老师是这样分类的,前几次课,我们将CSS+DIV入门基础,后几天课程我们讲案例制作.咱们接下来讲的是css基础部分. 高清视频地址如下: 01  css语法规范:                       http://www.tudou.com/programs/view/8s