En este taller CSS vamos a ver cómo maquetar columnas contiguas con contenido centrado verticalmente. Para ello vamos a utilizar Flexbox.
Flexbox (Flexible Box Layout), es un modelo de diseño CSS que permite crear diseños complejos y responsivos de manera más eficiente que los métodos tradicionales. Fue introducido para solucionar muchos de los problemas de diseño web que eran difíciles de resolver con flotadores (floats) y posicionamiento.
Aquí te explico los conceptos fundamentales de Flexbox:
Conceptos básicos de Flexbox
- Contenedor Flex (Flex Container): Es el elemento padre que contiene los elementos flex. Se define aplicando
display: flex
odisplay: inline-flex
a un elemento. - Elementos Flex (Flex Items): Son los hijos directos del contenedor flex.
- Ejes: Flexbox trabaja con dos ejes:
- Eje principal (Main Axis): Va en la dirección definida por
flex-direction
(horizontal por defecto) - Eje transversal (Cross Axis): Perpendicular al eje principal
- Eje principal (Main Axis): Va en la dirección definida por
Propiedades principales del contenedor flex
- display: flex: Convierte un elemento en un contenedor flex.
- flex-direction: Define la dirección del eje principal:
row
(valor por defecto): de izquierda a derecharow-reverse
: de derecha a izquierdacolumn
: de arriba hacia abajocolumn-reverse
: de abajo hacia arriba
- justify-content: Alinea elementos a lo largo del eje principal:
flex-start
,flex-end
,center
,space-between
,space-around
,space-evenly
- align-items: Alinea elementos a lo largo del eje transversal:
flex-start
,flex-end
,center
,stretch
,baseline
- flex-wrap: Controla si los elementos pueden saltar a una nueva línea:
nowrap
(valor por defecto): sin saltos de líneawrap
: permite saltos de líneawrap-reverse
: permite saltos de línea en dirección inversa
- gap: Establece espacios entre elementos flex
Propiedades para los elementos flex
- flex: Abreviatura para
flex-grow
,flex-shrink
yflex-basis
:flex: 1
=flex: 1 1 0%
- flex-grow: Determina cuánto puede crecer un elemento (número positivo)
- flex-shrink: Determina cuánto puede encogerse un elemento (número positivo)
- flex-basis: Define el tamaño base antes de distribuir el espacio
- align-self: Permite sobrescribir el alineamiento establecido por
align-items
Ventajas de Flexbox
- Alineamiento simplificado: Centrar vertical y horizontalmente es mucho más fácil
- Orden flexible: Puedes reordenar elementos sin cambiar el HTML
- Distribución de espacio: Facilita la distribución proporcional del espacio
- Diseño responsive: Se adapta naturalmente a diferentes tamaños de pantalla
Flexbox es especialmente útil para:
- Barras de navegación
- Formularios
- Tarjetas o elementos de igual altura
- Centrado vertical y horizontal
- Diseños que necesitan adaptarse a diferentes tamaños de pantalla
Es una herramienta fundamental en el desarrollo web moderno y trabaja bien en combinación con CSS Grid, que está más orientado a diseños bidimensionales (filas y columnas simultáneamente).
Vamos ahora con la práctica de este post.
Cómo maquetar varias columnas contiguas con contenido centrado verticalmente.
Primero la CSS:
<style> /* Estilos para el contenedor principal */ .container { display: flex; flex-direction: row; /* Columnas dispuestas horizontalmente (una al lado de otra) */ width: 100%; max-width: 1200px; margin: 0auto; gap: 20px; /* Espacio entre columnas */ } /* Estilos para las columnas */ .column { flex: 1; /* Cada columna ocupa el mismo espacio */ padding: 20px; box-sizing: border-box; display: flex; align-items: center; /* Centra el contenido verticalmente */ min-height: 200px; /* Altura mínima para que se note el centrado vertical */ border: 1pxsolid#ddd; /* Borde para visualizar las columnas */ border-radius: 4px; } /* Estilos para el contenido dentro de las columnas */ .column-content { width: 100%; } /* Responsive: para dispositivos móviles */ @media screen and (max-width: 768px) { .container { flex-direction: column; /* Cambia a vertical en pantallas pequeñas */ } .column { margin-bottom: 15px; /* Espacio entre columnas cuando están apiladas */ } } /* Clases útiles para diferentes distribuciones de columnas */ .container.two-columns .column { flex-basis: calc(50% - 10px); /* 2 columnas de igual ancho con espacio entre ellas */ } .container.three-columns .column { flex-basis: calc(33.333% - 14px); /* 3 columnas de igual ancho con espacio entre ellas */ } .container.four-columns .column { flex-basis: calc(25% - 15px); /* 4 columnas de igual ancho con espacio entre ellas */ } /* Distribución con columnas de ancho fijo y variable */ .column.fixed { flex: 00200px; /* Ancho fijo de 200px */ } .column.flexible { flex: 1; /* Ocupa el espacio restante */ } /* Opcional: diferentes estilos para columnas alternadas */ .column:nth-child(odd) { background-color: #f9f9f9; } .column:nth-child(even) { background-color: #f1f1f1; } </style>
Y ahora el código HTML:
<div class="container three-columns"> <divclass="column"> <divclass="column-content"> <h2>Columna 1</h2> <p>Este contenido está centrado verticalmente.</p> </div> </div> <divclass="column"> <divclass="column-content"> <h2>Columna 2</h2> <p>Este contenido también está centrado verticalmente.</p> </div> </div> <divclass="column"> <divclass="column-content"> <h2>Columna 3</h2> <p>Y este contenido igualmente está centrado verticalmente.</p> </div> </div> </div>
Además es 100% responsive, de modo que cuando la pantalla es de móvil, las columnas se convierten en filas:
Espero que os sea útil, iremos subiendo más artículos con temas útiles para la maquetación con CSS.