作家
登录

CSS:相同元素不同结构重复定义的问题

作者: 来源:www.28hudong.com 2012-11-19 22:57:01 阅读 我要评论

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 */ulol li /* a=0 b=0 c=3 -> 特征值 = 3 */h1 *[rel=up] /* a=0 b=1 c=1 -> 特征值 =11 */ulol 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].这个半点权重法可以说是我创造的呦~啊哈哈哈.

  推荐阅读

  背投广告设计:用最少的时间来做最效率的事情

  对于背投广告的原理来说并没有什么难度,无非打开的窗口失去焦点(blur),而原来页面得到焦点(focus)。但对于流行的浏览器来说,如果非用户行为的弹出窗口(即 onload 时,直接window.open ),会被浏览器>>>详细阅读


本文标题:CSS:相同元素不同结构重复定义的问题

地址:http://www.17bianji.com/kaifa2/CSS/17417.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)