La especificidad en CSS es el mecanismo que utilizan los navegadores para decidir qué regla de estilo se aplica a un elemento cuando existen múltiples reglas que podrían afectarlo y entran en conflicto. Funciona asignando un «peso» o «puntuación» a cada selector CSS. La regla con el selector de mayor especificidad será la que prevalezca.
Aunque no hay una «fórmula» matemática exacta que se sume, el cálculo se entiende mejor como una comparación de contadores para diferentes tipos de selectores, generalmente en este orden de importancia (de mayor a menor):
.mi-clase, .boton-activo).[type="text"], [href^="https://"]).:hover, :focus, :nth-child(), :first-child).p, div, h1, span).::before, ::after, ::first-letter).Cómo se comparan:
Cuando se comparan dos selectores, se mira el «número» obtenido en cada una de estas categorías, de izquierda a derecha (empezando por los IDs, luego Clases/Atributos/Pseudo-clases, y finalmente Elementos/Pseudo-elementos).
Ejemplos de puntuación conceptual (ID - Clases/Atributos/Pseudo-clases - Elementos/Pseudo-elementos):
p -> 0-0-1.miClase -> 0-1-0div.miClase -> 0-1-1#miId -> 1-0-0#miId .otraClase a:hover -> 1-2-1 (1 ID, 2 [clase + pseudo-clase], 1 Elemento)No añaden especificidad:
El selector universal (*), los combinadores (espacio, >, +, ~) y la pseudo-clase :where() no aumentan la especificidad. La pseudo-clase :not() en sí misma no añade, pero sí lo hacen los selectores dentro de sus paréntesis. :is() toma la especificidad de su argumento más específico.
Finalmente, la directiva !important aplicada a una declaración individual (ej. color: red !important;) anula todos los cálculos de especificidad, por lo que debe usarse con mucha precaución y solo como último recurso.