Si tuviera 1 dolar por cada blog que hago bien... tendría un dolar.

Listas multi-columnas

Páginas: 1 2 3

El CSS

Primero vamos a eliminar el margin y padding de la lista, solo por gusto visual; y posicionaremos la lista relativamente:

CSS:
  1. ol { position: relative; margin: 0 }

Ahora debemos darle un alto y ancho fijo a nuestros <li>. Recomiendo que el alto sea en ems, pues es más amigable con los usuarios y navegadores.

CSS:
  1. ol li { height: 1.1em; width: 125px; position: absolute }

Ahora vamos a posicionar las columnas. Para este demo, haré un estilo que soporte listas de hasta 3 (1, 2 y 3) columnas y 7 (a, b, c, d, e, f y g) filas. Para posicionar las columnas, lo que haremos es dar un margen a la izquierda de 150px por columna (el ancho de nuestros <li> más 25px de margen entre columnas).

CSS:
  1. /* Posicionando las columnas */
  2.     /* Primer Columna */
  3.     li.a-1,
  4.     li.b-1,
  5.     li.c-1,
  6.     li.d-1,
  7.     li.e-1,
  8.     li.f-1,
  9.     li.g-1 {
  10.         margin-left: 0;
  11.     }
  12.  
  13.     /* Segunda Columna */
  14.     li.a-2,
  15.     li.b-2,
  16.     li.c-2,
  17.     li.d-2,
  18.     li.e-2,
  19.     li.f-2,
  20.     li.g-2 {
  21.         margin-left: 150px;
  22.     }
  23.    
  24.     /* Tercer Columna */
  25.     li.a-3,
  26.     li.b-3,
  27.     li.c-3,
  28.     li.d-3,
  29.     li.e-3,
  30.     li.f-3,
  31.     li.g-3 {
  32.         margin-left: 300px;
  33.     }

Como verán, la tercer columna tiene un margen de 300px. Esto es porque tiene dos columnas a su izquierda, y no solo una. Si van a agregar otra columna, deben volver a sumar 150px (o el ancho que hayan escogido) a su margen izquierdo.

Ahora solo nos queda posicionar las filas. Como cada <li> es de 1.1em de alto; este es el alto que usaremos para posicionar los elementos:

CSS:
  1. /* Posicionando filas */
  2.     li.a-1, li.a-2, li.a-3 { top: 0 }
  3.     li.b-1, li.b-2, li.b-3 { top: 1.1em }
  4.     li.c-1, li.c-2, li.c-3 { top: 2.2em }
  5.     li.d-1, li.d-2, li.d-3 { top: 3.3em }
  6.     li.e-1, li.e-2, li.e-3 { top: 4.4em }
  7.     li.f-1, li.f-2, li.f-3 { top: 5.5em }
  8.     li.g-1, li.g-2, li.g-3 { top: 6.6em }

Si agregan más filas, sólo sumen 1.1em (o el alto que hayan usado) a cada fila y listo.

Ahora solo nos queda un pequeño detalle. Como vamos a manejar varias listas con diferentes altos (número de filas), debemos manejar su alto desde nuestro CSS:

CSS:
  1. /* Alto de Tablas */
  2.     ol.filas-1 { height: 1.1em }
  3.     ol.filas-2 { height: 2.2em }
  4.     ol.filas-3 { height: 3.3em }
  5.     ol.filas-4 { height: 4.4em }
  6.     ol.filas-5 { height: 5.5em }
  7.     ol.filas-6 { height: 6.6em }
  8.     ol.filas-7 { height: 7.7em }

Y con eso podemos manejar cualquier número de listas. ;) Pueden agregar o cambiar elementos a su gusto. Ahora bien, no todo es hermoso y bello con esta técnica.

Contras

  1. Existe un límite a las columnas que puedes agregar; pues depende del ancho del contenido. Si tienes un layout líquido, esta no es la mejor técnica (recomiendo uses floats o algo parecido).
  2. Si el texto en las listas es dinámico y cuenta con dimensiones o saltos de línea diferentes siempre, esta técnica no funciona. los elementos se amontonan.
  3. Con listas muy largas puede llegar a ser un problema.

Les dejo un ejemplo de las listas multi-columnas en acción. Espero les sea de ayuda.

Páginas: 1 2 3

11 Comentarios

  1. Excelente tutorial, había visto uno similar en ALA , pero nada mejor que tenerlo en tu idioma y con esta buena explicación.

    Muchas gracias ñ_ñ

  2. #2 gravatar Osmar Valero 27 de Abril del 2007, 15:00

    Hola, como estas.
    Estoy buscando a alguien que me instale en mi servidor los siguientes modulos:
    FFmpeg
    FFmpeg-PHP
    Mplayer + Mencoder
    flv2tool
    Libogg + Libvorbis
    LAME MP3 Encoder

    Me podrias ayudar?, conoces a alquien?

    Te agradeceria que me respondieras a mi email.

    Gracias.

  3. Gracias por el tutorial, esta interesante. Sin embargo no me quedo claro porque cada elemento tiene su propia clase, en lugar de asignar clases directamente por columna.

    ej:

    uno
    dos
    tres

    cuatro
    cinco
    seis

    siete
    ocho
    nueve

    -->

  4. Gracias por el tutorial, esta muy interesante (y muy útil). Sin embargo no me quedo claro porque cada elemento tiene su propia clase, en lugar de asignar clases directamente por columna.

    Ejemplo:

    Gracias.

  5. Muy bueno :)
    proximamente te agrego a mi blogroll !
    Saludos!

  6. Buenisimo tutorial! ... pero yo no me conformo, debe de haber una manera de hacer listas más flexibles X| ... andare haciendo pruebas, si encuentro algo, aviso.

    Por cierto, que mal que ya no vivas en Guadalajara, te invitaría unas copas ;) ... saludos paisano!!!!!

  7. Hola, este tutorial está genial.
    Yo sólo tengo un problema: delante de cada linea de la lista me sale un numero y lo quiero quitar.

    Ejemplo:

    1. Hola 3. Hasta Luego 4. Bye Bye
    2. Adios

    ¿Alguien sabe como?

    Saludos

  8. Me contesto al instante..jaja..

    Sólo tenía que poner
    list-style: none;

    ^_^

  9. Dany: También te recomiendo que en lugar de <ol> uses <ul>. Ya que, si no quieres números muy probablemente se trate de una lista sin ningún orden en específico.

  10. Gracias por el dato.

    Tanto tiempo dedicado a hacer blogs, webs... y todavía me queda mucho por aprender.

  11. No tiene mucha gracia hacerlo asi, es demasiado fijo.
    Poco dinamico.

Dejar un comentario

* Campos requeridos
   El Email no será publicado