Una de las limitaciones con las que tuvo que lidiar CSS en el pasado fue la alineación de elementos verticales. Anteriormente había que volverse loco a la hora de posicionar contenedores, no solo en este eje, sino, también, había muchas limitaciones a la hora de hacer cuadrículas y elementos un poco más libres. Con la llegada de flexbox y CSS Grid se abrió toda una serie de opciones que nos dieron casi total libertad.

CSS Flexbox

Qué es flexbox

Este módulo de CSS fue diseñado para mejorar un aspecto que daba muchos quebraderos de cabeza: La ordenación, alineación y distribución de espacio entre elementos. Se trata de un modelo unidimensional en el que podemos ordenar elementos como filas o columnas, pero solo una de estas opciones.

Se asigna este comportamiento mediante la propiedad css display: flex.

.parent div {
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
}

Al empezar a trabajar con este módulo siempre surgen las dudas sobre sus ejes, y es que no son fijos, sino que dependen de la propiedad flex-direction. Podemos decir que tiene dos ejes, uno principal marcado por flex-direction y otro secundario, perpendicular al principal. Así, si flex-direction marca «row», el principal será horizontal y el secundario vertical; mientras que si marca «column», el principal será el vertical y el secundario será horizontal.

¿Por qué hacemos esta diferenciación entre ejes? Porque te será clave para usar las propiedades de ordenación. Por ejemplo justify-content funciona para el eje principal, mientras align-items funciona para el secundario. No ordenan horizontal ni verticalmente, ya que dependen de la orientación que le dé flex-direction. Al principio cuesta un poco acostumbrarse al cambio de ejes, pero el esfuerzo merecerá la pena.

Propiedades

  • flex: Permite que todos los elementos tengan la misma anchura, independientemente de su contenido
  • flex-basis: Establece una anchura inicial del elemento
  • flex-direction: Marca la dirección principal del contenedor
  • flex-wrap: Controla el cambio de línea de elementos
  • flex-flow: Aúna flex-direction y flex-wrap
  • flex-grow: Marca el factor de crecimiento del contenedor
  • flex-shrink: Marca el factor de contracción del contenedor
  • justify-content: Alineación de elementos contenidos en eje principal
  • align-items: Alineación de elementos contenidos en eje secundario (unos con respecto a otros)
  • align-content: Controla la alineación de elementos contenidos cuando están en varias líneas (con respecto al contenedor principal)

Soporte

Como todo nuevo módulo de CSS, no se ha visto implantado en todos los navegadores de inicio, pero, a día de hoy, ha pasado el suficiente tiempo para que podamos considerarlo un estándar. En esta captura sacada de caniuse.com, podéis ver su implementación actual.

Compatibilidad de flexbox con navegadores

Ejemplos

Si lo que quieres conseguir se parece a la imagen siguiente, la propiedad a usar es flexbox. Pero ten en cuenta que las variaciones son múltiples, pudiendo ocupar varias líneas, diferentes anchuras, etc. La idea es que se distribuyen solo en una dirección (en el caso de la imagen, en horizontal).

Ejemplo típico de flexbox

Lo mejor para entender Flexbox es ver ejemplos y hacer pruebas y modificaciones. Para ello hay varias webs que os pueden ofrecer un resultado en directo de las diferentes propiedades. Os dejo un enlace a loading.io, donde podréis, por medio de botones, observar cómo se alteran las alineaciones. Cuando tengáis el resultado deseado, hay un botón, «Get CSS», que os dará el código referente a esa configuración.

En loading.io podéis encontrar un configurador online de flexbox

CSS Grid

Qué es CSS Grid

CSS Grid va más allá, el control que da de la maquetación es un nivel superior, y nunca mejor dicho, ya que, si decíamos que flexbox era unidimensional, CSS Grid trabaja de forma bidimensional: Al igual que flexbox, tenemos columnas y filas, pero ambos elementos pueden ser definidos a la vez.

Este uso de filas y columnas recuerda a las tablas de HTML, pero, más que una evolución de estas, son una mutación. Ordenaciones, superposiciones, repartición de anchuras… Sí flexbox necesita de un esfuerzo inicial, CSS Grid sube la apuesta, pero también en este caso merece la pena hacerlo.

Se asigna este comportamiento mediante la propiedad css display: grid.

.parent {
    display: grid;
    grid-template-columns: repeat(4,1fr);
    grid-template-rows: repeat(2,1fr);
    grid-column-gap: 0px;
    grid-row-gap: 0px;
}

Propiedades

  • grid: Permite unir en una sola declaración varias reglas (grid-template-rows, grid-template-columns, grid-row-gap, grid-column-gap, grid-template-areas…)
  • grid-template: Une en una sola declaración grid-template-rows, grid-template-columns y grid-template-areas
  • grid-template-columns: Declara el número de columnas y su anchura (total o relativa)
  • grid-template-rows: Declara el número de filas y su altura (total o relativa)
  • grid-row-start: Define en qué fila comienza el contenedor
  • grid-row-end: Define en qué fila acaba el contenedor
  • grid-row: Define en qué fila comienza y cuánto se expande el contendor (aúna grid-row-start y grid-row-end)
  • grid-auto-rows: Determina la altura por defecto en la fila
  • row-gap: Controla los espacios entre filas
  • grid-auto-columns: Determina la anchura por defecto en la columna
  • grid-column-start: Define en qué columna comienza el contenedor
  • grid-column-end: Define en qué columna acaba el contenedor
  • grid-column: Define en qué columna comienza y en cuánto se expande el contendor (aúna grid-column-start y grid-column-end)
  • column-gap: Controla los espacios entre columnas
  • grid-auto-flow: Define cómo fluyen los elementos por defecto en el contenedor
  • grid-area: Define el área que ocupa el contenedor. Une grid-row-start, grid-row-end, grid-column-start, grid-column-end
  • grid-template-areas: Permite usar nombres de áreas usando la declaración como una cuadricula
  • gap: Controla espacios entre filas y entre columnas

Soporte

La integración en navegadores no es tan completa como la de flexbox, pero si usas los navegadores más comunes actualizados, no te dará problemas. Te dejamos también un enlace para que puedas consultar su compatibilidad.

Tabla de compatibilidad de CSS Grid: No tan integrado como flexbox, pero no debería frenarnos el usarlo

Ejemplos

Si tienes en mente una distribución compleja con diferentes relaciones y posiciones, como en la imagen siguiente, la propiedad que mejor se adaptará a tus necesidades es CSS Grid. Igual que hemos comentado anteriormente, esto es solo un ejemplo típico, ten en cuenta que, por ejemplo, los contenedores se pueden superponer unos a otros.

Ejemplo típico de CSS Grid

Igual que con Flexbox, hay varias herramientas online para probar y toquetear las propiedades de CSS Grid. Te recomiendo la página de grid.layoutit.com, donde podrás construir tu propia estructura mediante su css grid generator y comprender mejor su funcionamiento.

/* Ejemplo de CSS Grid*/.presentacion {
  grid-area: celda1;
}

.grid-container {
  display: grid;
  grid-template-areas: 'celda1 celda1 celda1 . .';  /* La celda 1 ocupa 3 de las 5 columnas */}

.datos {
  grid-area: 1 / 4 / span 2 / span 2;    /* Empieza en la fila 1, columna 4 y se extiende hasta la fila 2 y columna 6 */}

Comparativa: CSS Grid layout vs Flexbox

Analizamos las principales diferencias entre Grid y Flexbox:

FlexboxCSS Grid
AprendizajeEsfuerzo inicial moderadoEsfuerzo inicial alto
OrdenaciónControl de ordenación en una dimensiónControl de ordenación en dos dimensiones
Uso idealMenús de navegaciónCuadrículas de fotos de diferentes tamaños y proporciones
Relación con el contenidoFunciona bien con contenido dinámico que se va ordenando según las reglas creadasFunciona bien con contenido fijo, permitiendo más control sobre el diseño visual
SuperposiciónNo está preparado para superponer elementosPreparado para superponer elementos según la ordenación que les demos

Conclusiones

Aprende a usar los dos, no te arrepentirás. Luego usa cada uno cuando corresponda, cada herramienta tiene su uso. Básicamente pordríamos resumirlo en que si tienes que ordenar elementos en una dirección uses flexbox, y si necesitas cuadrículas más complejas, retículas en dos dimensiones, uses CSS Grid.

Alberto Bravo

Hola, soy Alberto Bravo, licenciado en BB.AA. en la Universidad del País Vasco. Me especialicé en diseño gráfico e ilustración. Tras varios años trabajando de ello (etapa de autónomo incluida), decidí digitalizarme y pasar al diseño web. Allí descubrí el SEO y la programación. Actualmente, soy el responsable del departamento SEO de Caronte Studio y ya no tengo tiempo para ilustrar. En mis artículos te hablaré, principalmente, de SEO y tiendas online, pero seguro que también podrás encontrar algún que otro artículo sobre diseño gráfico. WEB | LINKEDIN | ARTSTATION

Entradas recientes

Presupuesto de rastreo o Crawl Budget: ¿Qué es y cómo mejorarlo?

En esta guía práctica, te explicamos qué es el presupuesto de rastreo, por qué es… Leer más

3 días hace

Qué es el call to action (CTA) y cómo hacer uno efectivo

¿Alguna vez te has encontrado con un mensaje que te invita a actuar, ya sea… Leer más

1 semana hace

¿Qué es una promesa en JavaScript? Todo lo que necesitas saber

Una de las preguntas más comunes entre los desarrolladores web que comienzan a usar JavaScript… Leer más

2 semanas hace

Preimpresión digital ¿Por qué es tan importante?

Descubre qué es y para qué sirve la preimpresión digital para conseguir una buena impresión… Leer más

2 semanas hace

Tipos de consentimientos para YouTube, Twitter, LinkedIn y TikTok

Ampliamos información para las redes sociales. Descubre cómo gestionar correctamente los consentimientos necesarios en las… Leer más

3 semanas hace

Diseñadores ilustres: Michael Bierut

Michael Bierut es mucho más que un diseñador; es un educador ejemplar, un escritor locuaz… Leer más

3 semanas hace