视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
CSS中的选择器优先级顺序的详细介绍
2020-11-27 18:52:44 责编:小采
文档

特殊性是什么

在对一个HTML元素应用CSS样式时,常常有很多种方法可以找到元素,比如:

<p id="container" class="wrap_sty"> 
 <p class="pra">这是一个段落</p> 
</p> 
<style> 
 #container p { color:red } 
 p p { color:green } 
 p { color:yellow } 
</style>

可见,如果要作用到一个HTML元素的方法有很多,远远不止这些。那么如果一个元素被应用了很多同样的样式,最终会显式到哪一个样式呢?CSS对于多个选择器的优先性使用了一个叫做特殊性的方式。

CSS特殊性
选择器的特殊性分为4个等级,a b c d,从左到右,越左边的越优先, 如果一个选择器规则有多个相同类型选择器,则+1。
如果是HTML内样式,那么特殊性最优先,a=1
id选择器的特殊性是b,
类选择器、伪类选择器、属性选择器为c
标签选择器、伪元素选择器为d
先来说说一些选择器类型:
1.id选择器

#myid { ... }

2.类选择器

.myclass { ... }

3.标签选择器

p { ... }

4.属性选择器

[title="mytitle"] { ... }

由于大多数文档例如W3CSCHOOL可能并没有详细说明,或许不少人认为属性选择器是这样的 p[title="mytitle"] 或#id[title="mytitle"]等等,这样是属性选择器,严格来说,这样的并非单纯的属性选择器,而是由id选择器、标签选择器等等和属性选择共同组成的。
5.伪类选择器

p:hover { ... }

常见的伪类选择器有:
链接伪类,:link, :visited,用于锚元素。
动态伪类,:hover,:focus,:active,用于任何选择。
6.伪元素选择器

p::after { ... } 
p::before { ... }

伪元素和伪类是完全不同的概念,之所以称之为伪元素,因为其确实可以生成一个虚拟的HTML元素,只不过伪元素无法被DOM获取到。
伪元素的应用有很多,最常见的比如::after清除浮动:

<ul> 
 <li>A</li> 
 <li>B</li> 
</ul> 
<style> 
 li { float:left } 
 ul::after { content: ""; display: block; clear: both } 
</style>

CSS特殊性示例
下面是一些CSS选择器的特殊性示例:

选择器特殊性以10为基数的特殊性
style="color: red"1, 0, 0, 01000
#id {}0, 1, 0, 0100
#id #aid0, 2, 0, 0200
.sty {}0, 0, 1, 010
.sty p[title=""] {}0, 0, 2, 020
p:hover {}0, 0, 1, 010
p {}0, 0, 0, 11
ul::after {}0, 0, 0, 11
p p {}0, 0, 0, 22


如果两个规则的特殊性相同,那么后定义的会覆盖先定义的。

CSS重要性
CSS中还有一种东西可以无视特殊性,那就是!important,使用此标记的CSS属性总是最优先的。

#id { color: red } 
.class { color: yellow !important }

第二个样式会优先于第一个样式,即使id选择器的特殊性高于类选择器。
如果两个属性都有 !important 那么由特殊性来决定优先级。

#id { color: red !important } 
.class { color: yellow !important }

结果是第一个样式优先于第二个样式。
IE6对 !important 的支持并不完全,在IE6中,如果一个选择器中先定义了 !important 属性,后面又定义了一个同样的不带 !important 的属性,那么!important 会失效。

p { 
 color: yellow !important; 
 color: red; 
}

在IE6中,可就没办法黄了,还是见点血吧!
IE6/7还可以在 !important 后面加点料,也不会失去味道,但是建议别这么无聊!

div { 
 color: yellow !important you are dead; /* IE6/7依然有效 */ 
}

下载本文
显示全文
专题