zoukankan      html  css  js  c++  java
  • 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选择器>类或者伪类>元素和伪元素.

    看几个例子:

    <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文字为蓝色

    原文链接:http://www.iinterest.net/2010/05/08/css-specificity/

  • 相关阅读:
    net中System.Security.Cryptography 命名空间 下的加密算法
    关于如何生成代码的帮助文档的链接
    Application.EnableVisualStyles();
    VS2010里属性窗口中的生成操作
    把普通的git库变成bare库
    MultiTouch camera controls source code
    android onTouch()与onTouchEvent()的区别
    iOS开发中常见的语句@synthesize obj = _obj 的意义详解
    java nio 快速read大文件
    使用ndk standalone工具链来编译某个平台下的库
  • 原文地址:https://www.cnblogs.com/WuxiIEC/p/3427711.html
Copyright © 2011-2022 走看看