Siendo específico

Este tema debe ser uno de los artículos griales de CSSLab, y podría aportar en la solución de más de algún problema con el maqueteado CSS. La especificidad es una técnica que debe ser entendida muy a fondo, para que pueda ser abordada sin problemas posteriores, donde lo más común es cuando se escriben estilos para un mismo elemento y el browser no lo despliega como lo estipulamos. En esos momentos, lo más probable (aparte del error de que pueda estar mal escrito) es que haya conflictos de especificidad. Y mientras más grandes los archivos CSS (grandes me refiero a más de 1000 líneas), más difícil es controlar estos conflictos.

Son varias las reglas que implican la especificidad. Comencemos.

1.

Si los selectores son iguales, entonces el último escrito (el de más abajo en el código, ya que el browser lee los archivos de arriba hacia abajo) es el que toma importancia:

p { font-size: 1em; }
p { font-size: 1.5em; }

Entonces <p> tendrá el tamaño de texto de 1.5em. Esto es cuando los selectores son declarados de la misma forma, como en el ejemplo anterior. Vamos con otro:

2.

Para: <ul><li><a href="">Link</a></li></ul>

ul li a { color: #f00 }
a { color: #333 }

Si siguiéramos la misma filosofía, el link de una lista tendría color gris oscuro porque fue declarado después. Pero como hemos sido más específico diciendo que el link en un elemento de una lista (ul li a) es rojo, éste gana predominancia y finalmente se muestra rojo, no gris porque hemos sido más específicos con ello. Básicamente, esta regla dice: mientras más específico el selector, más preferencia tendrá por sobre otros estilos. Existen cálculos creados para ayudar a evitar errores en esto:

Selectores HTML tienen valor 1

p tendrá especificidad 1
(p = 1)

ul li a tendrá especificidad 3
(ul+li+a = 1+1+1 = 3)

Selectores de Class tienen valor 10

.nombreclass tendrá especificidad 10
(.nombreclass = 10)

div p.nombreclass tendrá especificidad 12
(div+p+.nombreclass = 1+1+10)

Selectores de ID tienen valor 100

#nombreid tendrá especificidad 100
(#nombreid = 100)

body #nombreid .nombreclass p tendrá especificidad 112
body+#nombreid+.nombreclass+p = 1+100+10+1 = 112

3.

Selectores universales tienen especificidad 0, tales como * y body

4.

Estilos inline (esos que son dados dentro del mismo HTML mediante el atributo style="") tienen la mayor especificidad de todas.

<p style="color: blue;">Texto en azul</p>

Finalmente, un par de consejos:

  • Trata de evitar !important. De eso se trata todo esto, entender cómo funciona para que no tengas que parchar utilizando métodos que causan más problemas de los que soluciona.
  • - No te vuelvas loco especificando. Sería insano toparse con:
body div#container div#menu ul li ul.submenu li a
  • - Ahorra especificidad no yendo atrás más que 2 o 3 niveles para evitar conflictos, como por ejemplo:
#menu li a

Links:

Sobre el Autor: Jorge Epuñan

Soy quien escribe en este sitio: diseñador gráfico de profesión, desarrollador web por preferencia y amante de la interacción humano-computador. Cuando no pienso en web, salgo a trotar por mis barrios en Santiago, Chile o me junto con amigos a un bar a conversar sobre nuevas tendencias y tecnologías. Twitter profesional y personal, además del Contacto.

  1. Sebastian

    Buen consejo. No sabía lo de los valores para cada selector. Según entiendo el browser va “leyendo” valores de menor a mayor? Siempre es bueno algo nuevo de grámatica. Interesante artículo.
    Saludos.

  2. claudio

    GRACIAAAAAAS!
    no saben lo mucho que me han solucionado la vida

  3. Eduardo

    Guau. Ojo, que no es problema sólo de hojas de más de mil líneas… ¿Han intentado solucionar rápidamente un problema en uyn sitio ya hecho… en Dreamweaver?

    Sí, esos con clases “estilo1″.

    Gracias!

  4. Victor San Martin

    wow, no tenia idea de los valores que representaba cada tipo de declaración!!! genial.

    Saludos

  5. luigix

    Interesante artículo, sin duda.
    Yo tampoco sabía acerca del peso de cada selector.

    Gracias por la información.

  6. pollaki

    muy buen articulo!! exelente..

  7. fearlex

    Excelente articulo, lo del valor de los selectores, es por ponerles un valor, o de veras ese es el valor que tienen ? Es la primera vez que oigo eso, aunque guiandome por estos valores se me facilita la vida mucho mas. :D

    Saludos

  8. Jorge Epuñan

    Asi lo define W3C fearlex. Salu2.

  9. php tutorial

    Already saw this article at your site. But in another language.

  1. [...] injects a specific class when it is in the range you’ve activated. Through CSS and a bit of specificity, ...
    CSSLab - jQuery browserSizr
1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221| valtrex viagra where to buy melbourne buy eriacta from canada overnight cialis delivery usa cialis and viagra for sale buy online drug viagra pharmacy generic viagras names viagra overnight delivery usa generic nolvadex generic viagra 50mg for sale online viagra no precription get free viagra non prescription viagra online tadalafil prix where to purchace generic viagraAccutane Online Doxycycline online Buy Cheap Lexapro Online No Prescription Prednisone Online Buy Accutane No Prescription