Je ne peux pas prévoir d' !important
entraver les performances, pas intrinsèquement de toute façon. Si, cependant, votre CSS est criblé !important
, cela indique que vous avez dépassé les sélecteurs de qualification et que vous êtes trop spécifique et que vous n'avez plus de parents ou de qualificatifs pour ajouter de la spécificité. Par conséquent, votre CSS sera gonflé (ce qui entravera les performances) et difficile à maintenir.
Si vous voulez écrire CSS efficace alors vous voulez être seulement aussi précis que vous devez être et écrire CSS modulaire . Il est conseillé de s'abstenir d'utiliser des identifiants (avec des hachages), de chaîner des sélecteurs ou des sélecteurs éligibles.
Les identifiants préfixés #
en CSS sont vicieusement spécifiques, au point que 255 classes ne remplaceront pas un identifiant (violon par: @Faust ). Les identifiants ont également un problème de routage plus profond, ils doivent être uniques, cela signifie que vous ne pouvez pas les réutiliser pour les styles en double, vous finissez donc par écrire des CSS linéaires avec des styles répétitifs. La répercussion de cette opération variera d'un projet à l'autre, selon l'échelle, mais la maintenabilité en souffrira énormément et, dans les cas extrêmes, les performances aussi.
Comment pouvez-vous ajouter de la spécificité sans !important
, chaîner, qualifier ou ID (à savoir #
)
HTML
<div class="eg1-foo">
<p class="eg1-bar">foobar</p>
</div>
<div id="eg2-foo">
<p id="eg2-bar">foobar</p>
</div>
<div class="eg3-foo">
<p class="eg3-foo">foobar</p>
</div>
CSS
.eg1-foo {
color: blue;
}
.eg1-bar {
color: red;
}
[id='eg2-foo'] {
color: blue;
}
[id='eg2-bar'] {
color: red;
}
.eg3-foo {
color: blue;
}
.eg3-foo.eg3-foo {
color: red;
}
JSFiddle
D'accord, alors comment ça marche?
Les premier et deuxième exemples fonctionnent de la même manière, le premier est littéralement une classe et le second est le sélecteur d'attributs. Les sélecteurs de classes et d'attributs ont une spécificité identique. .eg1/2-bar
n'hérite pas de sa couleur .eg1/2-foo
car il a sa propre règle.
Le troisième exemple ressemble à des sélecteurs de qualification ou de chaînage, mais ce n'est ni l'un ni l'autre. Le chaînage consiste à préfixer des sélecteurs avec des parents, des ancêtres, etc. cela ajoute de la spécificité. La qualification est similaire, mais vous définissez l'élément auquel le sélecteur s'applique. qualification: ul.class
et enchaînement:ul .class
Je ne sais pas ce que vous appelleriez cette technique, mais le comportement est intentionnel et est documenté par le W3C
Les occurrences répétées du même sélecteur simple sont autorisées et augmentent la spécificité.
Que se passe-t-il lorsque la spécificité entre deux règles est identique?
Comme l'a souligné @BoltClock , s'il y a plusieurs déclarations! Importantes, les spécifications dictent que la plus spécifique doit avoir la priorité.
Dans l'exemple ci - dessous, à la fois .foo
et .bar
avoir une spécificité identique, de sorte que le fallsback comportement à la nature en cascade des CSS, dans lequel la dernière règle déclarée dans les revendications CSS priorité à savoir .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle