• 爱情文章
  • 亲情文章
  • 友情文章
  • 生活随笔
  • 校园文章
  • 经典文章
  • 人生哲理
  • 励志文章
  • 搞笑文章
  • 心情日记
  • 英语文章
  • 范文大全
  • 作文大全
  • 新闻阅读
  • 当前位置: 山茶花美文网 > 校园文章 > 正文

    相同元素不同结构重复定义的问题:同种元素什么相同

    时间:2018-08-11来源:山茶花美文网 本文已影响 山茶花美文网手机站

    CSS选择器是构建CSS的基础.在为大型,复杂嵌套的(x)HTML文档进行样式定义时,很有可能会遇上针对相同元素在不同结构下的重复定义的问题,这个问题也是前端开发人员相对头痛的问题.

    在这种情况 (针对相同元素在不同结构下的重复定义) 发生的前提下,浏览器在渲染页面文件时,会按照一定规则进行优先级排列,然后根据这个优先级权重对发生状况的元素进行处理.

    而这个浏览器遵循的规则是什么呢?

    让我们来看一段简单的HTML代码:

    <body id="content">
    <div class="box">
    <p class="italic">For Testing 2</p>
    <em id="em" class="wrap">For Testing 3</em>
    </div>
    </body>

    这是段相当简单的HTML代码,但是具有相当的代表性.我们慢慢就能发现它为什么具有代表性了.

    首先我们来加上一点简单的CSS声明:

    p{ /* 1 */
    color:pink;
    }
    p.italic{ /* 11 */
    color:red;
    }
    div.box p{ /* 12 */
    color:black;
    }
    div p{ /* 2 */
    color:blue;
    }
    #content div p{ /* 102 */
    color:orange;
    }
    div p.italic{ /* 12 */
    color:green;
    }
    body div p{ /* 3 */
    color:olive;
    }
    body div p.italic{ /* 13 */
    color:gray;
    }

    大家来猜猜看结果中的"For Testing2"是什么颜色的呢?嗯...不浪费大家眼神了,结果是orange的,奇怪吗?有疑问吗?大家有没有注意到我在CSS中加入的注释中的数字?这是什么呢?这是CSS选择器特性权重值.

    id选择器,class类选择器,HTML标签选择器,这3种选择器就是构成CSS继承的组件,浏览器在渲染它们的时候是有优先权的.而这个优先权在一定情况下是可以计算出来的.

    统计在这个选择器里面ID选择器的数目为a
    统计在这个选择器里面类的选择器,属性选择器和伪类为b
    统计在这个选择器里面的元素名称数目为c,其中要忽略伪元素.串联三个数字为a-b-c,得到特征值.
    串连这3个数字就可以得到特征值.

    * /* a=0 b=0 c=0 -> 特征值 = 0 */
    li /* a=0 b=0 c=1 -> 特征值 = 1 */
    ul li /* a=0 b=0 c=2 -> 特征值 = 2 */
    ul ol+li /* a=0 b=0 c=3 -> 特征值 = 3 */
    h1 + *[rel=up] /* a=0 b=1 c=1 -> 特征值 = 11 */
    ul ol li.red /* a=0 b=1 c=3 -> 特征值 = 13 */


    li.red.level /* a=0 b=2 c=1 -> 特征值 = 21 */
    #x34y /* a=1 b=0 c=0 -> 特征值 = 100 */
    #s12:not(FOO) /* a=1 b=0 c=1 -> 特征值 = 101 */
    这样就能明白上面代码中的数字的含义了.

    是不是就这么简单呢?

    应该还有耐人寻味的地方.

    比如说我给出这样一组CSS来定义上面的HTML:

    p.italic { /* 11 */
    color: black;
    }

    div .italic { /* 11 */
    color: red;
    }

    .box p{ /* 11 */
    color:green;
    }

    .box em#em{ /* 111*/
    color:blue
    }

    body#content .wrap{ /* 111*/
    color:red
    }

    body .box #em{ /* 111 */
    color:green
    }

    #content .box em{ /* 111 */
    color:gray
    }


    这里的前3条权重值都是11,后4条声明的权重值都是111,那我们应该怎么判断呢?

    首先,我们看这条声明最终定义的是哪个元素.前3条都是定义<p>...</p>这个元素的,不难从中总结出一条规律:在声明中声明了元素的HTML标签的,权重又可以增加0.5,那么根据上面的例子,权重值就会变成:

    p.italic { /* 11.5 */
    color: black;
    }

    div .italic { /* 11 */
    color: red;
    }

    .box p{ /* 11.5 */
    color:green;
    }

    可以发现第1条和第3条的权重值还是一样的,我们试着交换一下他们的位置,天哪,它们之间是可以相互覆盖的.对,那就证明它们是真正的同层(level)声明.

    那同样的后4条声明也可以这样分析了:

    .box em#em{ /* 111.5*/
    color:blue
    }

    body#content .wrap{ /* 111*/
    color:red
    }

    body .box #em{ /* 111 */
    color:green
    }

    #content .box em{ /* 111.5 */
    color:gray
    }

    在这里的第1条和第4条权重值相同,第2条和第3条权重值相同.经交换实验也能发现这个数值的正确性.之前的权重计算公式曾经出现在Eric的书中以及W3的CSS3规范草稿中[http://www.w3.org/TR/css3-selectors/#specificity].


     

    • 相同元素不同结构重复定义的问题:同种元素什么相同 相关文章:
    • 爱情文章
    • 亲情文章
    • 友情文章
    • 随笔
    • 哲理
    • 励志
    • 范文大全