CSS选择器的权重是如何抉择的?

在解决这个问题之前我们先来看一下css选择器都有哪些。

一、选择器类型

1、元素选择器 Element Selectors

p {
color: red;
}
div {
color: blue;
}

这样子对某一个元素进行赋予就是元素选择器。

2、ID选择器 ID Selectors

<p id="notification">通知:明天放假</p>

notification {
font-size: 24px;
}

这个给元素一个ID并对ID进行赋予的就是ID选择器。

3、类选择器 Class Selectors

<ul>
<li class="first done">起床</li>
<li class="second done">刷牙</li>
<li class="third">洗脸</li>
</ul>

.first {
font-weight: bold;
}
.done {
text-decoration: line-through;
}

一个元素可以应用多个类,一个类也可以赋予给多个元素。

4、通用选择器 Universal Selector

*{
box-sizing: border-box;
}
.flex-container * {
flex-basis: 100%;
}

这种使用 * 号来写的就是通用选择器,它是对全局进行赋予的。

5、属性选择器 Attribute Selectors

[disabled] {
cursor: not-allowed;
}

这种针对某一种特殊的属性进行赋予的是属性选择器。所有拥有这种属性的元素都会被赋予。

6、伪类 Pseudo-classes

a:link { ... }
a:visited { ... }
a:hover { ... }
a:active { ... }

li:first-child { ... }
li:last-child { ... }

body :not(p) { ... }
p:not(.warning) { ... }

这些特殊的类都是伪类。

7、伪元素 Pseudo-elements

::after
::before
::selection
::backdrop
::first-letter
::first-line
::-webkit-input-placeholder

8、组合选择器 Combinators

.author, .famous {
font-weight: bold;
}
.article a {
color: #384ebf;
}
.warriors > li {
background-image: url(../images/warrior.svg);
}
.cavs .lbj + li {
text-shadow: 1px 1px 5px #ccc;
}
.cavs .lbj ~ li {
text-shadow: 1px 1px 5px #ccc;
}

9、多个选择器 Multiple Selectors

.players .player.curry, .player.mvp, #lebron-james {
background-image: url(../images/mvp.png);
}

一次性对多个标签进行赋予。

二、权重计算规则

  1. 第一等:代表内联样式,如: style=””,权值为1000。
  2. 第二等:代表ID选择器,如:#content,权值为0100。
  3. 第三等:代表类,伪类和属性选择器,如.content,权值为0010。
  4. 第四等:代表类型选择器和伪元素选择器,如div p,权值为0001。
  5. 通配符、子选择器、相邻选择器等的。如*、>、+,权值为0000。
  6. 继承的样式没有权值。

三、比较规则

  1. 1,0,0,0 > 0,99,99,99。也就是说从左往右逐个等级比较,前一等级相等才往后比。
  2. 无论是行间、内部和外部样式,都是按照这个规则来进行比较。而不是直观的行间>内部>外部样式;ID>class>元素。之所以有这样的错觉,是因为确实行间为第一等的权重,所以它的权重是最高的。而内部样式可能一般写在了外部样式引用了之后,所以覆盖掉了之前的。
  3. 在权重相同的情况下,后面的样式会覆盖掉前面的样式。
  4. 通配符、子选择器、相邻选择器等的。虽然权值为0000,但是也比继承的样式优先。

四、!important

.better {
background-color: gray;
border: none !important;
}

[!important] 大于任何的规则,所有的权重里面,它排名第一。(覆盖此!important声明的唯一方法是在源顺序中包含相同特异性的另一个!important声明。)

理解选择器的特殊性很重要,特别是在修复bug的时候,因为你需要了解哪些规则优先及其原因。
如果你遇到了似乎没有起作用的CSS规则,很可能是出现了特殊性冲突。请在你的选择器中添加他的一个父元素的ID,从而提高它的特殊性。如果这能解决问题,就说明样式表中其他地方很可能有更特殊的规则,它覆盖了你的规则。如果是这种情况,你可能需要检查代码,解决特殊性冲突,让代码尽可能简洁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.CSS 元素选择器 最常见的 CSS 选择器是元素选择器。换句话说,文档的元素就是最基本的选择器。如果设置 H...
    饥人谷_小侯阅读 4,388评论 0 1
  • 简介浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工 作原理,我们将看到,从你在地址栏输入google.c...
    听风阁阅读 8,574评论 0 7
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,717评论 1 92
  • 学习CSS的最佳网站没有之一 http://www.w3school.com.cn/tags/index.asp ...
    Amyyy_阅读 4,778评论 0 1
  • CSS基础 本文包括CSS基础知识选择器(重要!!!)继承、特殊性、层叠、重要性CSS格式化排版单位和值盒模型浮动...
    廖少少阅读 8,578评论 0 40

友情链接更多精彩内容