Selector權重

权重决定了哪一条规则会被浏览器应用在元素上。

每条选择器的规则都有其权重,权重大的会覆盖掉权重小的,很多CSS出现问题的场景,都是某处定义了一个更高权重的规则,导致此处规则不生效。


依照权重的级别根据选择器被划分为四个分类:

1) 行内樣式 (style)

<h1 style="color: #fff;">header</h1>

2) id

指#ID。Id选择器的权重比属性选择器更高, 你可以使用id来增大权重;

3) 類與属性

这一类包括各种class,属性选择器,伪类选择器。
伪类选择器比如 :hover,:focus等
类选择器比任意数量的元素选择器都高

4) 元素 (element)

这一类包括元素跟伪元素选择器, 伪元素选择器比如:before 与 :after

伪元素选择器只包含以下几种:

偽元素選擇器 說明
::after element 之後
::before element 之前
::first-letter --
::first-line 作用于你前面元素选择器确定的一个元素的第一行
::selecton --

補充

伪元素跟伪类都是选择器的补充,區別為:

  • 伪类:
    • 表示的是一种状态比如hover,active等等,
  • 伪元素:
    • 表示文档的某个确定部分的表现,比如::first-line 伪元素只作用于你前面元素选择器确定的一个元素的第一行。
    • 选择出来的部分 不在dom里,也不能对其绑定事件。如果你对伪元素前面的选择器定义的元素绑定了事件,伪元素同样会生效。永远记得 伪元素生成的是“表现”。
    • 參考: (1) w3c规范中的伪元素、(2) 如何给伪元素绑定事件

Selector權重(優先程度)

整理權重規則如下

主要的规则:

id选择器 > 类,属性选择器和伪类选择器 > 元素和伪元素

样式所在位置的影響:

内联样式(标签内style形式) > style标签 > link标签。

!improtant:

凡是属性值后加上了!important,那么它的值不会被其他值替换。

权重的基本规则

  1. 相同的权重:以后面出现的选择器为最后规则:

    假如在外部样式表中,同一个CSS规则你写了两次,那么出现在前面的选择器权重低,你的样式会选择后面的样式:

    #content h1 {
     padding: 5px;
    }
    #content h1 {
     padding: 10px;
    }
    

    两个选择器的权重都是0,1,0,1,最后那个规则生效。

  2. 不同的权重,权重值高则生效 选择器可能会包含一个或者多个与权重相关的计算点,若经过计算得到的权重值越大,则认为这个选择器的权重高。详细参阅【Understanding Specificity

權重的計算

权重计算测试

01. *{}                         ====》0
02. li{}                        ====》1(一个元素)
03. li:first-line{}             ====》2(一个元素,一个伪元素)
04. ul li {}                    ====》2(两个元素)
05. ul ol+li{}                  ====》3(三个元素)
06. h1+ *[rel=up] {}            ====》11(一个属性选择器,一个元素)
07. ul ol li.red{}              ====》13(一个类,三个元素)
08. li.red.level{}              ====》21(两个类,一个元素)
09. style=""                    ====》1000(一个行内样式)
10. p {}                        ====》1(一个元素)
11. div p {}                    ====》2(两个元素)
12. .sith {}                    ====》10(一个类)
13. div p.sith{}                ====》12(一个类,两个元素)
14. #sith{}                     ====》100(一个ID选择器)
15. body #darkside .sith p {}   ====》112(1+100+10+1,一个Id选择器,一个类,两个元素)
  1. 扑克牌权重计算法

    如果你之前没有编程经验,css让你看得比较晕,这个比喻可以帮你把一些概念弄得更清楚。

    把css规则作为你手中的牌,最好的一套牌决定了你最终的样式。

  2. Understanding Specificity Tutorial

    在这个教程中,你会关注权重。

    css权重关系到你的css规则是怎样显示的。你样式表中的每条css规则都带有一个权重,这个权重级别是由不同的选择器加权计算的,通过权重,不同的样式最终会作用到你的网页中。

  3. Cascade Inheritance: Specificity

    这里会对权重问题进行一番讨论。

    这些规则不仅仅存在于一张样式表中,也有可能是多张样式表。首先要明白,一个元素可以被多个规则定义样式。

  4. CSS 2.1 Selectors Explained

    对css2.1选择器的一个全面的阐述。

    通过详尽的了解css2.1的选择器,可以很大程度上优化你的html,比如减少不必要的class属性,增加大量的div或者span标签等。

  5. CSS Specificity Bugs in IE

    Ie中权重bug的一个简短概述

  6. CSS Structure and Rules

    基本的css语法,伪类及伪元素,还有层叠规则。

  7. Specificity

    他看上去不怎么重要,你也可能一直用不上,但是在大的项目中,你的CSS文件变得越来越大,那么这个时候你的CSS就有可能会产生冲突。


參考

你应该知道的一些事情——CSS权重

results matching ""

    No results matching ""