Guía de columnas CSS adaptables a la respuesta | Programar Plus

Con las columnas CSS, puede crear un diseño inspirado en la impresión con poco marcado adicional que se puede adaptar más allá de un lienzo fijo. Un navegador compatible hará cálculos para ajustar y equilibrar el contenido en columnas ordenadas. Si ya está trabajando con un diseño fluido, las columnas se reajustarán automáticamente. Con la combinación correcta de propiedades, las columnas CSS pueden ser una opción de diseño interesante que es fácil de responder y se degrada con gracia.

Dónde declarar columnas

Puede declarar columnas en cualquier elemento de nivel de bloque. Las columnas se pueden aplicar a un solo elemento o se pueden aplicar a varios elementos al apuntar a su padre.

En la imagen de abajo, el lado izquierdo muestra las reglas de columna CSS que se aplican al segundo párrafo para transformar solo ese contenido en columnas. El lado derecho muestra las reglas que se aplican a un elemento contenedor como un <div></div> o <article></article> para transformar los elementos en un diseño de varias columnas.

columnas de un solo elemento y de varios elementos

Cómo declarar columnas

Hay tres formas diferentes de declarar columnas:

  1. Declarar column-count.
  2. Declarar column-width.
  3. Declare ambos (recomendado).

Exploremos las diferentes formas de declarar columnas.

1. Declarar recuento de columnas

Usar column-count para declarar el número de columnas.

article {
  -webkit-column-count: 2;
     -moz-column-count: 2;
          column-count: 2;
}

Demo en vivo

Ver la pluma [2] Columnas CSS, recuento por Katy DeCorah (@katydecorah) en CodePen.

El número de columnas permanece constante incluso cuando cambia el ancho del navegador, como se muestra en el gif a continuación.

recuento de columnas en un ancho estrecho

2. Declare el ancho de la columna

Usar column-width para declarar el ancho de las columnas.

El valor especificado no es un valor absoluto, sino un ancho mínimo. Dado que column-width, el navegador decidirá cuántas columnas de al menos ese ancho pueden caber en el espacio. El navegador también tendrá en cuenta la canaleta o el espacio entre columnas en este cálculo (más sobre esto más adelante). Luego, el navegador expandirá las columnas para distribuirlas uniformemente para llenar el ancho del contenedor.

Por ejemplo, si inspecciona el párrafo en la demostración en vivo a continuación, encontrará que el ancho de la columna es en realidad mayor que 150px, que es el valor establecido de column-width.

article {
  -webkit-column-width: 150px;
     -moz-column-width: 150px;
          column-width: 150px;
}

Demo en vivo

Ver la pluma [3] Columnas CSS de Katy DeCorah (@katydecorah) en CodePen.

Una vez que el navegador no puede caber al menos dos columnas tan anchas como el column-width entonces no aparecerán columnas y el diseño volverá a un diseño de una sola columna.

El siguiente gif muestra cómo se liberan las columnas a medida que se reduce el ancho del navegador. a diferencia de column-count esta propiedad responde de forma inherente.

ancho de columna a medida que el navegador se estrecha

3. Declare ambos (recomendado)

Usar column-count y column-width juntos para el mejor control sobre las columnas CSS. Puede declarar cada propiedad o utilizar la abreviatura columns.

Cuando se declaran ambas propiedades, column-count es el número máximo de columnas y column-width es el ancho mínimo para esas columnas.

article {
  -webkit-columns: 2 200px;
     -moz-columns: 2 200px;
          columns: 2 200px;
}

/* or */

article {
  -webkit-column-count: 2;
     -moz-column-count: 2;
          column-count: 2;
  -webkit-column-width: 200px;
     -moz-column-width: 200px;
          column-width: 200px;
}

Demo en vivo

Ver la pluma [4] Columnas CSS, columnas de Katy DeCorah (@katydecorah) en CodePen.

El siguiente gif demuestra cómo usar column-count y column-width juntos responden a medida que se reduce el ancho del navegador.

ambas propiedades a medida que el navegador se estrecha

Personalizar columnas

Hay varias propiedades para personalizar aún más las columnas CSS.

espacio entre columnas

Para ajustar la canaleta, o el espacio entre columnas, declare column-gap.

Para la mayoría de los navegadores, el valor predeterminado para column-gap es 1em. Puede declarar un nuevo valor siempre que sea mayor o igual a 0.

article {
  -webkit-columns: 2 200px;
     -moz-columns: 2 200px;
          columns: 2 200px;
  -webkit-column-gap: 4em;
     -moz-column-gap: 4em;
          column-gap: 4em;
}

Demo en vivo

Ver la pluma [5] Columnas CSS, espacio entre columnas de Katy DeCorah (@katydecorah) en CodePen.

El navegador realizará los cálculos necesarios para espaciar y equilibrar uniformemente las columnas a pesar de un espacio mayor.

El siguiente gif demuestra cómo el navegador libera las columnas y elimina el espacio cuando el ancho del navegador se reduce.

el espacio entre columnas cae cuando el ancho del navegador se reduce

regla de columna

Para agregar una línea vertical entre cada columna, declare column-rule.

Esta propiedad es la abreviatura de column-rule-width, column-rule-style, column-rule-color. La taquigrafía sigue el mismo patrón de estilo que border.

article {
  -webkit-columns: 2 200px;
     -moz-columns: 2 200px;
          columns: 2 200px;
  -webkit-column-gap: 4em;
     -moz-column-gap: 4em;
          column-gap: 4em;
  -webkit-column-rule: 1px dotted #ddd;
     -moz-column-rule: 1px dotted #ddd;
          column-rule: 1px dotted #ddd;
}

Demo en vivo

Ver la pluma [6] Columnas CSS, regla de columna de Katy DeCorah (@katydecorah) en CodePen.

Me gusta column-gap, la línea vertical saldrá una vez que el ancho del navegador sea demasiado estrecho, como se muestra en el siguiente gif.

la regla de columna cae a medida que se reduce el ancho del navegador

intervalo de columnas

Para romper el flujo de la columna temporalmente, declare column-span en un elemento hijo. Actualmente, Firefox no es compatible con esta función (pero puedes votar por ella en Bugzilla).

La imagen a continuación contiene un encabezado que indica el comienzo de un nuevo capítulo en la historia, pero continúa con el flujo de columnas.

columnas sin un elemento de expansión

Para separar el encabezado del flujo de la columna, agregue column-span: all al elemento. Esta declaración detendrá temporalmente el flujo de la columna para permitir que el elemento abarque las columnas, pero reiniciará las columnas con el siguiente elemento.

h3 { 
  -webkit-column-span: all; 
          column-span: all; 
}

Demo en vivo

Ver la pluma [7] Columnas CSS, columna de Katy DeCorah (@katydecorah) en CodePen.

relleno de columna

Para cambiar la forma en que el contenido llena las columnas, declare column-fill. Actualmente, esta propiedad solo está disponible en Firefox.

Cuando se agrega altura a un elemento con columnas, Firefox se comporta de manera diferente a los otros navegadores. Firefox equilibrará automáticamente el contenido, mientras que el otro navegador llenará las columnas secuencialmente.

La siguiente imagen demuestra cómo se comporta Firefox en comparación con otros navegadores cuando se agrega altura a un elemento en columnas.

diferencia entre auto y balance

En Firefox, puede cambiar este comportamiento declarando column-fill: auto. Esta regla hará que las columnas se llenen secuencialmente, como se muestra en la demostración en vivo a continuación.

article {
  -webkit-columns: 2 200px;
     -moz-columns: 2 200px;
          columns: 2 200px;
  -moz-column-fill: auto;
       column-fill: auto;
  height: 350px;
}

Demo en vivo

Ver la pluma [8] Columnas CSS, relleno de columnas por Katy DeCorah (@katydecorah) en CodePen.

Dado que se debe declarar una altura para que Firefox habilite column-fill, la restricción de altura rompe el patrón fluido. El contenido se expande horizontalmente porque no puede fluir verticalmente como se muestra en el siguiente gif. En este caso, se podría agregar una consulta de medios para administrar la altura (más sobre esto más adelante).

restricción de altura en el relleno de columna

Los otros navegadores no son compatibles column-fill y llenará las columnas secuencialmente cuando se declare una altura en un elemento en columnas. Vale la pena señalar que cuando se agrega altura a cualquier elemento en columna, independientemente del navegador o el uso de column-fill, la restricción romperá el patrón fluido.

Limitaciones

Las columnas pueden ser una forma elegante de entregar contenido, siempre que el contenido siga siendo legible. Un diseño de varias columnas puede resultar difícil de leer cuando el contenido se desborda horizontalmente o las columnas se vuelven más altas que la ventana gráfica.

El contenido se desborda horizontalmente

Como se muestra en la column-fill sección, si se agrega altura a un elemento con columnas, entonces el elemento se expandirá horizontalmente para ajustarse al contenido. El desbordamiento romperá el diseño y enviará a los usuarios en una dirección diferente.

Posible solución: cree un min-width consulta de medios para declarar la regla de altura.

En la siguiente demostración, reduje la ventana del navegador para encontrar cuándo las columnas comenzaron a desbordarse y anoté ese número. A continuación, escribí un min-width media query usando el valor de cuando las columnas se desbordan y movieron la regla de altura a la media query.

article {
  -webkit-columns: 2 200px;
     -moz-columns: 2 200px;
          columns: 2 200px;
  -moz-column-fill: auto;
       column-fill: auto;
}
@media (min-width: 500px) {
  article {
    height: 350px;
  }
}

Demo en vivo

Ver la pluma [11] Columnas CSS, altura de relleno de columna por Katy DeCorah (@katydecorah) en CodePen.

Como se muestra en el gif a continuación, cuando las columnas se liberan, la regla de altura está fuera de los límites y las columnas fluyen verticalmente.

altura sobre ancho mínimo

Las columnas se vuelven más altas que la ventana gráfica

Si la altura de la columna se extiende más allá de la ventana gráfica, los usuarios deberán desplazarse para seguir el flujo de la columna.

Posible solución: cree un min-height consulta de medios para activar las columnas.

En el siguiente ejemplo, las columnas solo se activarán si el elemento de la columna tiene un min-height: 400px;. Llegué a este número reduciendo el ancho del navegador hasta el punto justo antes de que se liberen las columnas. A continuación, ajusté la altura del navegador para encontrar dónde empezaron a caer las columnas debajo de la ventana gráfica. Usé ese número para el valor de la min-height consulta de medios.

@media (min-height: 400px) {
  article {
    -webkit-columns: 2 350px;
       -moz-columns: 2 350px;
            columns: 2 350px;
  }
}

Demo en vivo

Ver la pluma [10] Columnas CSS, vertical amigable por Katy DeCorah (@katydecorah) en CodePen.

El siguiente gif demuestra que el elemento en columna debe tener al menos 400 px de alto para mostrar el contenido en columnas.

columna solo en altura mínima

Apoyo

Las columnas CSS tienen un soporte decente (IE10 +) y aún requieren prefijos en todas las propiedades. Obtenga más detalles sobre las propiedades de varias columnas en ¿Puedo usar…?

Incluso si su navegador favorito no admite diseños de varias columnas, tenga en cuenta que se degradan con gracia en un diseño de una sola columna. Las columnas CSS son como las escaleras mecánicas de la entrega de contenido (como tan elocuentemente lo expresó Mitch Hedberg):

Mitch Hedberg

Un diseño de varias columnas no puede romperse, solo puede convertirse en un diseño de una sola columna.