CSS选择器优先级

作者: 饥人谷_张磊磊 | 来源:发表于2015-12-17 16:48 被阅读187次

    今天在写京东顶部的时候,发现了对选择器的优先级从感知上的认识是错误的。因此写这篇来简单用客观的理论来比较选择器的优先级。
    先让我们看看让我发生对选择去感知上错误的栗子:

    <ul class="fr">
        <li class="spacer" ></li>
    </il>
    

    开始我认为.spacer{}优先级是高于 .fr li{},但事实证明结果与我所预料的截然相反。接下来我们将看看CSS的选择器到底是如何计算优先级的。


       解决优先级要引入一个特指度的概念(specificity),特指度表示一个css选择器表达式的重要程度。
    

    CSS样式选择器分为4个等级,a、b、c、d,可以以这四种等级为依据确定CSS选择器的优先级。
    1.如果样式是行内样式(通过Style=””定义),那么a=1
    2.b为ID选择器的总数
    3.c为Class(属性选择器、伪类选择器)类选择器的数量。
    4.d为类型选择器(伪元素选择器)的数量
    5.!important 权重最高,不在之内计算
    例如:

    选择器 特制度(a,b,c,d)
    Style= ”” 1,0,0,0
    #wrapper #content {} centered 0,2,0,0
    #content .datePosted {} 0,1,1,0
    div#content {} 0,1,0,1
    #content p {} 0,1,0,1
    p.comment .dateposted {} 0,2,1,0

    有了这样的特指度我们就能进行优先级的比较:
    selector( a , b , c , d )
    compare: ↑ , ↑ , ↑ , ↑
    selector( a , b , c , d )
    正如w3c.org中原文所示,分为a,b,c,d四组,全为正整娄,默认为0,对应于不同的选择器结构和组成形式。在选择器之间的优先级进行对比时,从左到右1对1对比,当比出有大者时即可停止比较。


    我们再回到我发生的问题的代码,.spacer{}特指度为(0,0,1,0)而.fr li{}特指度为(0,0,1,1)。经过比较我们可以发现后者的优先级的确是高于前者。
      有了具体的比较方法,我们再也不用去用感知去判断选择器的优先级了。

    最后感谢————十个流年的博客

    相关文章

      网友评论

      本文标题:CSS选择器优先级

      本文链接:https://www.haomeiwen.com/subject/osdphttx.html