“It's a repeating visual pattern, that can be abstracted into an independent snippet of HTML, CSS and possibly JavaScript.”
En CSS, la especificidad, es lo que determina que estilo será el que acabará aplicandose a un elemento determinado.
Cuando a un elemento se le aplica más de un selector con reglas que actúan sobre la misma propiedad, es la especificidad la encargada de resolver este conflicto.
A grandes rasgos podemos ordenar los diferentes tipos de selectores de menor a mayor peso específico de la siguiente manera:
0,0,0,0
p {
color: red;
}
0,0,0,1
.text {
color: red;
}
0,0,1,0
#main strong { color: red; }
0,1,0,1
header ul#main-nav .sub-menu li.child a:hover { color: red; }
0,1,3,4
<p style="color: red">Lorem ipsum dolor sit amet, consectetur adipisicing elit.</p>
1,0,0,0
p { color: red !important; }
0,0,0,1 0,0,0,0
El gráfico de especificidad es una representación de cómo se distribuye la misma a lo largo de una hoja de estilo.
Es recomendable que la especificidad vaya aumentando gradualmente, empezando con estilos más genéricos (selectores de elemento) y acabando con casos más específicos.
The Specificity Graph - Harry Roberts
Intentar mantener los selectores lo más cortos posibles (evitar nesting) nos ayudará a que nuestros componentes no estén atados a un contexto determinado y sean independientes del HTML.
/* Cuidado! */
#main-header nav ul > li .nav-link:first-child { ... } /* 0, 1, 2, 3 */
/* Mejor */
.MainNav-link--first { ... } /* 0, 0, 1, 0 */
"What we want is to be able to write code that is as transparent and self-documenting as possible. Transparency means that it is clear and obvious (to others) in its intent; self-documenting means that we don’t have to lose time to writing and reading lengthy, supplementary documentation."
.nombre-del-bloque { ... }
.nombre-del-bloque__elemento { ... }
.nombre-del-bloque--modificador { ... }
Refactorizando:
.tab-group { ... } /* 0, 0, 1, 0 */
.tab-group > li { ... } /* 0, 0, 1, 1 */
.tab-group a { ... } /* 0, 0, 1, 1 */
.tab-group a.selected { ... } /* 0, 0, 2, 1 */
.tab-group { ... } /* 0, 0, 1, 0 */
.tab-group__tab { ... } /* 0, 0, 1, 0 */
.tab-group__link { ... } /* 0, 0, 1, 0 */
.tab-group__link--selected { ... } /* 0, 0, 1, 0 */