- 浏览: 1461824 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
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的优先”级。
这句话总结得很好,但对初学者来说,在理解方面就有点难度了,“四个级别”,太容易混淆,其实应该是“四组级别”。
我认为,对优先级的读法,应该是以“组”来分,这个组之间相互独立,从左到右进行对比。它们成组出现,以逗号分隔。
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 */
(上表中,↑表示还要进行比较,√表示从此处已得到了结果)
其实这里就像个奥运金牌榜,到我修改文章为止(2008-08-12),我国以13金领先,详细如下:
1 中国 13 3 4
2 美国 7 6 8
3 韩国 5 6 1
4 意大利 3 4 2
.
再有,只要正确书写,仅从优先级中大概知道选择器结构形式了,如:
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的时候,由于经常使用到很长的多级选择器,而碰到一些样式被覆盖或者覆盖不了的情况是相当的郁闷,所以专门花了一些时间对一些选择器做了对比测试。这里先说明一下,由于ie6不支持css2.0选择器,所以这些测试忽略了一些2.0的选择器和连接符,如伪类(:hover),属性 ([type=”text”]),子选择符(>)等,仅对#id,.class,tag和空格连接符测试。
定义:
1. CSS句子:一个完整的选择器构成一个CSS句子,如.abb #cd div.class。而用逗号连接的算作多个句子的省略定义方法。
2. CSS单词:CSS句子中任何一个#id或.class或tag都算作一个CSS单词,虽然照以前的理解一般把tag#id.class1.class2整个看作一个单词,但是在本文讨论范围内,这个只能算作一个由4个单词组成的词组。
3. 优先级:对于选择到同一个元素的两个CSS句子,当他们定义该元素的同一个属性时,如果其中一个写在前而不会被写在后面的覆盖这个属性,那么就称这个CSS句子的优先级高于另一个。而当2个CSS句子互相调换在代码中的位置都是后面的覆盖前面的属性时,称这两个CSS句子有相同的优先级。
测试用dom:
<html id="html" class="html"> <body id="body" class="body"> <div id="div"> <div id="test1" class="test test1">1第一行<br>第二行<br>自身</div> <div id="test2" class="test test2">2第一行<br>第二行<br>自身</div> <div id="test3" class="test test3">3第一行<br>第二行<br>自身</div> <div id="test4" class="test test4">4第一行<br>第二行<br>自身</div> <div id="test5" class="test test5">5第一行<br>第二行<br>自身</div> <div id="test6" class="test test6">6第一行<br>第二行<br>自身</div> <div id="test7" class="test test7">7第一行<br>第二行<br>自身</div> <div id="test8" class="test test8">8第一行<br>第二行<br>自身</div> </div> </body> </html>
这里先给出8组选择器,每组两个,各位同学可以先想一想每组里面哪个选择器的优先级高:
<style> /*第1组*/ #test1{height:2em;} .test1{height:1em;} /*第2组*/ .body #test2{height:1em;} #test2{height:2em;} /*第3组*/ div .test3{height:2em;} #test3{height:1em;} /*第4组*/ .body #test4{height:2em;} body #test4{height:1em;} /*第5组*/ html #test5{height:2em;} body #test5{height:1em;} /*第6组*/ #body #test6{height:1em;} .html #test6{height:2em;} /*第7组*/ html #body #test7{height:1em;} .html .body #test7{height:2em;} /*第8组*/ #html.html .body #test8{height:1em;} .html #body.body #test8{height:2em;} </style>
现在公布答案:
1. 仅一个选择器单词的时候#id高于.class应该不用说了;
2. div#test2比#test2多了一个单词,那么多一个单词的优先级高,这里可以暂时理解成多一个单词就选择的更精确;
3. 同样多一个单词,但其中一个有#id选择,则#test3要高于div .test3;
4. .body #test4高于body #test4,暂时可理解为同样多层级时,.class高于tag;
5. html #test5与body #test5有同样的优先级,先写的会被覆盖,这里猜测同样的层级数,优先级与层级跨越的深度无关;
6. #body #test6高于.html #test6,理解为#id优于.class也与层级深度无关;
7. 最后两个比较有难度了,但浏览器下的结果是html #body #test7高于.html .body #test7,怎样理解我先不说;
8. #html.html .body #test8与.html #body.body #test8同级。
其实越到后面,应该越是能看出一种模糊的规则来。经过我反复的分析,最终从模糊的感觉中发现了其中的奥秘,或者说是一种说得通的解释:
把css句子的单词组成定义为“数位”,像个十百位的数字一样,css中不同的单词代表不同的权重数位,分别是#id,.class,tag三个数位依次从高到低排列,组成了相当于十进制数字的百位,十位,个位。再把每个css句子中个各种单词的个数代入到刚刚划分的数位里,就可以得到一个类似于十进制数字的三位数,只是在css的优先级数位里,没有进位的概念,无数个低位单词也还是低于一个高位的单词。从而结论就是,按#id,.class,tag的数位统计了css的单词个数并代入各个数位后,只要比较两个css数字的大小(从高位到低位依次比较),就能得出两个css的优先级。
用这个规则重新比较一遍前面的例子:
1. 1,0,0>0,1,0
2. 1,1,0>1,0,0
3. 0,1,1<1,0,0
4. 1,1,0>1,0,1
5. 1,0,1=1,0,1
6. 2,0,0>1,1,0
7. 2,0,1>1,2,0
8. 2,2,0=2,2,0
用这个方法很容易就能比较出最后两组例子的优先级,对于前述的一些情况也可以做出合理的解释,所以在没有更好的css选择器解释方法之前,这个数位计算法是非常方便且容易理解的。
评论
#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 */
a=0 和 a=1应该已经出结果了,为什么还要比较b组呢?
发表评论
-
cubic-bezier 模拟实现
2013-01-05 16:34 14091cubic-bezier 曲线是 css3 动画的一个重要基石 ... -
css reset revisit
2012-07-25 00:32 4244正如 javascript 兼容库的作用, css r ... -
兼容 ie 的 transform
2012-02-23 14:00 6428css 2d transform 是 css3 引入的一个新的 ... -
write html parser
2011-12-01 02:48 2918首先需要声明 html 不能用正则表达式来直接匹配进行内容抽取 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2847简介 如果你经 ... -
fixed 定位 auto 问题
2010-12-02 11:58 2107当一个元素被 fixed 定位 ... -
css的优先级与继承
2010-11-08 12:30 3715起因: 很早就听 ... -
浏览器渲染
2010-10-12 21:07 0http://snook.ca/archives/html_a ... -
背景图样式回顾
2010-09-30 13:51 1790正式点叫 background-image recap ,最近 ... -
mhtml datauri 与 css expression
2010-09-29 18:17 2396mhtml ,datauri ,css expressio ... -
margin合并整理
2010-06-23 11:25 4196多个段落为了美观,浏览器会将它们的垂直距离变得统一,这是一种很 ... -
编写跨浏览器兼容的 CSS 代码的金科玉律
2010-06-09 13:26 0作为 Web 设计师,你的 ... -
图片优化 and dataURI and mhtml for ie<8
2010-04-28 10:00 0http://www.phpied.com/data-uris ... -
W3C XML Schema 与文档类型定义 (DTD) 比较
2010-02-01 23:50 0http://www.ibm.com/developerwor ... -
xtml与html
2010-02-01 23:26 0HTML与XHTML 二者有什么区别,你觉得 ... -
获取css属性计算值问题
2010-01-29 23:11 3803都知道标准浏览器可以用 getComputedStyle 以及 ... -
垂直居中问题解释整理
2009-12-06 01:19 2294垂直居中曾经很热的话题,也转过网络一些好的解决方案: ... -
有趣的z-index
2009-12-01 00:25 2848实践 : 注:firefox 示例1 ... -
css列布局整理
2009-11-27 01:14 1701对一些经典的布局进行整理,以及修改去除不必要的hack,兼容 ... -
ebay ppt.rar
2009-11-18 15:23 0ebay ppt.rar
相关推荐
理解CSS选择器优先级是编写高效、可维护CSS代码的关键。以下是关于CSS选择器优先级的一些详细说明: 首先,CSS选择器的优先级由四个部分组成,每个部分对应一个权重值: 1. ID选择器(#id):每个ID选择器的权重为...
CSS选择器优先级详解 CSS选择器优先级是CSS样式表中一个非常重要的概念,它决定了CSS样式的应用顺序和优先级。本文将详细介绍CSS选择器优先级的四大原则,以及它们之间的关系和应用。 原则一:继承不如指定 如果...
本文将详细解析CSS选择器优先级的实战应用,帮助开发者理解并解决样式覆盖的问题。 首先,我们要了解CSS选择器的四种基本类型,它们的优先级顺序如下: 1. **行内样式 (inline styles)**:这是最高优先级,通过`...
本文将深入探讨CSS选择器优先级,通过八个实例来帮助你更好地理解这个概念。 首先,我们要明确一点,类的覆盖顺序并不取决于它们在HTML中的引用顺序,而是取决于它们在CSS文件中定义的顺序。例如,如果有两个类选择...
掌握CSS选择器优先级对于精确控制网页样式和解决样式冲突至关重要。在编写CSS时,应尽量避免使用!important,因为它降低了代码的可读性和可维护性。合理运用选择器和优先级,可以使CSS代码更加简洁高效。
声明在样式表或文档中越靠后出现,权重越大。如果样式表中有通过 @import 导入的样式表,一般认为出现在导入样式表中的声明在前,主样式表的所有声明在后。
通过使用组合器(Combinator)将选择器的描述写得更加精确(参考CSS选择器 – MDN ),例如对于下述代码片段,如果想给.cellphones中的.apple增加样式,只使用.apple,势必会对.fruit中的.apple也造成影响。...
以下是关于CSS选择器权重计算及优先级的详细解释: 首先,我们要了解CSS选择器的四个等级及其对应权重: 1. **内联样式**(权重1000):这是最高级别的权重,当直接在HTML元素中使用`style`属性定义样式时,例如`;...
id选择器的优先级高于类选择器和元素选择器。 4. 类(属性、伪类)选择器 类选择器用于选择具有特定class的元素。例如:.header{ display:none;} <div class="header"></div>。 属性选择器用于选择具有特定属性的...
CSS选择器优先级 CSS选择器的优先级决定了当多个规则冲突时,哪些规则会胜出。优先级的高低通常由选择器的特异性决定,特异性越高,优先级越高。特异性由选择器的类型和数量决定,以下是优先级从低到高的顺序: 1....
选择器优先级是指不同类型的CSS选择器在样式冲突时所具有的优先顺序。按照优先级从高到低排序如下: - 内联样式(style属性):权值为1000 - ID选择器:权值为100 - 类选择器(class)、属性选择器、伪类:权值为10...
了解并熟练运用CSS选择器优先级顺序,可以帮助开发者更精确地控制元素的样式,避免不必要的样式冲突,从而提高代码的可读性和维护性。在实际开发中,尽量减少对 `!important` 的依赖,因为它会使代码难以管理和调试...
在CSS选择器的体系中,存在多种不同类型的选择器,每种都有其特定的用途和使用场景。 首先,元素选择符是最基本的类型,包括通配符选择器、标签选择器、id选择器和class选择器。通配符选择器用“*”表示,可以选中...
CSS选择器的权重分为四类:内联样式、ID选择器、类选择器/属性选择器/伪类、以及元素选择器/伪元素。它们对应的权重分别是: 1. 内联样式(如`style="..."`):1000 2. ID选择器(如`#example`):100 3. 类选择器/...
6. **选择器优先级** 在React组件中,理解CSS选择器的优先级至关重要。内联样式(style属性)的优先级最高,接着是ID选择器,然后是类选择器、属性选择器和元素选择器。合理利用优先级可以更好地控制组件的样式覆盖...
CSS 选择器优先级是指不同的选择器组合的优先级顺序。常用的优先级顺序有: * `!important`:最高优先级 * `inline style`:内联样式优先级 * `ID 选择器`:ID 选择器优先级 * `类选择器`:类选择器优先级 * `元素...
CSS选择器优先级得关系为: !important>内联>ID选择器>类选择器>标签选择器。 一种优先级算法 内联样式表的权值最高 (style=””) 权值为1000 统计选择符中的ID属性个数。(#id) 权值为100 统计选择符中的CLASS属性...
* CSS 选择器优先级是指 CSS 选择器的优先级顺序,高优先级的选择器将覆盖低优先级的选择器 * CSS 选择器优先级的计算方式是:内联样式 > ID 选择器 > 类选择器 > 标签选择器 * CSS 选择器优先级可以通过使用 !...