最近在写css的时候,由于经常使用到很长的多级选择器,而碰到一些样式被覆盖或者覆盖不了的情况是相当的郁闷,所以专门花了一些时间对一些选择器做了对比测试。这里先说明一下,由于ie6不支持css2.0选择器,所以这些测试忽略了一些2.0的选择器和连接符,如伪类(:hover),属性 ([type=”text”]),子选择符(>)等,仅针对#id,.class,tag和空格连接符测试。

  定义:

1. CSS句子:一个完整的选择器构成一个CSS句子,如.abb #cd div.class。而用逗号连接的算作多个句子的省略定义方法。
2. CSS单词:CSS句子中任何一个#id或.class或tag都算作一个CSS单词,虽然照以前的理解一般把tag#id.class1.class2整个看作一个单词,但是在本文讨论范围内,这个只能算作一个由4个单词组成的词组。
3. 优先级:对于选择到同一个元素的两个CSS句子,当他们定义该元素的同一个属性时,如果其中一个写在前而不会被写在后面的覆盖这个属性,那么就称这个CSS句子的优先级高于另一个。而当2个CSS句子互相调换在代码中的位置都是后面的覆盖前面的属性时,称这两个 CSS句子有相同的优先级。

  测试用dom:
<html id="html" class="html">
<body id="body" class="body">
<div id="div">
<div id="test1" class="test test1">1第一行<br>第二行<br>自身</div>
<div id="test2" class="test test2">2第一行<br>第二行<br>自身</div>
<div id="test3" class="test test3">3第一行<br>第二行<br>自身</div>
<div id="test4" class="test test4">4第一行<br>第二行<br>自身</div>
<div id="test5" class="test test5">5第一行<br>第二行<br>自身</div>
<div id="test6" class="test test6">6第一行<br>第二行<br>自身</div>
<div id="test7" class="test test7">7第一行<br>第二行<br>自身</div>
<div id="test8" class="test test8">8第一行<br>第二行<br>自身</div>
</div>
</body>
</html>

这里先给出8组选择器,每组两个,各位同学可以先想一想每组里面哪个选择器的优先级高:
/*第1组*/
#test1{height:2em;}
.test1{height:1em;}

/*第2组*/
.body #test2{height:1em;}
#test2{height:2em;}

/*第3组*/
div .test3{height:2em;}
#test3{height:1em;}

/*第4组*/
.body #test4{height:2em;}
body #test4{height:1em;}

/*第5组*/
html #test5{height:2em;}
body #test5{height:1em;}

/*第6组*/
#body #test6{height:1em;}
.html #test6{height:2em;}

/*第7组*/
html #body #test7{height:1em;}
.html .body #test7{height:2em;}

/*第8组*/
#html.html .body #test8{height:1em;}
.html #body.body #test8{height:2em;}

现在公布答案:

1. 仅一个选择器单词的时候#id高于.class应该不用说了;
2. div#test2比#test2多了一个单词,那么多一个单词的优先级高,这里可以暂时理解成多一个单词就选择的更精确;
3. 同样多一个单词,但其中一个有#id选择,则#test3要高于div .test3;
4. .body #test4高于body #test4,暂时可理解为同样多层级时,.class高于tag;
5. html #test5与body #test5有同样的优先级,先写的会被覆盖,这里猜测同样的层级数,优先级与层级跨越的深度无关;
6. #body #test6高于.html #test6,理解为#id优于.class也与层级深度无关;
7. 最后两个比较有难度了,但浏览器下的结果是html #body #test7高于.html .body #test7,怎样理解我先不说;
8. #html.html .body #test8与.html #body.body #test8同级。

其实越到后面,应该越是能看出一种模糊的规则来。经过我反复的分析,最终从模糊的感觉中发现了其中的奥秘,或者说是一种说得通的解释:

  把css句子的单词组成定义为“数位”,像个十百位的数字一样,css中不同的单词代表不同的权重数位,分别是#id,.class,tag三个数位依次从高到低排列,组成了相当于十进制数字的百位,十位,个位。再把每个css句子中个各种单词的个数代入到刚刚划分的数位里,就可以得到一个类似于十进制数字的三位数,只是在css的优先级数位里,没有进位的概念,无数个低位单词也还是低于一个高位的单词。从而结论就是,按#id,.class,tag的数位统计了css的单词个数并代入各个数位后,只要比较两个css数字的大小(从高位到低位依次比较),就能得出两个css的优先级。

用这个规则重新比较一遍前面的例子:

1. 1,0,0>0,1,0
2. 1,1,0>1,0,0
3. 0,1,1<1,0,0
4. 1,1,0>1,0,1
5. 1,0,1=1,0,1
6. 2,0,0>1,1,0
7. 2,0,1>1,2,0
8. 2,2,0=2,2,0

用这个方法很容易就能比较出最后两组例子的优先级,对于前述的一些情况也可以做出合理的解释,所以在没有更好的css选择器解释方法之前,这个数位计算法是非常方便且容易理解的。

CSS覆盖问题的说明的更多相关文章

  1. CSS覆盖公共样式中的某个属性

    CSS如何覆盖公共样式中的某个属性?利用CSS样式的优先级. 如下例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  2. css覆盖select样式并添加小箭头

    .select { border-radius: 5px; border: 1px #F4A627 solid; -webkit-appearance: none;//清除默认样式 backgroun ...

  3. Normalize.css的使用及下载

    Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML5准备 ...

  4. CSS基本知识1-CSS基本概念

    CSS基本概念: 选择器{属性:值;属性:值} CSS继承:子元素继承父元素样式,父子关系看DOM结构. CSS覆盖: 浏览器缺省设置 外部样式表 内部样式表(位于 <head> 标签内部 ...

  5. [转载]来,让我们谈一谈Normalize.css

    来源 : http://segmentfault.com/a/1190000002239676 ---------------------------------------------------- ...

  6. [php入门] 5、初学CSS从中记下的一些基础点(For小白)

    CSS是层叠式样式表,主要用来控制页面的样式. 一.CSS概述 应用CSS: 1.外部样式表,CSS写在一个单独的.CSS文件中,在head里加<link rel="styleshee ...

  7. Normalize.css的使用(重置表)

    本文译自Normalize.css官网: http://nicolasgallagher.com/about-normalize-css/ Normalize.css 只是一个很小的CSS文件,但它在 ...

  8. [转]DIV+CSS和TABLE的区别

    现在全国大大小小的网站都在搞一场技术“革命”,就是所谓“网站重构”说简单点就是DIV+CSS进行网站制作.用DIV+CSS代替传统的Table制作框架和美化页面.百度搜索优化 在重构之前,肯定要了解为 ...

  9. 来,让我们谈一谈Normalize.css

    本文译自 http://nicolasgallagher.com/about-normalize-css/最初发布于我的博客:http://jerryzou.com/posts/aboutNormal ...

随机推荐

  1. toUpperCase(),toLowerCase()将字符串中的英文转换为全大写或全小写

    package seday01;/** * String toUpperCase() * String toLowerCase() * 将字符串中的英文转换为全大写或全小写 * @author xin ...

  2. Java生鲜电商平台-促销架构以及秒杀解决方案实战

    Java生鲜电商平台-促销架构以及秒杀解决方案实战 背景:随着这几年的电商的大热,我们经常看到一些商家为了促销和快速收益,纷纷推出了秒杀活动.不管是日常的超市里面的促销,明星演唱会门票售卖,还是春节订 ...

  3. Vuex基本使用的总结--转载

    在 Vue 的单页面应用中使用,需要使用Vue.use(Vuex)调用插件.使用非常简单,只需要将其注入到Vue根实例中. import Vuex from 'vuex' Vue.use(Vuex) ...

  4. postgreSQL数据库的初探

    kali是黑客的强大武器,还有一个也是哦——Metasploit postgreSQL数据库是Metasploit的默认数据库哦! 启动postgresql: service postgresql s ...

  5. Java实现图片按修改时间排序

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/127 图片按修改时间先后顺序排序 刚刚碰到了个小问题,处理 ...

  6. 版本管理·玩转git(团队合作)

    如果你想让一位叫"伙夫"的程序员,和你一起开发,首先你得在你的代码仓库把伙夫添加到此项目中来,让其成为开发者. 具体步骤: 项目->管理->项目成员管理->开发者 ...

  7. Android SDK自带调试优化工具

    Android sdk中自带了一些分析内存,界面调优的非常实用的工具,这对于分析和调试我们的应用十分有帮助,由于我使用的是linux版本的sdk,所以就以linux版本的工具做一个介绍,这些工具的具体 ...

  8. zabbix4.0搭建2

    server端(ip 192.168.200.15) proxy端(ip 192.168.200.22) agent端(ip 192.168.200.12) server端: #安装数据库 [mari ...

  9. 深入理解JVM虚拟机(二):JDK 内存类的异常分析

    JVM数据存储 堆存储(Heap):对象存储,实际上就是JAVA的数据存储 方法堆栈(Method Stack):存储方法调用的关系. 永久代(Perm):在JDK1.6及之前,常量数据存储于此区域 ...

  10. python 给多人发送邮件,且将结果添加为附件

    import unittest,HTMLTestRunnerimport osdef runa(): path=os.getcwd() print(path) a=unittest.defaultTe ...