我正在努力理解CSS中的特异性。
我目前的理解是,特异性与继承非常相似,但在某种程度上定义得更具体。
Mozilla特定性定义:
特定性是浏览器决定哪些CSS属性值与元素最相关,因此将被应用的手段。具体性是基于匹配规则,这些规则由不同类别的CSS选择器组成。
当前任务是:
重构.active a
和.copyright
的CSS声明,以便可以删除!important
规则
CSS:
.main li a {
color: #7ab2c1;
}
.active a {
color: #826c55 !important;
}
.primary p {
font-size: 12px;
}
.copyright {
font-size: 10px !important;
}
以及相关的HTML:
<nav class="main">
<ul class="group">
<li class="active"><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
[...]
<footer class="primary">
<p><a href="#">Sign up</a> for our newsletter, it's a racket!</p>
<p class="copyright">Copyright © Sven's Snowshoe Emporium. All Rights Reserved.</p>
</footer>
有人能指导我完成重构过程,帮助我掌握基本概念吗?
一个类的特异性为10。元素的特异性为1。
因此,在第一种情况下:
.main li a
选择子的特异性为12.active a
选择器的特异性为11
因为它们都针对同一个元素,而前者具有更高的特异性,后者在设计元素的战斗中失败了。
在第二个例子中:
.primary p
选择子的特异性为11- CCD_ 7选择器具有10的特异性
同样,因为它们都针对同一个元素,而前者具有更高的特异性,后者在设计元素的战斗中失败了。
!important
注释胜过所有特异性。因此,在应用该元素的情况下,.active a
和.copyright
重新获取元素。
如果你想删除!important
,这是正确的做法,因为这里没有必要,你可以提高选择器的特异性。
CCD_ 12的特异性为100。这样可以快速提升选择器的优先级。
以下是一些例子:
.main li a { color: #7ab2c1; } /* previous winner; specificity 12 */
.main .active a { color: #ff0000; } /* added class selector; specificity now 21 */
.primary p { font-size: 12px; } /* previous winner; specificity 11 */
#copyright { font-size: 8px;} /* switched to ID selector; specificity now 100 */
<nav class="main">
<ul class="group">
<li class="active"><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<footer class="primary">
<p><a href="#">Sign up</a> for our newsletter, it's a racket!</p>
<p id="copyright">Copyright © Sven's Snowshoe Emporium.
All Rights Reserved.</p>
</footer>
参考文献:
- 如何使CSS类优先于id
- CSS特定性
- CSS特殊性:你应该知道的事情
- 之间的关系!重要和CSS特异性
您可以将.copyright
更改为许多内容,但对我来说,以下两项中的一项似乎最符合逻辑:
.primary .copyright
或
p.copyright
特异性应该做的是查看选择器的特异性有多强,并决定是否应该遵循该规则。
- 媒体查询内部的CSS比外部完全相同的CSS更具体
- Id比类更具体
html body section p.special.selected:hover
比p
更具体- 等等
有一大堆规则可以让你的选择者对每个部分都有"分数"。要点越多,就越具体。经过大量的练习,你可以在不考虑的情况下重写统治CSS
在本例中,您试图使设置要覆盖的属性的选择器不那么特定。这样,你就不必花太多的时间来推翻它们。
让我们看看
.main li a {
color: #7ab2c1;
}
.active a {
color: #826c55 !important;
}
.main li a
非常具体:它在类名中包含main
的元素中选择li中的所有锚标记。你怎么能不那么具体呢?根据您的标记,
.main a {
color: #7ab2c1;
}
不太特定,仍然适用,并且会被.active
选择器覆盖,因为它具有相同的特定性(一个类+一个元素)。nav a
甚至普通的旧a
也可以作为选择器,这取决于您希望应用该规则的程度(或程度)。
现在,让我们看看页脚。
.primary p {
font-size: 12px;
}
.copyright {
font-size: 10px !important;
}
我们如何才能使第一个选择器不那么具体?把它改成怎么样
p {
font-size: 12px;
}
您的.copyright
选择器更具体,会覆盖它(但是,所有p
元素的默认font-size
都是12px
,这可能不是您想要的)。
我们可以将其限制在页脚:
.primary {
font-size: 12px;
}
这将限制font-size
属性仅限于页脚元素,并允许您使用后续规则覆盖它。
通常,您试图根据特定性值进行重构,以使要覆盖的内容具有尽可能小的特定性值。您可以使用最通用的选择器来实现这一点,这些选择器将应用您想要的规则,而不将这些规则应用于不应该具有规则的元素。
基本上使用html标签作为选择器会增加少量的特异性,使用类会增加中等的特异性、使用ID会增加大量的特异性以及使用!important
胜过一切。
.main li a
选择器使用1类+2个html标记,而.active a
仅使用1类+1个html标记。前者比后者具有更多的特异性,但使用!important
会覆盖这一点,并强制应用后者的样式。
为了消除对!important
的需求,您需要a)降低.main li a
的特异性,或者b)增加.active a
的特异性。我建议选择a,并将选择器更改为.main a
。这与.active a
具有相同的特异性,但由于CSS的级联性质,最后出现的样式将被应用,不需要!important
。
第二个场景中的原理相同——.primary p
有1个类+1个html标签,而.copyright
只有1个类。在这种情况下,我会选择选项b,并将选择器更改为.primary .copyright
。2个类比1个类+1个html标签具有更高的特异性,并且该样式将在不需要!important
的情况下应用。
最终CSS:
.main a {
color: #7ab2c1;
}
.active a {
color: #826c55;
}
.primary p {
font-size: 12px;
}
.primary .copyright {
font-size: 10px;
}