资讯专栏INFORMATION COLUMN

CSS 特殊性详解

Lucky_Boy / 1465人阅读

摘要:特殊性我们可以用很多种写法来定位一个元素,而选择器的特殊性值则是决定哪一个胜出的关键。选择器的特殊性值其实很简单,就是的形式。按照特殊性对应用到给定元素的所有声明排序。有较高特殊性的元素权重要大于有较低的特殊性的元素。

之前学CSS一直没有深入的去研究CSS选择器的优先级,这次好好的看了下之后写的时候特殊性值仿佛都浮现在眼前,现在写的时候心里更加清晰,这里梳理一下学到的东西。

特殊性(specificity)

我们可以用很多种写法来定位一个元素,而选择器的特殊性值则是决定哪一个胜出的关键。选择器的特殊性值其实很简单,就是 0,0,0,1/0,1,0,1/0,0,0,5/... 的形式。

主要有四个规则:

用了ID +0,1,0,0

用class、属性(如[id="btn1"])、伪类(如:hover) +0,0,1,0

元素和伪元素(如::before) 加0,0,0,1

结合符对特殊性没有贡献,而通配符的贡献是0,0,0,0.(所以他们对总特殊性没有影响)

那么最前面的0呢?其实这个是留给内联样式的的~所以内联样式的特殊性最高,是1,0,0,0.

接下来我们再看几个例子相信能更好地理解:

p{font-style: normal} /* 0,0,0,1 */
body div p{font-style:italic} /* 0,0,0,3 */(winner)

html > body table tr[id="totals"] td ul > li{color:maroon;} /* 0,0,1,7 */
li#answer {color: navy} /* 0,1,0,1 /* (winner)

我们注意到第二组尽管第一个的特殊性值的最后一part已经达到了7,但是还是输给了0,1,0,1.特殊性值并不是简单的进制相加和比较,而是从左向右排序的,,只要前面比你大,不管后面你是7还是77,都比你特殊性高。如1,0,0,0大于0,10,0,0.

这是从网上找到的一张图~很有意思.

最后一点则是重要声明:

p.dark{color: #333 !important;}

重要声明并没有贡献特殊性值,但是重要声明总是会覆盖非重要声明,所以我们可以把重要声明和非重要生命分为两组,非重要声明使用特殊性值来解决冲突,重要声明的冲突会在重要声明内部解决.

继承

继承很简单,后代元素样式会继承父元素的样式.
但是显然边框,盒子模型的外边距、内边距等等都是不能继承的。
继承的值不贡献特殊性,我们要注意这和0,0,0,0特殊性是有区别的.
0,0,0,0特殊性会优先于无特殊性.

*{color: gray}
h1{color: black}

css specificity

em中的字体颜色会是灰色的,因为0特殊性比继承值优先级高.

层叠

CSS其实不就叫层叠样式表嘛(cascading style sheet),所以层叠是CSS最核心的概念,而层叠其实就是结合我们前面所说的特殊性和继承做到的.
CSS的层叠规则如下:

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

按显式权重对应用到该元素的所有声明排序2)按照显式权重对应用到该元素的所有声明排序。标志!important的规则的权重要高于没有!important标志的规则。按照来源对应用到给定元素的所有声明排序。共有3种来源,创作人员,读者和用户代理。正常情况下,创作人员 > 读者模式 > 用户代理的默认样式。

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

按照出现的顺序应用到给定元素的所有声明排序。一个声明在样式表或文档中越后出现,它的权重就越大。如果样式表中右导入的样式表,一般认为出现在导入样式表中的声明在前,主样式表中的所有声明在后。

css权威指南balabala了这一大段,还是简单点来描述吧.

首先我们确定来源
读者的重要声明>创作人员的重要声明>创作人员的正常声明>读者的正常声明>用户代理声明.
(读者的声明就是用户自定义的样式,比如在设置中改变字体大小.)

然后再按特殊性排序,特殊性值高的优先级高.

如果特殊性值还是一样,那么后定义的规则优先.

总结

在实际开发过程中,我们可能只需要知道内联样式>id>class即可,如果特殊性相同,后定义的规则优先.

参考书籍: 《CSS: The Definitive Guide》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111440.html

相关文章

  • 带你走进CSS定位详解

    摘要:相对于其最近的一个定位设置的父对象进行绝对定位,可用。代码基本语法默认值,无特殊定位。代码相对定位相对定位生成相对定位的元素,相对于其它位置进行定位。结语结语带你走进定位详解,多试试,熟能生巧嘛 学习CSS相关知识,定位是其中的重点,也是难点之一,如果不了解css定位有时候都不知道怎么用,下面整理了一下关于定位属性的具体理解和应用方案。 一:定位 定位属性列表 position top...

    googollee 评论0 收藏0
  • 详解 CSS 属性 - 伪类和伪元素的区别

    摘要:之前写了一篇详解属性的博文,当时自己没分清楚伪元素和伪类,所以在文章内把概念混淆了,庆幸兄指正了我的错误,所以今天打算好好研究下两者的区别。伪元素用于将特殊的效果添加到某些选择器。伪类种类伪元素种类区别这里用伪类和伪元素来进行比较。 之前写了一篇 《详解 CSS 属性 - :before && :after》 的博文,当时自己没分清楚伪元素和伪类,所以在文章内把概念混淆了,庆幸 @ri...

    jiekechoo 评论0 收藏0
  • 详解 CSS 属性 - 伪类和伪元素的区别

    摘要:之前写了一篇详解属性的博文,当时自己没分清楚伪元素和伪类,所以在文章内把概念混淆了,庆幸兄指正了我的错误,所以今天打算好好研究下两者的区别。伪元素用于将特殊的效果添加到某些选择器。伪类种类伪元素种类区别这里用伪类和伪元素来进行比较。 之前写了一篇 《详解 CSS 属性 - :before && :after》 的博文,当时自己没分清楚伪元素和伪类,所以在文章内把概念混淆了,庆幸 @ri...

    AZmake 评论0 收藏0
  • 详解 CSS 属性 - 优先级问题

    摘要:当你将一个样式添加到元素上却发现不起作用时,那就是遇到优先级问题了。那么应该如何处理优先级问题呢,下面我总结了一些解决优先级问题的常用法则。如内部样式外部样式内联样式此时显示的优先级是。 当你将一个样式添加到元素上却发现不起作用时,那就是遇到优先级问题了。那么应该如何处理 CSS 优先级问题呢,下面我总结了一些解决 CSS 优先级问题的常用法则。 样式距离 我们可以通过使用外部样式...

    ZoomQuiet 评论0 收藏0
  • CSS优先级详解

    摘要:优先级是由选择器组成的匹配规则决定的。这些继承的样式的优先级永远低于元素本身的样式,包括通用选择器最终的颜色是红色的。永远都要优先考虑使用样式规则的优先级来解决问题而不是。 概念 浏览器是通过判断优先级,来决定到底哪些属性值是与元素最相关的,从而应用到该元素上。优先级是由选择器组成的匹配规则决定的。 如何计算? 优先级是根据由每种选择器类型构成的级联字串计算而成的. 它不是一个对...

    Juven 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<