我正在尝试理解CSS中的特异性。
我目前的理解是特异性与继承非常相似,但在某些方面更具体地定义。
Mozilla Specificity Definition:
特异性是浏览器决定哪些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>
有人能指导我完成重构过程,以帮助我掌握基本概念吗?
答案 0 :(得分:2)
一个类的特异性为10.一个元素的特异性为1.
因此,在第一个实例中:
.main li a
选择器的特异性为12。.active a
选择器的特异性为11 因为它们都瞄准相同的元素,前者具有更高的特异性,后者失去了对元素进行样式化的战斗。
在第二个例子中:
.primary p
选择器的特异性为11。.copyright
选择器的特异性为10。同样,因为它们都针对相同的元素,而前者具有更高的特异性,后者失去了对元素进行样式化的战斗。
!important
annotation胜过所有特异性。因此,应用该值后,.active a
和.copyright
会重新获取元素。
如果你想删除!important
,这是正确的做法,因为这里没有必要,你可以提高选择器的特异性。
ID
的特异性为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 */
&#13;
<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>
&#13;
参考文献:
答案 1 :(得分:1)
您可以将.copyright
更改为很多内容,但以下两项中的一项似乎对我来说最合乎逻辑:
.primary .copyright
或
p.copyright
应该做什么特殊性,看一下你的选择器具体的方式,并决定是否应遵循该规则。
html body section p.special.selected:hover
比p
有很多规则可以让你的选择器“点”与每个部分。分数越多,越具体。经过大量的练习,你可以在不考虑它的情况下编写过多的CSS。
答案 2 :(得分:1)
在此示例中,您尝试使选择器设置您希望覆盖的属性不太具体。这样,你就没有去覆盖它们了。
让我们来看看
.main li a {
color: #7ab2c1;
}
.active a {
color: #826c55 !important;
}
.main li a
非常具体:它在其className中的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
这会将[...] I want to get ?id=2 while '2' selected.
属性限制为只有页脚元素,并允许您使用后续规则覆盖它。
一般情况下,您尝试根据specificity values进行重构,以使您想要覆盖的内容具有可能的最小特异性值。您可以使用大多数通用选择器来执行此操作,这些选择器将应用您需要的规则,而不将这些规则应用于不应具有这些规则的元素。
答案 3 :(得分:1)
基本上使用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;
}