Não posso prever !important
impedimentos de desempenho, de forma alguma inerentemente. Se, no entanto, seu CSS estiver cheio !important
, isso indica que você superou os seletores de qualificação e é muito específico e ficou sem pais ou qualificadores para adicionar especificidade. Consequentemente, o seu CSS terá tornar-se inchado (que irá impedir o desempenho) e difícil de manter.
Se você quer escrever CSS eficiente, então você quer ser única tão específico quanto você precisa ser e escrever CSS modular . É aconselhável abster-se de usar IDs (com hashes), seletores de encadeamento ou seletores qualificados.
Os IDs prefixados #
no CSS são violentamente específicos, a ponto de 255 classes não substituirem um ID ( violar por: @Faust ). Os IDs também têm um problema roteado mais profundo, eles precisam ser únicos, o que significa que você não pode reutilizá-los para estilos duplicados; portanto, você acaba escrevendo CSS linear com estilos repetidos. A repercussão de fazer isso varia de projeto para projeto, dependendo da escala, mas a manutenção sofrerá imensamente e, em casos extremos, o desempenho também.
Como você pode adicionar especificidade sem !important
, encadeamento, qualificação ou IDs (a saber #
)
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
Ok, então como isso funciona?
O primeiro e o segundo exemplos funcionam da mesma forma, o primeiro é literalmente uma classe e o segundo é o seletor de atributos. Os seletores de Classes e Atributos têm especificidade idêntica. .eg1/2-bar
não herda sua cor .eg1/2-foo
porque tem sua própria regra.
O terceiro exemplo parece com seletores de qualificação ou encadeamento, mas não é. O encadeamento é quando você prefixa os seletores com os pais, ancestrais e assim por diante; isso adiciona especificidade. A qualificação é semelhante, mas você define o elemento ao qual o seletor está se aplicando. qualificação: ul.class
e encadeamento:ul .class
Não sei ao certo como você chamaria essa técnica, mas o comportamento é intencional e está documentado pelo W3C
Ocorrências repetidas do mesmo seletor simples são permitidas e aumentam a especificidade.
O que acontece quando a especificidade entre duas regras é idêntica?
Como o @BoltClock apontou , se houver várias declarações importantes, a especificação determina que a mais específica deve ter precedência.
No exemplo abaixo, ambos .foo
e .bar
têm especificidade idêntica, portanto, o comportamento recai na natureza em cascata do CSS, pelo qual a última regra declarada no CSS reivindica precedência .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle