CSS选择器的优先级

2016-02-19 21:30 1 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的CSS选择器的优先级懂设计的网友们快点来了解吧!

【 tulaoshi.com - Web开发 】

  关于CSS选择器优先级,目前国内已有很多人进行过解释,但感觉不如人意,特别对于初学者,更是难以理解。这里我把W3C上所描述的规范以我的理解再解释一下,希望能给大家提供到帮助。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

  在Calculating a selector’s specificity上的原文摘选如下:

A selector’s specificity is calculated as follows:

count 1 if the declaration is from is a ’style’ attribute rather than a rule with a selector, 0 otherwise (= a) (In HTML, values of an element’s “style” attribute are style sheet rules. These rules have no selectors, so a=1, b=0, c=0, and d=0.)
count the number of ID attributes in the selector (= b)
count the number of other attributes and pseudo-classes in the selector (= c)
count the number of element names and pseudo-elements in the selector (= d)
The specificity is based only on the form of the selector. In particular, a selector of the form “[id=p33]” is counted as an attribute selector (a=0, b=0, c=1, d=0), even if the id attribute is defined as an “ID” in the source document’s DTD.

Concatenating the four numbers a-b-c-d (in a number system with a large base) gives the specificity.

Example(s):

Some examples:

 *             {}  /* a=0 b=0 c=0 d=0 - specificity = 0,0,0,0 */
 li            {}  /* a=0 b=0 c=0 d=1 - specificity = 0,0,0,1 */
 li:first-line {}  /* a=0 b=0 c=0 d=2 - specificity = 0,0,0,2 */
 ul li         {}  /* a=0 b=0 c=0 d=2 - specificity = 0,0,0,2 */
 ul ol+li      {}  /* a=0 b=0 c=0 d=3 - specificity = 0,0,0,3 */
 h1 + *[rel=up]{}  /* a=0 b=0 c=1 d=1 - specificity = 0,0,1,1 */
 ul ol li.red  {}  /* a=0 b=0 c=1 d=3 - specificity = 0,0,1,3 */
 li.red.level  {}  /* a=0 b=0 c=2 d=1 - specificity = 0,0,2,1 */
 #x34y         {}  /* a=0 b=1 c=0 d=0 - specificity = 0,1,0,0 */
 style=""          /* a=1 b=0 c=0 d=0 - specificity = 1,0,0,0 */============

  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的优先”级。

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

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

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

 li.red.level  {}  /* a=0 b=0 c=2 d=1 - specificity = 0 , 0 , 2 , 1  */
       /*compare                                       ↑ , ↑ , √      */
 h1 + *[rel=up]{}  /* a=0 b=0 c=1 d=1 - specificity = 0 , 0 , 1 , 1  */
       /*compare                                       ↑ , ↑ , ↑ , √  */
 ul ol li.red  {}  /* a=0 b=0 c=1 d=3 - specificity = 0 , 0 , 1 , 3  */
       /*compare                                       ↑ , ↑ , √      */
 #x34y         {}  /* a=0 b=1 c=0 d=0 - specificity = 0 , 1 , 0 , 0  */
       /*compare                                       ↑ , √          */
 style=""          /* a=1 b=0 c=0 d=0 - specificity = 1 , 0 , 0 , 0  */(上表中,↑表示还要进行比较,√表示从此处已得到了结果)

  从读法中可知,只要从优先级的写法,即可知道选择器中有写什么样的结构了,如

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选择器,并会进行此组数值累加;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/webkaifa/)

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

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

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

来源:https://www.tulaoshi.com/n/20160219/1626350.html

延伸阅读
标签: Web开发
PPT:Taming CSS Selectors 作者:Nicole Sullivan 翻译:ytzong CSS 文件的大小和所引起的 HTTP 的请求数 是 CSS 性能的最关键因素 回流(reflow)和渲染时间 (非常!)没那么重要 副本(duplication)比陈旧的规则(stale rules)更糟糕 因为我们有工具处理后者 定义缺省值 不要在每处都重复编码 不好的: #weatherModule h3{co...
标签: Web开发
去年我学jQuery的时候,曾经做过一点选择器(selector)的笔记。 这几天拿出来看了一下,发现很多都忘记了。所以,我决定把它们贴在这里,方便以后查看。这对其他朋友应该也是有用的,毕竟选择器是制作网页效果的第一步。 笔记分为两个部分,今天是CSS的选择器,以后还有一部分xPath的选择器。今天的笔记中包括44个选择器,基本涵盖了CSS 2...
标签: Web开发
上节课我们讲了一下CSS通过什么方式去控制页面,如果不记得,我来帮大家回忆一下,总共有四种方式行内方式、内嵌方式、链接方式、导入方式,大家通过这四种方式就可以实现CSS对HTML页面样式的控制,如果要让这些样式对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器,HTML页面中的元素就是通过CSS选择器进行控...
标签: Web开发
前面一篇文章介绍了CSS页面布局中HTML结构化,本节讲解如何使用巧妙的使用CSS选择器。 id用于标识页面唯一元素,id的名称是控制某一内容块的手段,通过将某内容块置入div并赋予唯一的id,就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则,就可以完全...
CSS是对网页设计师可用的最强大的工具之一。使用它我们可以在几分钟内改变一个网站的界面,而不用改变页面的标签。但是尽管事实上,我们每个人也都意识到了它是有用的,CSS 选择器远未发挥它们的潜力,有的时候我们还趋向于使用过多的和无用的class、id、div、span等把我们的HTML搞的很凌乱。 避免让这些瘟疫在你的标签中传播并保持其简洁...

经验教程

787

收藏

73
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部