CSS的特殊性 (specificity)

CSS的特殊性 (specificity)

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选择器>类或者伪类>元素和伪元素.

看几个例子:

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

如果这样写

…因为这几个样式定义存在冲突,所以显示效果需要根据特殊性来判断,从例子中可以很明显的看出
…/* 1.0.0.0 */最大,所以
的背景色最终为红色;继续:

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

根据特殊性规则:

"#">    为红色;

"#">

为蓝色;

"#" class="more">

为绿色;

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

即特殊性为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 */

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

继承同样不具有特殊性

例:

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

虽然通配符*定义在p的后面,但最终

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

...



这里的文字hello

...

例子很好理解,因为通配符定义了所有元素,所以

都是的红色(这里p,em特殊性为0.0.0.0).然后我们对例子做一点修改:

...



"blue">这里的文字hello

... 这里给

加了个blue的类,我们期望的是

里面的文字都变为蓝色,同时也想当然的认为会继承

的blue类的蓝色,但事实却是: "Content-Type" content="text/html; charset=gb2312" /> CSS的特殊性-iinterest

"blue">这里的文字hello

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

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

例:

h1{ color:red!important;}

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

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

最后h1文字为蓝色

你可能感兴趣的:(学习,css3,html,js)