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

CSS样式表
DIV和CSS排版中制作细线条的方法小结
在解决ul居中问题时想到的几点
网页编辑中CSS样式表技巧总结
一个老外弄的Clearing floats(清除浮动的方法)
常用的DIV+CSS的基本框架结构但不推荐都放一个div里
无js5款纯div+css制作的弹出菜单标准
超强推荐CSS打造经典鼠标触发显示选项
CSS网页布局入门教程5:二列宽度自适应
CSS网页布局入门教程6:左列固定,右列宽度自适应
CSS网页布局入门教程7:二列固定宽度居中
CSS网页布局入门教程9:用CSS设计网站导航——横向导航
CSS网页布局入门教程10:带当前标识的标签式横向导航
CSS网页布局入门教程11:带当前标识的标签式横向导航图片美化版
CSS网页布局入门教程12:纵向导航菜单
CSS网页布局入门教程13:下拉及多级弹出式菜单
CSS网页布局入门教程14:纵向下拉及多级弹出式菜单
解读css发展历史
让用户自己控制网页字体的大小的css书写方法
CSS注释、命名、继承性、样式排序等CSS技巧的小结
CSS标签切换代码实例教程 比较漂亮

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 291 ::
收藏到网摘: 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].这个半点权重法可以说是我创造的呦~啊哈哈哈.