Calculando la especificidad en CSS

Visita este artí­culo en http://www.estadobeta.com/2006/08/23/calculando-la-especificidad-en-css/

Por Ismael en CSS, artículos, tips

Sencilla formula para calcular la especificidad de los selectores CSS

Mestinon For Sale Septilin No Prescription Buy Abana No Prescription Buy Online Avodart Buy Himcolin Online Hytrin For Sale Levitra No Prescription Buy Proscar No Prescription Buy Online Lopid Buy Zebeta Online Azulfidine For Sale Karela No Prescription Buy Clomid No Prescription Buy Online Loxitane Buy Actoplus Met Online Capoten For Sale Celebrex No Prescription Buy Retin-A No Prescription Buy Online Prednisone Buy Levitra Online Prednisone For Sale Tricor No Prescription Buy Tramadol No Prescription Buy Online Lamisil Buy Inderal Online

La especificidad en CSS es la importancia que tiene determinado selector sobre otros. Por ejemplo, el selector


a.un-link { color:blue; }

Es más específico que


p a { color:red; }

Sin importar en qué lugar del código se encuentren, el link del ejemplo terminará siendo azul porque las clases CSS tienen más peso -especificidad- que los elementos HTML a secas. Igualmente, las ID (por ej. a#link-especial {color:yellow;}) son más específicas que las clases y elementos.

Pero ¿cómo calculamos con mayor precisión la especifidad de nuestros selectores?

Primero lo primero. Evita usar important!. La palabra important! fuerza un selector a ser más específico que todos los demás en el documento, sin importar la profundidad del selector. El peligro de esto es que, si luego quieres sobreescribir esos estilos para determinado elemento, debes volver a usar important! y tu hoja de estilos se vuelve difícil de mantener.

Segundo, usa la mínima profundidad necesaria para afectar los elementos que quieras. No uses p a.un-link{...} si .un-link{...} es suficiente. Esto te permitirá aumentar la profundidad para elementos específicos más adelante. En este artículo hablo más de esto y otras buenas prácticas.

Dicho todo esto, hay una sencilla fórmula que permite evaluar la especificidad de los selectores, según sean sólo de elementos, de clase o de id.

Un elemento simple (a) tiene un valor de 1. Un selector de clase (.un-link) tiene un valor de 10. Un selector de id (#link-especial) tiene un valor de 100. Los browsers calculan el valor total de un selector sumando estos valores, es decir:

  • p tiene una especificidad de 1 (1 selector de elemento)
  • p a tiene una especificidad de 2 (2 selectores de elemento, 1 + 1 = 2)
  • .un-link tiene una especificidad de 10 (1 selector de clase)
  • p a.un-link tiene una especificidad de 12 (2 selectores de elemento + 1 de clase, 1+1+10 = 12)
  • #contenido tiene una especificidad de 100 (1 selector de id)
  • body #contenido a.un-link tiene una especificidad de 112 (1+100+1+10 = 112)

En general un poco de sentido común es suficiente para construir hojas de estilo mantenibles, pero esta simple escala puede ser útil para proyectos más grandes o con varias hojas de estilos.

Fuentes

All That Malarkey tiene un excelente -y divertido- artículo donde compara el poder de los selectores con los personajes de Star Wars (el selector de elemento es un Stormtrooper, el de clase es Darth Vader y el de id, el Emperador). Además tiene una ficha donde las figuras del Lado Oscuro de la Fuerza nos ilustran los detalles de la cascada CSS. Pueden encontrar más información en HTML Dog, en el Blog de Molly y por supuesto en la W3C para los duros de estómago.

CSS, cascade, web design, standards

6 comentarios para “Calculando la especificidad en CSS”

  1. GravatarSebastian Dice:

    Como siempre Ismael, bueno, bueno. No tenía idea que los selectores podían tener valores, me imagino que eso hace que finalmente el CSS suba de “peso”?.
    En mi caso siempre hago clases específicas cuendo sea necesario, y no me he acostumbrado a trabajar estilos con mucha profundidad.
    Eso.
    Fuera del tema: detalles del clearfix.
    Saludos.

  2. GravatarDiego Díaz Dice:

    Interesante articulo, como siempre.
    Personalmente, no tenido oportunidad de desarrollar un sitio grande, pienso que ahí podria poner a prueba muchas de estas prácticas para ordenarse con la hoja de estilos.
    Actualmente he optado por mantener un orden mas comun:

    #nombre_id a (hover, etc) {...}; ó
    #nombre_id .alguna_clase a (hover, etc) {..};

    segun dependiendo…

    Saludos cordiales.

  3. GravatarIsmael Dice:

    Sebastian, a qué te refieres con que el CSS suba de peso?
    Usar aunque sea un grado de profundidad es útil para evitar la redundancia: por ejemplo si tienes un UL con una clase:

    
    <ul class="menu“>
        <li>…</li>
        <li>…</li>
        <li>…</li>
    </ul>
    
    

    no es necesario ponerle una clase a cada LI. Basta con usar la cascada para aplicar estilo a todos los LI dentro del UL:

    
    .menu li {
        float:left;
        border:solid gray 1px;
        margin-left:.5em;
    }
    
    

    Qué necesitas saber sobre clearfix?

  4. Gravatarlinks for 2006-09-07 en blackblogandroll Dice:

    […] Calculando la especificidad en CSS Sencilla formula para calcular la especificidad de los selectores CSS (tags: css webstandards tips articulos castellano) […]

  5. GravatarIván Dice:

    Hola Sebastián,

    Esos valores no son peso o memoria específica. Son valores asignados a un elemento. No tiene nada que ver con el tamaño (Kbytes) de un archivo, fichero o documento.

    Solo este apunte :)

    Muy bueno el artículo, Ismael. He conocido tu página hoy mismo y comparto tu afición por los estándares, aunque veo que tu ya tienes bastante recorrido ;) Pero vamos, que Stuff, Clear:left, etc.. son mi pan de cada dia :)

    Saludos,

    Iván

  6. GravatarProblemas con tamaño de texto en el body - Foros del Web Dice:

    […] con tamaño de texto en el body Quizas tengas problemas de especificidad en tu codigo. Aqui tienes una explicacion en español por si no sabes ingles. Otra cosa, sin codigo, no se me […]

Deja un comentario

XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>