Non posso prevedere di !important
ostacolare le prestazioni, non intrinsecamente comunque. Se, tuttavia, il tuo CSS è pieno di indovinelli !important
, ciò indica che hai superato i selettori qualificati e che sei troppo specifico e sei a corto di genitori o qualificatori per aggiungere specificità. Di conseguenza, il CSS sarà diventato gonfio (che si ostacolano le prestazioni) e difficile da mantenere.
Se si desidera scrivere CSS efficienti, si desidera essere specifici solo quanto è necessario e scrivere CSS modulari . È consigliabile astenersi dall'utilizzare ID (con hash), concatenare selettori o selettori qualificati.
Gli ID con prefisso #
CSS sono viziosamente specifici, al punto che 255 classi non sovrascriveranno un id (violino di: @Faust ). Gli ID hanno anche un problema di routing più profondo, devono essere unici, questo significa che non puoi riutilizzarli per stili duplicati, quindi finisci per scrivere CSS lineari con stili ripetuti. La ripercussione di ciò varierà da progetto a progetto, a seconda della scala, ma la manutenibilità ne risentirà immensamente e, in casi limite, anche le prestazioni.
Come puoi aggiungere specificità senza !important
, concatenare, qualificarsi o ID (vale a dire #
)
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
Okay, allora come funziona?
Il primo e il secondo esempio funzionano allo stesso modo, il primo è letteralmente una classe e il secondo è il selettore di attributi. I selettori di classi e attributi hanno identica specificità. .eg1/2-bar
non eredita il suo colore .eg1/2-foo
perché ha una sua regola.
Il terzo esempio sembra selettori qualificanti o concatenati, ma non è nessuno dei due. Il concatenamento avviene quando si prefiggono i selettori con genitori, antenati e così via; questo aggiunge specificità. La qualificazione è simile, ma si definisce l'elemento a cui si applica il selettore. qualificazione: ul.class
e concatenamento:ul .class
Non sono sicuro di come chiameresti questa tecnica, ma il comportamento è intenzionale ed è documentato dal W3C
Sono consentite ricorrenze ripetute dello stesso selettore semplice che aumentano la specificità.
Cosa succede quando la specificità tra due regole è identica?
Come ha sottolineato @BoltClock , se ci sono più dichiarazioni importanti, allora specifica che quella più specifica dovrebbe avere la precedenza.
Nell'esempio che segue, entrambi .foo
e .bar
hanno identica specificità, quindi il comportamento ricade sulla natura a cascata del CSS, per cui l'ultima regola dichiarata nel CSS rivendica la precedenza cioè .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle