当前位置: 首页 > 图文教程 > 网页制作 > CSS样式表 > CSS:相同元素不同结构重复定义的问题

CSS样式表
让图片 div居中实现代码
去掉点击链接时周围的虚线框outline属性
CSS 优先级 详细分析
广告始终定位到网页右下角 css
superLink 让伪链接更有可用性
CSS 模块化 实现方法
css 选择器 介绍
CSS 语法 学习css入门者看
firefox 滚动条消失引起页面抖动的问题
纯CSS定位的固定垂直居中浮动层代码,附经典解说 《详解定位与定位应用》
渲染CSS选择器
CSS 兼容问题
css textarea 高度自适应,无滚动条
CSS 网页表单实现鼠标悬停交互效果
鼠标激活显示背景色网页特效CSS代码
CSS制作用户登录和用户注册的用户体验表单
CSS代码 注释的3种方法
网页头部css代码优化实例
IE7和IE8的兼容性问题
CSS 网页布局网页制作技巧总结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 223 ::
收藏到网摘: n/a


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].这个半点权重法可以说是我创造的呦~啊哈哈哈.