142016
 

CSS的特殊性是非常重要却又经常被忽视的属性,特别是在团队合作下的产品迭代开发中,因为不注重CSS的特殊性最后导致某些代码混乱不堪,这里就把自己对CSS特殊性的认识做一些归纳总结.

CSS的特殊性(specificity)也可以称为CSS的优先级或权值:对于每个样式表规则,浏览器都会计算选择器的特殊性,从而使元素属性声明在有冲突的情况下能够正确显示.

特殊性的描述可以把它看成一个4位数: 0.0.0.0 ,数值越大的特殊性越高(例如:0.1.0.0>0.0.1.2),也是最终浏览器显示的效果.

特殊性的具体特性:

  • 内联样式的特殊性为 1.0.0.0
  • ID选择器的特殊性为 0.1.0.0
  • 类或者伪类的特殊性为 0.0.1.0
  • 元素和伪元素的特殊性为 0.0.0.1

简单的说就是:内联样式的特殊性>ID选择器>类或者伪类>元素和伪元素.

看几个例子:

<div style="backgroud:red">... /* 1.0.0.0 */
#iin1{ backgroud:blue;} /* 0.1.0.0 */
.iin2{ backgroud:green;} /* 0.0.1.0 */

如果这样写<div id=”iin1″ class=”iin2″ style=”backgroud:red”>…因为这几个样式定义存在冲突,所以显示效果需要根据特殊性来判断,从例子中可以很明显的看出<div style=”backgroud:red”>…/* 1.0.0.0 */最大,所以<div>的背景色最终为红色;继续:

a{ color:red;} /* 0.0.0.1 */
p a{ color:blue;} /* 0.0.0.2 */
p a.more{ color:green;} /* 0.0.1.2 */

根据特殊性规则:

<a href="#"></a>    <a>为红色;
<p><a href="#"></a></p>    <a>为蓝色;
<p><a href="#" class="more"></a></p>    <a>为绿色;

连接符和通配符不具有特殊性

即特殊性为0.0.0.0; 例如下面两组例子,它们的的特殊性相同:

div p{ color:red;} /* 0.0.0.2 */
body * p{ color:blue} /* 0.0.0.2*/
ol>li{ color:red;} /* 0.0.0.2 */
ol li{ color:blue;} /* 0.0.0.2 */

那么遇到上面的情况浏览器该如何渲染呢? 浏览器会根据选择器出现的先后顺序来判断,后出现的选择器会把先出现的给覆盖掉,所以最后两组例子都会显示为蓝色.而且浏览器会将内部样式(即<style>…</style>中的样式)的顺序判断为在外链样式之后,也就是说内部样式会覆盖掉外链样式中相同的属性定义.

继承同样不具有特殊性

例:

p{ color:blue;} /* 0.0.0.1 */
*{ color:red;} /* 0.0.0.0 */

虽然通配符*定义在p的后面,但最终<p>中的文字还是会显示为蓝色;值得注意的是继承的”不具有特殊性”不同于上面提到的连接符和通配符,它是连0都没有! 这又会给我们带来什么意外呢?看看下面的例子:

...
<style>
*{ color:red;}
</style>

<body>
<p>这里的文字<em>hello</em></p>
</body>
...

例子很好理解,因为通配符定义了所有元素,所以<p>和<em>都是的红色(这里p,em特殊性为0.0.0.0).然后我们对例子做一点修改:

...
<style>
*{ color:red;}
.blue{ color:blue;}
</style>

<body>
<p class="blue">这里的文字<em>hello</em></p>
</body>
...

这里给<p>加了个blue的类,我们期望的是<p>里面的文字都变为蓝色,同时也想当然的认为<em>会继承<p>的blue类的蓝色,但事实却是:

<!DOCTYPE html >
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ />
<title>CSS的特殊性-iinterest</title>
<style type=”text/css”>
*{color: red;}
.blue{color:blue; }
</style>
</head>
<body>
<p class=”blue”>这里的文字<em>hello</em></p>
</body>
</html>

出现这种意外的原因就在于继承的特殊性连0都没有,而通配符的特殊性为0,所以通配符的样式被显示出来…

最后一个影响特殊性的声明:!important

例:

h1{ color:red!important;}

!important被称为重要声明,被标记为!important的属性其特殊性最高,当出现有冲突的重要声明时,同样安照出现的先后顺序决定最后的显示.

例:

h1{color:red!important;}
h1{color:blue!important;}

最后h1文字为蓝色

原文:iinTERest

对不起,评论功能目前被关闭。