CSS选择器特殊性与重要性
特殊性
在编写CSS代码的时候,我们会出现多个样式规则作用于同一个元素的情况,例如
<!-- HTML -->
<header>
<nav class="nav-main" id="navigation">Here background</nav>
</header> /* CSS */
header nav {
background-color: red;
} #navigation {
background-color: green;
} .nav-main {
background-color: blue;
}
以上三个样式规则都会作用于 ID 值为 "navigation" 的 nav 标签,最终哪个样式规则会生效呢,这取决于选择器的特殊性(或优先级)高低,选择器特殊性高的样式会覆盖特殊性低的样式,经过测试 nav 标签的背景会显示为 green 绿色。
那么选择器特殊性是如何计算的呢?
通常,我们使用四个以逗号分隔的数字来表示特殊性,比如:
- 每个元素或伪元素选择器贡献特殊性为 0,0,0,1
- 每个类、伪类或者属性选择器的特殊性为 0,0,1,0
- 每个ID选择器的特殊性为 0,1,0,0
- 结合符和通配符的对特殊性没有贡献
计算一个组合选择器的特殊性的时候就先计算各种选择器的数量以及对应的特殊性再相加,比如
div ul li /* 0,0,0,3 3个元素选择器 */ div.aside ol li /* 0,0,1,3 1个类选择器,3个元素选择器 */ a:hover /* 0,0,1,1 1个伪类选择器,1个元素选择器 */ div.navlinks a:hover /* 0,0,2,2 1个类选择器,1个伪类选择器,2个元素选择器 */ .affix.top /* 0,0,2,0 多类选择器 注 */ input[type="text"] /* 0,0,1,1 1个属性选择器,1个元素选择器 */ input[name="sex"][type="radio"]
/* 0,0,2,1 2个属性选择器,1个元素选择器 */ #title em /* 0,1,0,1 1个 ID 选择器,1个元素选择器 */ h1#title em /* 0,1,0,2 1个 ID 选择器,2个元素选择器 */ * /* 0,0,0,0 1个通用选择器 */
注:多类选择器有多少个类就计算多少个类,不支持多类选择器的 IE6 会理解为一个类
比较选择器特殊性高低直接从左向右依次比较,数字大的则优先级更高,如果相同就比较下一位,所有位都相同则优先级是一样高,当选择器优先级一样高的时候后申明的样式会覆盖前面申明的样式
每个级别的优先级值是相互独立的,13个元素选择器写在一堆也不会比1个类选择器的特殊性高
第一个0是用于行内样式的,且仅用于行内样式
<nav style="background-color: gray;"></nav> <!-- 1,0,0,0 -->
重要性
有一样东西可以无视特殊性,那就是 !important。使用 !important 可以把任何样式规则标记为重要
.nav-main {
background-color: blue !important;
color: #666;
}
基本上,任何重要的样式规则都可以覆盖没有标记为重要的样式规则,
<div id="gohome"><a href="/" id="home">Home</a></div>
div#gohome a#home {
color: red;
}
div a {
color: green !important;
}
上面的代码会得到一个绿色 green 的链接,第一个规则有非常高的特殊性(0,2,0,2),
但是在 !important 面前一样没用,除非我们给第一个规则也标记为重要
div#gohome a#home {
color: red !important;
}
div a {
color: green !important;
}
这时候链接就变为红色 red 了,都标记为重要的情况下,则会使用前面提到的特殊性规则来解决,
所以使用 !important 的时候应当权衡,尽量不要用
另外,IE6 是支持 !important 的,只是不完全支持而已,当在同一个选择器中,在标记为重要的样式规则之后又重新定义了此样式则 !important 将失效
.header {
color: red !important; /* 标准浏览器 red */
color: green; /* IE6 green !important 失效 */
}
再有就是 IE6/7 可以允许在 !important 后面添加一些文字,依然能识别
.header {
color: red !important ie; /* ie6/7 red */
}
CSS选择器特殊性与重要性的更多相关文章
- CSS选择器的特殊性和LOVE HA
在CSS中当几个相同的选择器对同一个元素有不同的规则时,该怎么应用这些规则呢? 答案就是:CSS特殊性(CSS specificity) 选择器特殊性有选择器本身组成,特殊性由4个数值表述:0, 0, ...
- CSS选择器与CSS的继承,层叠和特殊性
什么是选择器?选择器{样式;},在{}之前的部分就是"选择器","选择器"指明了{}中的"样式"的作用对象,也就是"样式" ...
- 从覆盖bootstrap样式谈css选择器优先级
样式优先级 首先简单说几个定义样式的方式: 元素内嵌: <li><a href="" style="color:#ffffff;">SH ...
- CSS选择器学习小结
关于CSS选择器的问题,在实际项目中,以及一般的前端面试中会经常遇到.下面对此做一小结,梳理和巩固相关方面知识.(如有不妥之处,还望大家及时批评指正,以免误导他人) 一.选择器种类 1.id选择器(# ...
- CSS选择器的权重与优先规则?
我们做项目的时候,经常遇到样式层叠问题,被其他的样式覆盖,或者写的权重不高没效果,对权重没有具体的分析,做了一个总结. css继承是从一个元素向其后代元素传递属性值所采用的机制.确定应当向一个元素应用 ...
- css选择器万年不变的优先级和权重
我们在使用CSS对网页元素定义样式时经常会遇到这种情况:要对一般元素应用一般样式,然后在更特殊的元素上覆盖它们.那么我们怎么样来保证我们所新定义的元素样式能覆盖目标元素上原有的样式呢? 在CSS中,会 ...
- CSS选择器的权重与优先规则
权重顺序 “important > 内联 > ID > 类 > 标签 | 伪类 | 属性选择 > 伪对象 > 继承 > 通配符”. 原文:http://w ...
- 深入理解CSS选择器优先级的计算
选择器的优先级关系到元素应用哪个样式.在CSS2.1的规范(http://www.w3.org/TR/2009/CR-CSS2-20090908/cascade.html#specificity)中是 ...
- 前端--关于css选择器
css选择器就好像表达式一样,返回一组或者一个html元素,后面的样式声明块应用到返回的元素上.所以可以把css选择器理解为某个或者某一类html元素的抽象的写法. 在讲具体的各种选择器之前要提一下选 ...
随机推荐
- myeclipse 2013 SR2 for(MAC/WINDOWS)破解 注册过程
前天去官网下载的时候都还只是sr1,结果昨天去看居然有sr2了,之前一直在windows下用 2013,网上的注册机都还很好用.但最近换了mac,下载的sr1我却无论如何都没办法破解,下载了N个版本的 ...
- java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子
一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...
- 没有找到cxcore100.dll,因此这个应用程序未能启动,重新安装应用程序可能会修复此问题
第一种情况: 出现这个问题多数是因为“环境变量PATH”未设置,虽然你可能在安装的过程中勾选了Add <...>\OpenCV\bin to the system PATH项!安装Open ...
- window.location 对象所包含的属性
window.location 对象所包含的属性 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 hre ...
- JavaScript 中介者模式与观察者模式有何不同?
http://addyosmani.com/resources/essentialjsdesignpatterns/book/#detailmvp 感觉二者非常像,都是pub/sub机制,如何进行区分 ...
- 伸展树(一)之 图文解析 和 C语言的实现
概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...
- 数据可视化(5)--jqplot经典实例
本来想把实例也写到上篇博客里,最后发现太长了,拆成两篇博客了. 实例来源于官方文档:http://www.jqplot.com/tests/ 这篇博客主要是翻译了官方文档关于经典实例的解说,并在相应代 ...
- 以神经网络使用为例的Matlab和Android混合编程
由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是...) ...
- mysql主从复制显示正常,数据没同步现象。
当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...
- sql server索引功能资料
无论何时对基础数据执行插入.更新或删除操作,SQL Server 数据库引擎都会自动维护索引.随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片).当索引包含的页中的逻辑排序(基于 ...