你所不知道的Css层叠规则

我们都知道,css中可以使用多种不同的方法选择元素。可能同一个元素可以使用两个或多个规则来选择,每个规则都有其自己的选择器。当对同一个元素应用多个选择器规则时,用户代理(浏览器)使用层叠的方式来最终展示。

特殊性

对于每个规则,用户代理(浏览器)会计算选择器的特殊性,并将这个特殊性附加到规则中的各个声明。如果同一个元素有两个或者多个冲突的属性声明时,那么有最高特殊性的声明就会胜出。
特殊性值使用4个部分表示,0,0,0,0。一个选择器的具体特殊性如下计算:

  • 元素內联样式规则声明,加1,0,0,0。
  • 对于选择器中给定的各个ID属性值,加0,1,0,0。
  • 对于选择器中给定的各个类属性值(class),属性选择(attribute)或者伪类,加0,0,1,0。
  • 对于选择器中给定的各个元素(element)或者伪元素,加0,0,0,1。
  • 通配符(*)的特殊性为0,0,0,0
  • 继承样式的特殊性无,并不是0,0,0,0。

从上可以得出:內联 > ID选择 > class选择|attribute选择|伪类选择 > element选择 > 通配符选择 > 继承
例如下面的例子:

h1 { color: red; } //特殊性为:0,0,0,1
p em { color: purple; }//特殊性为:0,0,0,2 因为p,em都是元素选择器,累加
.grape { color: purple; }//特殊性为:0,0,1,0
*.bright { color: yellow; }//特殊性为:0,0,1,0 因为通配符特殊性为0,0,0,0
#id216 { color: blue; }//特殊性为:0,1,0,0
p.bright   em.dark { color: maroon; }//特殊性为:0,0,2,2。2个元素,2个类
div#sidebar  *[href]  { color: silver; }//特殊性为:0,1,1,1

假如一个em元素即与上例中第2条规则匹配,又与第6条匹配,则这个em将会显示maroon颜色,因为第6条的特殊性大于第2条的特殊性。
注意:元素继承的属性的特殊性是没有的,甚至连0特殊性都没有。例如下面的例子:
* { color : gray; }
h1#page-title { color: black; }

 <h1 id="page-title"> Hello <em> http://www.snayan.com </em> </h1>

上面em内容将显示gray颜色,因为通配符(*)的特殊性为0,0,0,0;而继承h1的特殊性无。特殊性为0的规则声明 > 没有特殊性的规则声明。

重要性

有时某个声明的规则样式可能非常重要,超过了所有其他声明,则允许在这个重要的声明的结束分号之前插入!import来标识。必须正确的放置 !import,否则声明将无效。
标志为!import的声明并没有特殊的特殊性值,不过它要与非重要声明分开考虑。实际上,所有的!import声明会分组在一起,重要声明的特殊性冲突会在重要声明内部解决,而不会与非重要声明相混。类似的,我们把所有非重要声明放在一组,内部冲突内部解决。如果,一个重要声明和一个非重要声明冲突,则总是重要声明胜出。

层叠

上面讨论了用户代理(浏览器)通过特殊性值来选择为元素应用样式。但是,如果一个元素的同时匹配了特殊性值相等的2个规则,例如下面的规则声明,那将如何解决这个冲突呢?解决办法就是下面说的层叠规则了。

 h1 { color :red; }
 h1 { color: yellow; }

css层叠规则:

  1. 找出所有相关的规则,这些规则都包含与一个给定元素匹配的选择器。
  2. 按照显示权重对该元素的所有声明排序。标志!import的规则声明显示权重要高于非重要规则声明。
  3. 按照特殊性值对该元素的所有声明排序。特殊性值大的高于特殊性值小的规则声明。
  4. 按照规则声明出现的先后顺序对该元素的所有声明排序。后出现的规则声明高于先出现的规则神明。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • 简介网络浏览器很可能是使用最广的软件。在这篇入门文章中,我将会介绍它们的幕后工作原理。我们会了解到,从您在地址栏输...
    wengjq阅读 1,996评论 2 15
  • 出外,习惯了顺风车,不仅仅是为了赶时间,还是为了有可能更好的相遇,比如,你有时间去看看窗外美丽的风景,比如你或许会...
    大野泽的风阅读 1,557评论 2 8