首页 > 技术文章 > 转:CSS选择器优先级

shanheshui 2015-11-20 14:38 原文

CSS样式选择器分为4个等级,a、b、c、d,可以以这四种等级为依据确定CSS选择器的优先级。

1.如果样式是行内样式(通过Style=””定义),那么a=1

2.b为ID选择器的总数

3.c为Class类选择器的数量。

4.d为类型选择器的数量

5.属性选择器,伪类选择器和class类选择器优先级一样,伪元素选择器和类型选择器一样

6.!important 权重最高,比 inline style 还要高

 

选择器

特殊性 (a,b,c,d)

Style= ””

1,0,0,0

#wrapper #content {}

0,2,0,0

#content .datePosted {}

0,1,1,0

div#content {}

0,1,0,1

#content p {}

0,1,0,1

#content {}

0,1,0,0

p.comment .dateposted {}

0,0,2,1

div.comment p {}

0,0,1,2

.comment p {}

0,0,1,1

p.comment {}

0,0,1,1

.comment {}

0,0,1,0

div p {}

0,0,0,2

p {}

0,0,0,1

 

CSS优先级的读法

这里先更正一些错误的读法。通过百度搜索到的内容中,通常出现这样的写法:(1,0,0,0),但有部分文章对它的解释不全面,有的甚至有误。

其中最大的一个错误就是把结果加:(1,0,0,0)=1000,(0,0,2,2)=22,更有甚者:(0,1,0,1)=0+1+0+1=2!虽然这些理解在很简单的情况下看上去是正确的,但本质上却是个重大的错误。

另外有部分文章把它理解为4个级别,也相近,但不能把条理分清楚,理解起来也难。

    “CSS优先级包含四个级别(文内选择符,ID选择符,Class选择符,元素选择符)以及各级别出现的次数。根据这四个级别出现的次数计算得到CSS的优先”级。

这句话总结得很好,但对初学者来说,在理解方面就有点难度了,“四个级别”,太容易混淆,其实应该是“四组级别”。

我认为,对优先级的读法,应该是以“组”来分,这个组之间相互独立,从左到右进行对比。它们成组出现,以逗号分隔。

 

再有,只要正确书写,仅从优先级中大概知道选择器结构形式了,如:

1,0,0,0表示是元素内的style;

0,2,1,1表示是一个由两个ID选择器,1个类或伪类或属性选择器,以及一个元素选择器组成的选择器。

 

CSS优先级规则的细节:

在纠正读法后,才能开始讲详细的规则:

    * a组数值只有把CSS写进style属性时才会为1,否则为0.写进style的样式声明其实不算是个选择器,所以这里面的b,c,d组值均为0,只有真正的选择器才会有b,c,d组值。

    * b组数值决定于ID选择器#ID,有多少个ID选择器,并会进行此组数值累加;

    * c组数值决定于类、伪类和属性选择符,并会进行该组数值累加;

    * d组数值决定于元素名,即元素选择器,并会进行该组数值累加;

注意,这四组数值分别对应于不同类型的选择器,互不影响,根据读法法则进行比较。

 

CSS优先级包含四个级别

  1. 标签内定义样式
  2. ID选择符
  3. Class选择符
  4. 元素选择符

CSS优先级的计算规则

类型计算规则
元素标签中定义的样式(Style属性) 加1,0,0,0
每个ID选择符(如 #id) 加0,1,0,0
每个Class选择符(如 .class)、每个属性选择符(如 [attribute=])、每个伪类(如 :hover) 加0,0,1,0
每个元素选择符(如p)或伪元素选择符(如 :firstchild)等 加0,0,0,1
其它选择符包括全局选择符*, 不过这也是一种specificity。 加0,0,0,0,相当于没加
  1. 然后,将这四个数字分别累加,就得到每个CSS定义的优先级的值
  2. 从左到右逐位比较大小,数字大的CSS样式的优先级就高。

注意

  1. !important声明的样式优先级最高,如果冲突再进行计算。
  2. 如果优先级相同,则选择最后出现的样式。
  3. 继承得到的样式的优先级最低。

 

 

 

 

 

更多,参考:

http://blog.sina.com.cn/s/blog_87728451010181pm.html

http://www.cnblogs.com/rainman/archive/2011/08/17/2142767.html

推荐阅读