建站学习网,专业提供各类建站教程,网页素材,SEO资讯等建站资源!

网站模板_网站源码_网站素材_建站教程_建站学习网

当前位置:建站学习网 > DIV+CSS教程 > DIV CSS教程 >

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

更新时间:2016-12-30整理编辑:建站学习网阅读:0

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].


 

本文网址:https://www.dedexuexi.com/divcss/jc/1696.html

文章搜集与网络,如有侵权请联系本站,转载请说明出处。

标签:技巧
收藏此文 赞一下!() 打赏本站

如本文对您有帮助,就请建站学习网抽根烟吧!

支付宝打赏
微信打赏
img标签下多余空白BUG解决方法
« 上一篇2016年12月30日
DIV+CSS:网页一行两列背景自适应
2016年12月30日下一篇 »
  • DIV CSS如何给文字字体添加下划线?
    0阅读
    在css中可以使用text-decoration属性或border-bottom属性来给文字添加下划线样式。下面本篇文章就来给大家介绍一下,希望对大家有所帮助。方法1:使用text-decoration属性设置css的text-decoration属性用于指定添加到文本的修饰,其underline属...
  • 纯CSS3实现带动画效果导航菜单无需js
    0阅读
    随着互联网的发展,网页能表现的东西越来越多。由最开始单纯的文字和链接构成的网页,到后来的表格布局,再到div+css模式,现在发展到了 html+css3。网页能表达的东西越来越多,css3兴起已经
  • CSS定义超链接四个状态的正确顺序L-V-H-A
    0阅读
    css定义超链接是要有先后顺序的。否则,在某些浏览器里面有可能会出现某个样式不起作用的bug。不能正确显示想要的效果。 CSS属性的排列顺序: L-V-H-A 。 L-V-H-A是link、visited、hover、active的简写
  • 在ie7下css居中样式text-align:center;偏左问题解决方法
    0阅读
    css样式text-align:center;在ie7下偏左问题,想必有很多朋友的遇到过吧,下面有个不错的方法,大家可以参考下,希望对大家有所帮助 复制代码 代码如下: body { text-align:center; } 用ie7打开是居左的。
  • 对div盒子模型使用心得总结
    0阅读
    相信每一个从事web开发的人对盒子模型都有一个特殊的理解吧,本文也有一个理解并附有示例代码,喜欢的朋友可以参考下 盒子模型的计算 外边距(margin)+边框(border)+内边距(padding)+内容(content
 
QQ在线咨询

添加微信客服