En ocasiones puede que nos encontremos con que, a pesar de haber definido correctamente un estilo, éste parezca no funcionar y no aplicarse al elemento. Puede que sea momento de comprobar si estamos ante un conflicto de jerarquias en CSS.
Aprovechando la jerarquía de estilos en CSS y conociendo cómo funciona, podremos evitar conflictos que nos pueden parecer un error e incluso evitar valores aplicables por herencia. Veamos algunos ejemplos de reglas.
En una situacion normal, podemos tener un codigo CSS como este:
Esto es un texto del parrafo
Lógicamente, el texto se mostrará simplemente en color negro y 12 pixeles.
Vamos a añadir algo más:
Esto es un texto del parrafo
Veremos el parrafo en negro y 12 pixeles, ya que el estilo .parrafo tiene preferencia sobre ‘p’ (aunque parezca una obviedad, en seguida veremos la explicación teórica de por qué es así). El resultado es:

Pero hagamos un pequeño cambio:
Esto es un parrafo
Esto es otro parrafo
Curiosamente, en esta ocasión también veremos el segundo parrafo en rojo y a un tamaño de 20 pixeles (pese a aplicarle class=”parrafo”):

?Dónde está el problema? Básicamente en el concepto de jerarquía a la hora de resolver conflictos. Esta jerarquía depende de 2 ideas:
- Especifidad
- Lugar y orden de definición.
La especifidad implica que cuando un elemento se vea afectado por dos o más reglas y exista conflicto entre sus declaraciones tendrán preferencia las de la regla más específica.
Esta especifidad conlleva una jerarquia en los tipos de regla utilizada:
- Los id tienen preferencia sobre las clases y las etiquetas
- Las clases tienen preferencia sobre las etiquetas
- En cualquier caso, los estilos definidos dentro de la etiqueta me diante el atributo “style” (inline) tienen preferencia sobre las reglas declaradas en el encabezado del documemto (embedded) y éstas sobre las definidas en un archivo css externo (linked, enlazado con @import)
- En caso de empate, tiene preferncia la última regla definida
Si recordamos el segundo ejemplo:
Veremos que la clase sobreescribe la etiqueta (a causa del punto 2: ).
El ejemplo 3 (‘#contenido p’ frente a ‘.parrafo’) puede ser un poco menos evidente, pero existe una forma sencilla de calcular, en caso de conflicto, qué regla tiene preferencia sobre otra (no es 100% eficaz, pero sí lo es al 99%):
La formula es la siguiente:
(Numero de id’s en el selector x 100)+(numero de clases en el selector x 10)+(numero de etiquetas en el selector)
Por tanto, en el tercer ejemplo, la operacion resultante es:
- #contenido p = 101
- .parrafo = 10
Y por ello la primera regla tiene preferencia. Recordando de nuevo el ejemplo 2:
- p=1
- .parrafo=10
¿Como podemos superarlo? Si hubieramos definido las reglas como:
El resultado del cálculo será:
- #contenido p= 101
- #contenido p.parrafo = 111

Conseguir?amos para #contenido p.parrafo un peso de 111, por lo que adquiere preferencia sobre #parrafo a secas (peso=100), utilizando por tanto el color negro y 12 px.El resto del bloque div conservar?a el estilo de #parrafo p.
Es decir, a trav??s de una mayor especifidad podemos evitar problemas
Aparte de utilizar una mayor especifidad para resolver este tipo de conflictos, existe otra solución, no tan recomendable, pero sí eficaz: El valor !important, que tiene preferencia sobre cualquier regla existente (por eso conviene utilizarla con precaución).:
Con !important escrito detr?s de un valor podemos sobreescribir cualquier otro que en principio tendr?a preferencia:
texto
El resultado es:

Y por último, un ejemplo de cómo el lugar donde se defina la regla influye en su jerarquía (punto 3): Hemos definido una clase .parrafo, la hemos aplicado a una etiqueta
y hemos añadido a ésta un estilo interno (inline):
texto
El resultado es éste (style sobreescribe a la clase para el conflicto en el tamaño de fuente):

Excelente artÃculo
muchas gracias por el tutorial, en la uni estamos aprendiendo css con xhtml mediante netbeans como materia y la maestra no explica nada, muy claro
Excelente explicacion
Muy útil e interesante. Gracias.