`
deng131
  • 浏览: 661698 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

CSS 选择器的权重优先级

阅读更多
<style>
a {
  border-bottom: 0px;
  color: #5DB0E6;
}
a:focus {
  outline: 1px dotted #eee;
}
a:active {
  outline: 0px;
}
a:hover {
  color: #7bc4f4;
}
body#jq-interior {
  background-image: url(http://static.jquery.com/files/rocker/images/bg-interior-tile-drk.jpg);
}
</style>

上面这个样式表是由一个个样式规则组成,而每一个样式规则又可以分为两部分:选择符与声明。选择符就相当于jQuery的选择器,能针对特定元素进行设置。CSS有名叫层叠样式表,基本上被选中的元素的子元素能继承它的样式,但其子元素如果设置了样式,也能覆写它,就像板页岩这样累在一起。随着布局表格这样落后的布局方式的式微,CSS越来越受到人们的重视。但IE6对CSS的支持不足与各种层不穷的bug,或者是某些大型网站对CSS的不合理使用,CSS的体积膨胀起来了。维护它们可是一件麻烦事,如何让元素显示出想要的样式,我们就必须对权重这个概念有所了解。权重你可以说是针对样式规则的,也可以说针对选择符。之所以这样说,因为有一个重要的标识符! important可以放到样式声明的最后,用来无视本文重点说的权重等级。我觉得最好还是不要用这东西,首先IE6对它支持不好,要支持它需要把一个样式规则分开写,另,用多了会严重扰乱CSS的权重等级。

有关CSS权重等级的介绍最早见于W3C这篇文章,听说IE5 是最早支持CSS的,不知哪个早一点呢?很明显IE是没有完全照足它来实现。在《Calculating a selector's specificity》一章,它粗略地用a、b、c、d来对样式规则进行评估,给出每一个的得分(1 或 0),但没有给出最终值的计算方式。

    * a:如果这个元素应用了行内样式,它才分配此值为1。怎么是行内样式呢?就是标签内使用style="...."的方式来设置样式,我觉得这是很愚蠢的行为,徒然增加页面的体积,也非常不好维护,和使用那些纯表示样式的元素差不多,如big、small、b、u、strike 等等。这样做法,我个人觉得,浏览器其实是为它分配了一个特别的ID(实质上IE也是为页面上每个元素分配了一个uniqueId),然后把它置于样式表的最下方,于是就没有其他样式能覆盖它了。

    * b:指一个样式规则的选择符存在id选择器。比如上面的body#jq-interior ,不过这样有点累赘了。我看了许多CSS选择器的实现,还有我在做选择器的经验,body完全没有必要。一个选择符就相当于一个选择器群组,它由各种各样的选择器组成。选择器得到一个符合CSS选择符结构的字符串,如果它足够聪明的话,会先对字符串进行trim操作,然后进行扫描,看有没有id选择器,有的话会砍掉前面的部分,然后再用正则对其进行肢解……换言之,id选择器具有强烈的排它性,只有并联选择器可以容忍它。

    * c:指一个样式规则的选择符是否存在类选择器与伪类选择器(:hover,:link,:active,:target)。这些基本上 CSS2.1的东西,CSS3增加的基本是结构伪类还有一个selection伪元素,没有破坏这个评分体系。
    * d:这个权重最低了,指选择符里存在标签选择器,与伪元素。何为伪元素呢?前面有::的东西就是伪元素了。注意,早期的伪元素也和伪类一样,只有一个冒号。这可能是后来w3c心血来潮,把它们分离出来(css3规范),造成今天的样子。

虽然到目前为止,我们已经知道a的权重肯定大于b,而b大于c,d最小,但这实在不好计算,对于接着下来的示例也不好解说。于是我引进外国另一个补充方案,它出于这篇名叫《CSS: Specificity Wars》的有才文章。。它把abcd当成算术上的个、十、百、千这样的计数单位,各自相乘最后一加,优先级就一目了然。

好了,我们开始分析一下w3c的示例,看它能给我们什么多余的信息。
/*by 司徒正美 All rights reserve*/
*             {}  /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */
/* 通配符选择器权重为0,在IE中,它无法区分元素节点与注释节点 */
li            {}  /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */
/* 标签选择器为1 */
li:first-line {}  /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */
/* 标签选择器与伪元素为1 */
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 */
/* 这个相邻选择器由标签选择器与属性选择器组成,属性选择器为10 */
ul ol li.red  {}  /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */
/*无视后代选择器,3个标签与1个类选择器,类(className)在DOM中的位置比较显赫,
拥有专门的getElementByClassName,等级为c,合计得分13 */
li.red.level  {}  /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */
/*两个类选择器与一个标签选择器,合计得分21 */
#x34y         {}  /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */
/*getElementById,在页面上获得元素最快的方式,权重为b,得分100 */
style=""          /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
/*行内样式,得分1000,会覆盖内部样式或外部样式的设置*/

最后总结一下,十大选择器与伪元素的权重情况:

选择器 表达式或示例 说明 权重
ID选择器 #aaa 100
类选择器 .aaa 10
标签选择器 h1 元素的tagName 1
属性选择器 [title] 详见这里 10
相邻选择器 selecter + selecter 拆分为两个选择器再计算
兄长选择器 selecter ~ selecter 拆分为两个选择器再计算
亲子选择器 selecter > selecter 拆分为两个选择器再计算
后代选择器 selecter selecter 拆分为两个选择器再计算
通配符选择器 * 0
各种伪类选择器 如:link, :visited, :hover, :active, :target, :root, :not等 10
各种伪元素 如::first-letter,::first-line,::after,::before,::selection 1
分享到:
评论

相关推荐

    CSS选择器权重计算及优先级

    介绍CSS中,单个选择器,以及复合选择器的权重计算规则,比如: .box #mydiv ul li.txt。通过计算选择器的权重,区别其优先级,判 断最终样式的覆盖效果。

    彻底弄懂CSS选择器以及优先级

    CSS选择器优先级得关系为: !important&gt;内联&gt;ID选择器&gt;类选择器&gt;标签选择器。 一种优先级算法 内联样式表的权值最高 (style=””) 权值为1000 统计选择符中的ID属性个数。(#id) 权值为100 统计选择符中的CLASS属性...

    CSS中选择器的权重值的计算

    CSS 选择器权重值 CSS 具有自己的优先级计算方法,而不仅仅是行间&gt;内部&gt;外部、ID&gt;class&gt;元素 1. 样式类型 行间样式 我的行间CSS样式。 内联样式 &lt;style type="text/css"&gt; h1{font-size:12px; color:#000; ...

    css选择器和基本样式

    基本样式和选择器(权重优先级)以及复合选择器

    举例详解CSS中的的优先级

    优先级是根据由每种选择器类型构成的级联字串计算而成的。他是一个对应匹配表达式的权重。 如果优先级相同,靠后的 CSS 会应用到元素上。 注意:元素在文档树中的位置是不会影响优先级的优先级顺序 优先级逐级增加的...

    ylsislove#make-a-little-progress-every-day#前端-CSS选择器优先级1

    声明在样式表或文档中越靠后出现,权重越大。如果样式表中有通过 @import 导入的样式表,一般认为出现在导入样式表中的声明在前,主样式表的所有声明在后。

    3一面 3:CSS-HTML 知识点与高频考题解析.md

    CSS 选择器有很多,不同的选择器的权重和优先级不一样,对于一个元素,如果存在多个选择器,那么就需要根据权重来计算其优先级。 权重分为四级,分别是: 1. 代表内联样式,如`style="xxx"`,权值为 1000; 2. ...

    浏览器如何判断css优先级

    优先级是由选择器组成的匹配规则决定的。 如何计算?优先级是根据由每种选择器类型构成的级联字串计算而成的. 它不是一个对应相应匹配表达式的权重值. 如果优先级相同,元素最终会应用 CSS 中靠后的声明. 注意: 在文档...

    详解CSS中的选择器优先级及样式层叠问题解决

    CSS中的选择器是分权重的,如果不加注意则很有可能会遇到样式层叠的问题,下面我们就来详解CSS中的选择器优先级及样式层叠问题解决,需要的朋友可以参考下

    CSS优先级的两种理解方式

    优先级就是分配给指定的 CSS 声明的一个权重,它由 匹配的选择器中的 每一种选择器类型的 数值 决定。 而当优先级与多个 CSS 声明中任意一个声明的优先级相等的时候,CSS 中最后的那个声明将会被应用到元素上。 当同...

    CSS中提升优先级属性!important的用法问题总结

    选择器{样式:值!import;} 二、说明 提升指定样式规则的应用优先权,即!important为开发者提供了一个增加样式权重的方法,让浏览器首选执行这个语句。 例如下面这个样式: div{ margin-left:20px!important; ...

    css-selector-demo

    样式表按照它们编号的顺序出现,所以后面的具有相同选择器权重的表将覆盖前面的表。 关于如何进一步发展的想法:。 id 选择器。 重要标签。 直接用户编辑样式表。 更好的造型我很想知道这个项目是否对您有用,或者...

    CSS权重关系及问题剖析

    看到过一篇关于 CSS 的文章,其中说到:对于类似 li#first 这样的选择器,由于使用 id 就已经可以确定元素了,没有必要再写上前面的 li, 直接写上 #first 这样的 id 选择器就可以了。听起来说得不错,简单测试一下...

    CSS2中从优先权重的计算方式来辨别下CSS

    关于W3C标准中的计算 是将CSS的选择器分为四组 即 a b c d 每一个样式的缩写就成了 CSS{a,b,c,d} a表示内联样式 b是Id选择器 c是类元素 伪类以及其他一切非元素对象 d是元素 再确定哪条一条样式起作用的时候 参照的...

    CSS:相同元素不同结构重复定义的问题

    CSS选择器是构建CSS的基础.在为大型,复杂嵌套的(x)HTML文档进行样式定义时,很有可能会遇上针对相同元素在不同结构下的重复定义的问题,这个问题也是前端开发人员相对头痛的问题. 在这种情况 (针对相同元素在不同结构...

    CSS层叠样式表的层叠是什么意思(自我理解)

    解答一: 层叠指的是样式的优先级,当产生冲突时以优先级高的为准。...CSS层叠是指CSS样式在针对同一元素配置同一属性时,依据层叠规则(权重)来处理冲突,选择应用权重高的CSS选择器所指定的属性

    web前端面试指南和高频考题解析,大厂员工整理,pdf和md版本都

    css,html,es,算法等,- 选择器的权重和优先级 - 盒模型 - 盒子大小计算 - margin 的重叠计算 - 浮动`float` - 浮动布局概念 - 清理浮动 - 定位`position` - 文档流概念 - 定位分类 - fixed 定位特点 - 绝对...

    浅谈CSS层叠机制

    css中为什么要有层叠机制 因为在css中可能会有多个样式同时影响同一个元素的某个属性,层叠机制可以解决作者(写代码的人),用户(浏览页面的人)和用户代理(一般指浏览器)的样式冲突。 在层叠中每个样式规则都有...

Global site tag (gtag.js) - Google Analytics