Webmaster Libre

Desarrollo web con software libre

Buscador

Div Mania

Cada día más y más documentos web parecen estar compuestos por nada más que una colección de elementos div. En la mayoría de los casos, un mejor uso de los selectores CSS podría haber evitado la innecesaria proliferación de elementos div

Os presento la traducción del documento Div Mania publicado por Juicy Studio

¿Qué es la “Div Manía”?

Los elementos div y span fueron introducidos en la especificación de HTML 4 para proveer un mecanismo genérico para agrupar y dar estructura a los documentos. El elemento div es un contenedor en bloque (block) y span es un contenedor en linea (inline).
Un elemento id y/o class suele asociarse con el div o span para utilizarlo como ancla para estilos css o scripting. La Div Mania surge cuando los desarrolladores han reemplazado los layouts creados con tablas por layouts CSS, pero han abusado de los elementos div hasta el punto de casi crear su propio lenguaje compuesto básicamente de elementos div anidados.
El elemento div es semánticamente neutro: no tiene ningún otro significado a parte de ser un contenedor. Debe usarse cuando no exista otro elemento que pueda actuar como contenedor, no como reemplazo de elementos con un significado reconocido y aceptado, como los encabezados, párrafos, listas, etc.
Un documento típico de la “Div Mania” es algo así:


<div id="wrapper">
    <div id="container">
        <div id="navigation">
           <div id="navhead">
            ...
            </div>
            <div id="navcontent">
            ...
            </div>
        </div>
        <div id="content">
           <div class="panel">
            ...
            </div>
            <div class="panel">
            ...
            </div>
        </div>
    </div>
</div>

Los desarrolladores que incurren en la trampa “Div Mania” generalmente están desprevenidos. Pasa un documento con Div Mania por un validador automático y, mientras el documento sea estructuralmente válido, se confirmará que es (x)HTML válido, ya que estos servicios son incapaces de determinar si se han utilizado las etiquetas más apropiadas o no.
Hay muchos factores que pueden contribuir a la Div Mania, incluyendo una falta de comprensión de los elementos de formato (atención a los elementos obsoletos), el modelo de cajas CSS, herencia y cascada y la elección de selectores adecuados.
Hablando con desarrolladores, que tienen un manejo razonable de CSS, para crear una página Div Mania, parece que el factor fundamental es un pobre entendimiento de los selectores. El resto del documento consistirá en una visión general de los selectores CSS.

Juego de Reglas

Un documento CSS está compuesto por una colección de reglas, donde una regla consiste en un selector acompañado de un bloque de declaraciones. Como lo más probable es que haya más de una regla, una colección de reglas se llama frecuentemente rule-set o juego de reglas. El selector determina a que elementos en el árbol del documento se aplicarán las reglas. Si el selector no es válido el agente de usuario ignorará todo el bloque de declaraciones. El bloque de declaración es una lista separada por punto y coma (”;”) de una o varias declaraciones (o ninguna), contenidas entre llaves (”{” y “}”). Cada declaración puede o estar vacia o estar compuesta por una pareja propiedad/valor, donde la propiedad y el valor se separan con dos puntos (”:”).
Consideremos la siguiente regla:


h1
{
   padding-top: 1em;
   border-bottom: 1px solid #ccc;
}

El selector es h1 y el bloque de declaración es todo lo comprendido entre las llaves y las llaves en si mismas. El bloque de declaración consiste en dos declaraciones separadas por punto y coma. Como el punto y coma sólo es requerido para separar declaraciones, el punto y coma final no es necesario, pero es legal. La primera declaración especifica una propiedad de padding-top con un valor de 1em
Lista de todas las propiedades de CSS 2.1

Especificidad de los Selectores

Entender como se aplican los selectores a los elementos requiere una comprensión básica de la herencia y la cascada. Herencia es cuando un elemento hereda propiedades de sus ancestros. Por ejemplo, el tamaño de fuente establecido en la navegación sería heredado por todos los elementos incluidos en la navegación, como parrafos y elementos de lista. No todas las características son heredadas por sus descendientes, aunque la mayoría lo son. En los casos en que las propiedades no sean heredadas, puede utilizarse el valor inherit para forzar la herencia.


*.warning
{
    color: inherit;
}

Cascada es cuando un elemento tiene múltiples reglas definidas y la Especificidad es usada para determinar que definiciones serán aplicadas. El orden es importante: cuando dos selectores tienen la misma especificidad, se aplica el último definido.

Selectores CSS

Los selectores son reglas conformes a unos patrones que determinan a que elementos del arbol del documento serán aplicadas las reglas de estilo. En el ejemplo anterior, el patrón del selector es el elemento h1. Pueden utilizarse patrones más complejos para ser más específico sobre que elementos van a ser los sujetos del selector, basados en la posición del elemento en el árbol del documento.

El Selector Universal

El selector universal se marca con un asterisco “*” y abarca a todos los elementos del documento. El siguiente ejemplo aplicaría un fondo amarillo pálido a todos los elementos que soportasen la propiedad background-color salvo que se usase un selector más específico. Para el resto de definiciones no mencionaré la especificidad de nuevo pero es importante recordar que las reglas de los próximos ejemplos sólo se aplicarán si no existe un selector más específico.


*
{
    background-color: #ffc;
}

El siguiente ejemplo podría ser aplicado a todos los elementos que tengan como nombre de clase attention


*.attention
{
    background-color: #ffc;
}

Cuando el asterisco forma parte de un patrón, como en el ejemplo anterior, puede ser omitido tranquilamente. Un patrón de .attention sería igual de efectivo que *.attention

Selector por Tipo

Los selectores por tipo afectan a todas las apariciones de un elemento en el documento. El siguiente ejemplo aplica un fondo amarillo pálido a todos los elementos p del documento.

p
{
    background-color: #ffc;
}

Agrupando Selectores

Cuando varios selectores van a compartir el bloque de declaraciones, los selectores pueden ser agrupados separándolos con una coma. El siguiente ejemplo aplicará un fondo amarillo pálido a todos los elementos strong y em

strong, em
{
    background-color: #ffc;
}

El selector CLASS

El selector class puede utilizarse como alternativa al selector attribute. El atributo class se indica con un punto . y se aplica a todos los elementos del documento con esa clase. El siguiente ejemplo aplicará un fondo amarillo pálido a todos los elementos li marcados por la clase attention

li.attention
{
    background-color: #ffc;
}

Si la clase va a ser aplicada a un número de elementos, estos pueden definirse de forma individual, agruparse o utilizarse el selector universal (*.classnameo .classname)

El selector ID

El atributo id debe ser único dentro del documento web, por tanto sólo puede aplicarse a una única aparición de un elemento dentro del árbol del documento. El selector CSS para indicar los id es la almohadilla #. El siguiente ejemplo aplicará un fondo amarillo pálido al encabezamiento de nivel 2 que tenga el id único offers

h2#offers
{
    background-color: #ffc;
}

Dado que el selector id debe ser único, es totalmente seguro utilizar el selector universal (*#idname o #idname). Para mejorar la legibilidad y la facilidad en el mantenimiento suele ser buena idea conservar el nombre del elemento en su lugar.

Selectores Descendentes

El árbol del documento está organizado de tal forma que cada elemento del árbol tenga un elemento padre, exceptuando el elemento raíz. Los selectores descendentes se usan para afectar a todos los elementos que descienden de un determinado padre. Los selectores descendentes se crean a partir de selectores separados por espacios, donde cada selector subsiguiente debe estar contenido en su predecesor. El siguiente ejemplo aplicará un fondo amarillo pálido a cualquier elemento strong contenido dentro de un párrafo, p.

p strong
{
    background-color: #ffc;
}

Selectores Hijo

Un selector hijo se usa para afectar a un hijo de determinado elemento. Los selectores hijo se designan utilizando >, con el padre a la derecha y el hijo a la izquierda. El siguiente ejemplo aplicará un fondo amarillo pálido a todos los elementos strong que sean hijos de p.

p>strong
{
    background-color: #ffc;
}

La diferencia entre el selector hijo y el selector descendente es que éste último afecta a todos los elementos strong contenidos en un párrafo, mientras que el selector hijo afecta únicamente a los elementos strong que sean hijos de p. Consideremos el siguiente ejemplo:

<p>
Jon said,
<q>
That'll be good when it's <strong>finished</strong>.
</q>
If only he <strong>knew</strong>!
</p>

El selector descendente afectaría a los dos elementos strong, mientras que el selector hijo sólo afectaría al último dado que el primer elemento strong no es hijo de p si no de q

Desafortunadamente el Internet Explorer 6 no soporta los selectores hijo.

Selectores Hermanos Adyacentes

Los elementos hermanos son aquellos que comparten el mismo padre. Los hermanos adyacentes son aquellos que se encuentran uno junto al otro y comparten el mismo padre. Los selectores hermanos adyacentes se marcan con un signo más +. El siguiente ejemplo aplicaría un fondo amarillo pálido a todos los elementos h2 que sigan inmediatamente a un elemento h1 con el que compartan padre.

h1+h2
{
    background-color: #ffc;
}

Desafortunadamente el Internet Explorer 6 no soporta los Selectores Hermanos Adyacentes.

Selectores Atributo

Los selectores atributo afectan a los elementos que tengan definido un atributo en el árbol del documento.

[att]

El selector atributo básico afecta a todos los elementos que tengan establecido un atributo, independientemente del valor del mismo. El siguiente ejemplo aplicaría un fondo amarillo pálido a todos los elementos de ancla a los que se haya asignado un atributo title

a[title]
{
    background-color: #ffc;
}
[att=val]

Este selector se usa para afectar a los elementos que contengan un atributo con un valor específico. El siguiente ejemplo aplicará un fondo amarillo pálido a todos los elementos de ancla que contengan el atributo rel con un valor de external.

a[rel=external]
{
    background-color: #ffc;
}
[att~=val]

Algunos atributos permiten que se aplique una lista separada por espacios de valores. Poniendo una tilde ~ antes del signo igual permite que se aplique el bloque de declaraciones al elemento con el atributo donde uno de los valores dados sea exactamente el mismo. El siguiente ejemplo aplicaría un fondo amarillo pálido a todos los párrafos con la clase .attention

p[class~=attention]
{
    background-color: #ffc;
}

p[class~=attention] es el equivalente a p.attention

[att|=val]

Este selector se utiliza para seleccionar atributos cuyo valor contenga una lista separada por guiones. Este selector estaba pensado, en principio, para ser utilizado con códigos de lenguaje. El siguiente ejemplo afectaría a los elementos de ancla con un atributo hreflang que empieza por “en”, incluyendo en, en-US, en-GB, en-cockney, o cualquier otra combinación con “en”.

a[hreflang|=en]
{
    background-color: #ffc;
}

Pueden especificarse varios selectores atributo a la vez. El siguiente ejemplo utiliza dos selectores atributo que aplicarán un fondo amarillo pálido a todas las anclas que contengan un atributo tittle y un atributo rel con valor external

a[title][rel~=external]
{
    background-color: #ffc;
}

CSS 3 tiene algunos selectores atributo realmente interesantes, incluyendo un selector para buscar una coincidencia al principio del valor del atributo E[foo^="bar"], un selector para buscar una coincidencia al final del valor del atributo E[foo$="bar"] y un selector para buscar una cadena E[foo*="bar"]. Mozilla/Firefox y Opera soportan los selectores atributo. Mozilla/Firefox también soporta los propios de CSS 3. Ni que decir tiene que Internet Explorer 6 no soporta ningun tipo de selectores atributo.

Pseudo Selectores

Los pseudo selectores se utilizan en escenarios donde la posición del elemento dentro del árbol del documento no sea suficiente como selector, como en la primera línea de un párrafo.
Los pseudo elementos y las pseudo clases son utilizados para aplicar formato basado en información fuera del árbol del documento y están precedidos de “dos puntos” :

CSS 2.1 tiene cuatro pseudo elementos; :first-line, :first-letter, :before,y :after. El siguiente ejemplo aplica un font-size de 2em a la primera letra de un párrafo.

p:first-letter
{
    font-size: 2em;
}

CSS 2 tiene una pseudo clase :first-child, 2 pseudo clases para enlaces (:link y :visited), 3 pseudo clases dinámicas (:active, :hover y :focus y una pseudo clase para lenguaje (:lang). El siguiente ejemplo aplicaría un fondo amarillo pálido a todos los elementos de ancla que sean el primer hijo de cualquier elemento

a:first-child
{
    color: #090;
}

El siguiente ejemplo da color verde a todos los vínculos visitados

a:visited
{
    color: #090;
}

El siguiente ejemplo aplicaría un fondo amarillo pálido a los párrafos con un atributo lang de Francés

p:lang(fr)
{
    background-color: #ffc;
}

Conclusión

Un conocimiento pobre de los selectores no es la unica causa de la “Div Manía”, pero sí una de las más importantes. El elemento div es útil para agrupar y posicionar contenido, pero el CSS puede ser aplicado directamente a las listas y otros elementos más adecuados que tengan un significado aceptado.

“Traducido con el permiso de Juicy Studio

Esta entrada fue publicada por Alma Fernández el Saturday, 6 de May de 2006 y está archivada en: (x)HTML, CSS, Codigo. Puedes dejar un comentario, o enviar un trackback desde tu sitio.

21 Comentarios

Agrega el tuyo
  1. DIV Manía: cómo estructurar un documento sin tablas usando CSS…

    Magnífico artículo que ayudará a muchos a dar el paso necesario para construir sus propios CSS y estructurar debidamente sus webs con el aspecto ligero y elegante que requieren los nuevos tiempos ;)
    NOTA: Se trata de una traducción de un artículo…

    meneame.net 13 May, 2006

  2. [...] ¿Qué es la Div Manía?. Via Meneame [...]

    aNieto2K » Article » ¿Qué es la “Div Manía”? 13 May, 2006

  3. [...] Div Manía (castellano) [...]

    Flashblog » “Div manía” o el XHTML no semántico 13 May, 2006

  4. La Div Mania no se, pero que las fuentes de tu página son ilegibles con Firefox+Windows es bien cierto :)

    anonimo 14 May, 2006

  5. El articulo es mas que interesante.
    Lamentablemente en ningun lado se nos “enseña” que debemos hacer y que no, y contamos solamente con los “validadores” para aprender.

    Yo uso casi indiscriminadamente los divs, y los id y class; sin importarme realmente la semantica… pero insisto, aprendi yo solo, sin leer ningun libro ni nada, a prueba y error.

    Stahn 14 May, 2006

  6. lo de las fuentes es más que cierto, este theme es uno que encontré por ahí la verdad :P y no me paré a mirarlo mucho. prontito nuevo look mas legible :)

    senda 14 May, 2006

  7. [...] Buen artículo de Web Master Libre, sobre uno de los típicos temas que ocurren en la transición de tablas a CSS.  Cada día más y más documentos web parecen estar compuestos por nada más que una colección de elementos div. En la mayoría de los casos, un mejor uso de los selectores CSS podría haber evitado la innecesaria proliferación de elementos div. [...]

    BlogOnRails.com » Blog Archive » Que es la Div Mania ? 29 May, 2006

  8. [...] Divmanía [...]

    » Divmanía 29 May, 2006

  9. [...] Muy buen informe sobre “Div Mania” el error en el que aveces caemos los desarrolladores, por querer ser “Fundamentalistas de los estándares”. Cada día más y más documentos web parecen estar compuestos por nada más que una colección de elementos div. En la mayoría de los casos, un mejor uso de los selectores CSS podría haber evitado la innecesaria proliferación de elementos div [...]

    chblog » Div Mania 29 May, 2006

  10. [...] Esta traducción de DivMania publicado por Juicy Studio, realizada por webmarterlibre, nos recuerda de la importancia de no caer en la trampa de generar sitios a punta de cajas CSS. [...]

    Matiasjajaja - Novedades digitales y Web Actual » Blog Archive » Div Mania - acuerdate de no caer en la trampa 10 June, 2006

  11. Muy buen articulo, me clarifico muchas dudas.

    porquero 15 June, 2006

  12. Excelente aclaración sobre los selectores, pero debemos tener en cuenta que hay un pequeño problema… Microsoft Explorer actualmente no reconoce ningún selector excepto los CLASS, ID, Descendentes y algunos pseudo-selectores… ¿Cómo lidiar entonces con un navegador que es usado en un 65% por los usuarios de Internet? No todas las soluciones semanticamente correctas se pueden aplicar siempre… hay que buscar alternativas más saludables para lidiar con este tipo de situaciones.

    Caesarius 11 July, 2006

  13. En efecto, el explorer nos corta las alas para la mayoría de cosas pero, aún así podemos aprovechar el artículo en cuanto que nos insta a dar estilo a etiquetas semánticamente correctas en lugar de llenar la página de marcado irrelevante.
    Esperemos que algún día los “amigos” de Microsoft consigan crear un navegador decente…

    senda 12 July, 2006

  14. Yo creo que la divmanía es una avanzada en pos del cumplimiento de los estandares, los divs vendian a ser las armas de esta revolucion, para que los navegadores y los programas de diseño dejen de hacer su negocio. Muchachos: a arremangarse y a escribir codigo con sentido.
    http://www.effectivetranslations.com/stupidtables/everything_es.html

    Mario 21 August, 2006

  15. [...] Ayer me encontré un excelénte artículo donde explica el termino Div manía y a la vez es un excelente manual sobre cómo usar razonadamente los CSS en el desarrollo web. Según éste se ha creado una tendencia en alza a utilizar elementos div en lugar de tablas, y aunque éstos son válidos perfectamente abusamos bastante de ellos en el diseño web estandar. La Div Mania surge cuando los desarrolladores han reemplazado los layouts creados con tablas por layouts CSS, pero han abusado de los elementos div hasta el punto de casi crear su propio lenguaje compuesto básicamente de elementos div anidados. [...]

    Fitopaldi.net :: El Blog de Fitopaldi » Blog Archive » Adictos al 29 August, 2006

  16. [...] Div Mania (Traducción del texto publicado en Juicy Studio) [...]

    Los mejores textos sobre CSS y estándares web en castellano « Disenia 9 May, 2007

  17. Excelente!

    Nacho 21 June, 2007

  18. no se como puedo hacer para que dentro del div contenedor,un div concreto se situe debajo de otro div, también concreto,y tiene valor de postcion “absolute”

    strato 8 August, 2007

  19. [...] Además, es imposible preveer todas las necesidades de maquetación y estilos que tendrá cada sitio. Si buscamos dotar a la web de un significado semántico tendremos que aprender a etiquetar las cosas correctamente y a emplear los elementos html de forma correcta. A apoyar nuestros estilos en ellos y no manchar todo el código con clases e id de nombre criptico y ningún significado (si aún no la habéis leído os recomiendo la traducción que hice del artículo: Div Mania). [...]

    Webmaster Libre | Frameworks para CSS 29 August, 2007

  20. Empiezo con el CSS en serio y me alegro de haber leído esto antes de coger un mal vicio.

    Jordi 22 September, 2007

  21. Muy buen aporte. Interesan estos artículos para que muchos vean el potencial de CSS y la limpieza del código. Todavía hay muchos usando y .

    Un saludo,

    MalastiC 27 December, 2007

Comentar:

Algunas etiquetas HTML permitidas:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>