什么是 CSS 选择器优先级(特异性)?计算规则是什么?
浏览器使用优先级来确定哪些属性值与元素最相关,然后将这些属性值应用到该元素。优先级是基于由不同类型的选择器组成的匹配规则。
这句话也很抽象,我们暂时忽略它。不过我们可以先看一个例子:
- HTML:
<div id="content" class="content">
我是什么颜色
</div>
复制代码- CSS:
#content {
color: #f00;
}
.content {
color: #0f0;
}
复制代码最终文本的颜色是什么?答案很简单:红色。这涉及到优先级的问题。对于同一段内容,我们同时使用 相信每一个写过CSS的朋友都知道,CSS选择器的优先级关系是: 内联 > ID选择器 > 类选择器 > 标签选择器。 但是,浏览器的具体优先级算法是什么呢?可能还有一些人不知道。算法流程在《CSS REFACTORING》中提到。 通过隐藏 (a, b, c, d) 中的数字来确定特异性: 翻译为 优先级由 应用上面的算法,找到 为了熟悉优先级算法,我们来做一些练习: 好的,现在我们已经弄清楚了优先级是如何计算的。还有一个问题,如何比较两个优先级? 比较规则是:从左到右比较,较大者获胜。如果相等,则继续右移一位进行比较。如果 4 位都相等,最后一位将覆盖前一位 我们再看一下示例: 计算 - - ♂ 的优先级。左边第一个数字都是0。看左边第二个数字。前者为1,后者为0,所以 通过上面的优先级计算规则,我们可以知道内联样式的优先级是最高的,但是有没有办法让外部样式覆盖内联样式呢?是的,那么 可能有人会觉得如果我在内联样式中使用 是的,你赢了。这时候内联样式就太强大了,无论你怎么写外部样式,都无法覆盖它。在当前的代码中必须避免这种情况!请记住,切勿在内联样式中使用 。最后, 此时 . box 作者:chessID 选择器 和 类选择器 ,因为 ID 选择器 ❿❓❓❓❓❓❓❓❓❓❓ ❓❓❓ ❓❓❓❓❓❓❓❓❓,所以它以红色结尾。 优先级计算规则
A、BB!然而,这实际上并不是优先级的问题,因为优先级比较的是同一个属性,而❿ 确定, 等于 D由值决定,其值按如下计算:A = 1,否则 0; B的值等于ID选择器出现的次数; C的值等于类选择器和属性选择器和♝出现的总数;的值D 标签选择器 和 伪元素 ❀ 出现的总次数。也 好像还是这样立刻就明白了,那就先从前面的例子开始: 只有#nav-global > ul > li > a.nav-link
复制代码a : B ❿❿ DA = 0; B = 1 ; C = (1 + 0 + 0) = 1;D = (3 + 0) : 可以缩短如: 比 (0, 1, 1, 3)。 li /* (0, 0, 0, 1) */
ul li /* (0, 0, 0, 2) */
ul ol+li /* (0, 0, 0, 3) */
ul ol+li /* (0, 0, 0, 3) */
h1 + *[REL=up] /* (0, 0, 1, 1) */
ul ol li.red /* (0, 0, 1, 3) */
li.red.level /* (0, 0, 2, 1) */
a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11 /* (0, 0, 11,0) */
#x34y /* (0, 1, 0, 0) */
li:first-child h2 .title /* (0, 0, 2, 2) */
#nav .selected > a:hover /* (0, 1, 2, 1) */
html body #nav .selected > a:hover /* (0, 1, 2, 3) */
复制代码<div class="nav-list" id="nav-list">
<div class="item">nav1</div>
<div class="item">nav2</div>
</div>
复制代码#nav-list .item {
color: #f00;
}
.nav-list .item {
color: #0f0;
}
复制代码(0, 1, 1, 0)大于(0, 0 , 2, 0),即# nva -list .item.nav-list .item 大,因此字体为红色。 优先级的特殊情况
!重要应该采取行动。因为一般内联样式很少用,所以!important也很少用!如果不是覆盖内联样式,建议不要使用!重要,!important,我就不能对外部样式做任何事情了?例如,以下代码: <div class="app" style="color:#f00!important">666</div>
复制代码.app {
color: 0f0!important;
}
复制代码!重要!重要真的是无限王吗?其实不是,有些情况我们可以回顾一下!重要,请看下面的例子: <div class="box" style="background: #f00; width: 300px!important;">我的宽度是多少呢??<div>
复制代码.box {
max-width: 100px;
}
复制代码100px,而不是300px,可以看出-❀♿最大宽度!重要max-width和width是两个不同的属性。我之所以举这个例子,是想告诉大家,有时候无论你怎么设置容器width,都不生效。看看是否有人写了 max-width 来欺骗你。
链接:https://juejin.im/post/5be3d07be51d457d4932b043
来源:Nuggets 版权归作者所有。如需商业转载,请联系求作者授权。非商业转载请来源。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网