首页 | 站长免费中心 | 新手上路 | 网站运营 | 网页制作 | 图片设计 | 动画设计 | 网页编程 | 网页特效 | 本站专题 | 虚拟主机 | 域名注册 | 网站建设 | 程序下载
       免费空间资源 | 新闻咨询 | 免费域名 | 免费网盘 | 网站推广 | 网站策划 | 建站经验 | 网站优化 | 网页代码 | 源码下载 | 音乐小偷 | 网络赚钱 | 论坛交流
网站建设
网站建设
虚拟主机
虚拟主机
域名注册
域名注册
711网络首页
站长工具
站长工具
网站源码
网站源码
站长论坛
站长论坛

 711网络 网页制作CSS教程

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

来源: 互联网    日期:2006-4-20
 

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继承的组件,浏览器在渲染它们的时候是有优先权的.而这个优先权在一定情况下是可以计算出来的.

  1. 统计在这个选择器里面ID选择器的数目为a
  2. 统计在这个选择器里面类的选择器,属性选择器和伪类为b
  3. 统计在这个选择器里面的元素名称数目为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].这个半点权重法可以说是我创造的呦~啊哈哈哈.



更多的CSS:相同元素不同结构重复定义的问题请到论坛查看: http://BBS.TC711.COM



【 双击滚屏 】 【 评论 】 【 收藏 】 【 打印 】 【 关闭 】 来源: 互联网    日期:2006-4-20   

发 表 评 论
查看评论

  您的大名:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
认证编码: 刷新验证码
点评内容: 字数0
  精品推荐  
  本月推荐  
  友情赞助  

关于我们 | 联系我们 | 广告投放 | 留言反馈 | 免费程序 | 虚拟主机 | 网站建设 |  网站推广 |  google_sitemap baidu_sitemap RSS订阅
本站所有资源均来自互联网,如有侵犯您的版权或其他问题,请通知管理员,我们会在最短的时间回复您
Copyright © 2005-2015 Tc711.Com All Rights Reserved 版权所有·711网络   蜀ICP备05021915号
110网监备案 信息产业备案 不良信息举报