zoukankan      html  css  js  c++  java
  • css选择器优先级全解析

    这样一个问题:

    1. <!doctype html>
    2. <htmllang="en">
    3. <head>
    4. <metacharset="UTF-8">
    5. <title>CSS Selectors Level</title>
    6. <styletype="text/css">
    7. .inner:not(#outer) p{color: blue;}
    8. .outer .inner p{color: orange;}
    9. </style>
    10. </head>
    11. <body>
    12. <divclass="outer">
    13. <p>outer</p>
    14. <divclass="inner">
    15. <p>inner</p>
    16. </div>
    17. </div>
    18. </body>
    19. </html>

    猜猜是什么颜色?

    蓝色。

    为什么呢?为啥:not伪类选择器的优先级会比类选择器还高?搜索了一下,发现了知乎上@一丝大大的一篇回答。

    规范中已经写的很清楚:

    count the number of class selectors, attributes selectors, and pseudo-classes in the selector (= b)

    计算选择器里面的class选择器,属性选择器,伪类选择器的个数(=b)

    在 Selectors Level 3 规范中,一个选择器的优先级(权重)由依次串联的a、b、c三个标记来计算,
    其中:

    1. ID选择器「如:#header」的个数(=a)
    2. Class选择器「如:.foo」、属性选择器「如:[class]」、伪类「如::link」的个数(=b)
    3. 标签选择器「如:h1」、伪元素「如::after」的个数(=c)
    4. 忽略「*」选择器
    5. 虽然伪类(如:hover)参与CSS优先级的计算,但是「:not」不参与计算。
    6. HTML style 属性内的优先级在CSS2.1中有描述(实际在浏览器的实现中它不直接参与优先级的计算)

    Assigning property values, Cascading, and Inheritance

    只要一个选择器的 a>0,b=0,即使另外一个选择的a=0, b=161,那么前者的权重依然更大。

    例1:

    1. a:link{
    2. color: red;/* 优先级:a=0,b=1,c=1 */
    3. }
    4.  
    5. .test{
    6. color: yellow;/* 优先级:a=0,b=1,c=0 */
    7. }

    他们的权重(优先级)b是相等的,但是c标记中,前者大于后者,所以最终「a:link」生效显示为红色。

    例2:

    1. div[class].main a{
    2. color:red;/* 优先级:a=0,b=2,c=2 */
    3. }
    4.  
    5. body div a[href]{
    6. color:blue;/* 优先级:a=0,b=1,c=3 */
    7. }

    由于属性选择器和class选择器都计算在b标记中,所以前者b=2>后者b=1,最终显示为红色。

    切记,不要把权重简单的作为10进制数字比较其大小。

    转载自:蓝飞技术部落格

  • 相关阅读:
    状态模式
    迭代器模式和组合模式
    模板方法模式
    适配器模式和外观模式
    principle06
    principle05
    命令模式
    单例模式
    工厂模式
    day38(表相关内容)
  • 原文地址:https://www.cnblogs.com/skylar/p/3757813.html
Copyright © 2011-2022 走看看