No puedo prever !important
obstaculizar el rendimiento, no inherentemente de todos modos. Sin embargo, si su CSS está plagado !important
, eso indica que ha superado los selectores de calificación y que es demasiado específico y se ha quedado sin padres o calificadores para agregar especificidad. En consecuencia, su CSS se habrá hinchado (lo que impedirá el rendimiento) y será difícil de mantener.
Si desea escribir CSS eficiente, entonces debe ser tan específico como sea necesario y escribir CSS modular . Es recomendable abstenerse de usar ID (con hashes), encadenando selectores o selectores calificados.
Los ID con prefijo #
CSS son viciosamente específicos, hasta el punto de que 255 clases no anularán un id (violín por: @Faust ). Sin embargo, los ID también tienen un problema de enrutamiento más profundo, tienen que ser únicos, esto significa que no puede reutilizarlos para estilos duplicados, por lo que termina escribiendo CSS lineal con estilos repetitivos. La repercusión de hacer esto variará de proyecto a proyecto, dependiendo de la escala, pero la capacidad de mantenimiento sufrirá inmensamente y, en casos extremos, también el rendimiento.
¿Cómo puede agregar especificidad sin !important
encadenar, calificar o ID (es decir #
)
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
Bien, entonces, ¿cómo funciona eso?
El primer y el segundo ejemplo funcionan igual, el primero es literalmente una clase y el segundo es el selector de atributos. Las clases y los selectores de atributos tienen una especificidad idéntica. .eg1/2-bar
no hereda su color .eg1/2-foo
porque tiene su propia regla.
El tercer ejemplo parece calificar o encadenar selectores, pero no lo es. El encadenamiento es cuando prefijas selectores con padres, antepasados, etc. Esto agrega especificidad. La calificación es similar, pero usted define el elemento al que se aplica el selector. calificación: ul.class
y encadenamiento:ul .class
No estoy seguro de cómo llamarías a esta técnica, pero el comportamiento es intencional y está documentado por W3C
Se permiten repeticiones del mismo selector simple y aumentan la especificidad.
¿Qué sucede cuando la especificidad entre dos reglas es idéntica?
Como señaló @BoltClock , si hay varias declaraciones importantes, la especificación dicta que la más específica debe tener prioridad.
En el siguiente ejemplo, tanto .foo
y .bar
tienen idéntica especificidad, por lo que el comportamiento fallsback a la naturaleza en cascada de CSS, por lo que la última regla declarado en las solicitudes de CSS de precedencia es decir .foo
.
HTML
<div>
<p class="foo bar">foobar</p>
</div>
CSS
.bar {
color: blue !important;
}
.foo {
color: red !important;
}
JSFiddle