我们在写网页的时候经常会遇到同一个HTML文件,使用了外部样式、内部样式以及内联样式,那么如果发生冲突时浏览器是怎么抉择的呢?
也会遇到这样的情况,在样式表中,对同一个HTML元素,我们有可能既用到了class,又用到了id,还有继承自父元素的样式,那么如果发生冲突时浏览器又怎么表现呢?
所谓多重样式,指的是对于相同的HTML元素在三种样式表中都存在样式效果的时候的样式覆盖问题。对于多重样式,也就是三种样式表都存在的情况下,一般来说它们的优先级是:
(外部样式)External style sheet <(内部样式)Internal style sheet <(内联样式)Inline style
但是会有一种情况是,如果外部样式表的引入位置在内部样式的后面,也即外部样式表更接近HTML元素,那么外部样式表中的样式会覆盖内部样式表中相同元素的样式。也就是说,如果是对相同的的HTML元素进行样式编辑,在HTML文档流中距离HTML元素近的会覆盖距离HTML元素远的。
1 <head>
2 <style type="text/css">
3 /* 内部样式 */
4 h1{color:green;}
5 </style>
6
7 <!-- 外部样式 style.css -->
8 <link rel="stylesheet" type="text/css" href="style.css"/>
9 <!-- 设置:h1{color:blue;} -->
10 </head>
11 <body>
12 <h1>Test</p>
13 </body>
上面代码中,Test会显示为蓝色。若将外部样式和内部样式交换位置,则Test将显示为绿色。
确定了样式表的优先级之后,也就是确定了使用那个样式表中的样式之后,还有一个问题,就是,如果在同一个样式表中,对同一个HTML元素,分别用其id、class、tagName定义了样式,且样式还不相同,那么浏览器会怎么选择呢?这就是接下来要说的选择器的优先级。
Css选择器优先级计算规则:
根据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,相当于没加 |
然后,将这四个数字分别累加,就得到每个CSS定义的优先级的值,从左到右逐位比较大小,数字大的CSS样式的优先级就高。
有些人直接就说,内联的加1000,id的加100,class的加10, tag的加1,虽然在结果上是一致的,但是这种说法还是不够有说服力的。
这里需要注意几点:
为了更好的理解这些计算规则,举些例子如下:
选择器 | 计算结果 |
---|---|
* { } | 0 |
li { } | 1 (one element) |
li:first-line { } | 2 (one element, one pseudo-element) |
ul li { } | 2 (two elements) |
ul ol+li { } | 3 (three elements) |
div + *[rel=up] { } | 1,1 (one attribute, one element) |
ul ol li.red { } | 1,3 (one class, three elements) |
li.red.level { } | 2,1 (two classes, one element) |
style=”” | 1,0,0,0 (one inline styling) |
h1 { } | 1 (one HTML selector) |
div p { } | 2 (two HTML selectors) |
.hi | 1,0 (one class selector) |
div p.hi { } | 1,2 (two HTML selectors and a class selector) |
#hi | 1,0,0 (one id selector) |
body #darkside .sith p { } | 1,1,2 (HTML selector, id selector, class selector, HTML selector; 1+100+10+1) |
祝愿大家可以在Css的路上一路披荆斩棘。生活,就当如Css一样,绚丽绽放、五彩缤纷。
参考资料:http://www.cnblogs.com/xugang/archive/2010/09/24/1833760.html