
Valores modernos de display: flow-root, contents, flex, grid
CSS ha evolucionado significativamente en los últimos años, introduciendo valores modernos para la propiedad display que van más allá de los tradicionales block, inline e inline-block. Estos nuevos valores proporcionan soluciones elegantes a problemas comunes de diseño y amplían enormemente nuestras posibilidades de maquetación.
display: flow-root
El valor flow-root crea un nuevo contexto de formato de bloque (BFC), lo que resulta extremadamente útil para contener elementos flotantes sin necesidad de técnicas adicionales como clearfix.
.container {
display: flow-root;
border: 2px solid #3498db;
padding: 10px;
}
Un caso de uso común es cuando tenemos elementos flotantes dentro de un contenedor:
<div class="container">
<div class="float-left">Elemento flotante</div>
<p>Texto que fluye alrededor del elemento flotante...</p>
</div>
.container {
display: flow-root;
border: 2px solid #3498db;
padding: 10px;
margin-bottom: 20px;
}
.float-left {
float: left;
width: 150px;
height: 100px;
background-color: #e74c3c;
margin-right: 15px;
color: white;
padding: 10px;
}
Antes de flow-root, necesitábamos usar técnicas como:
/* Método antiguo con clearfix */
.clearfix::after {
content: "";
display: block;
clear: both;
}
La ventaja de flow-root es que simplifica el código y elimina la necesidad de clases adicionales o elementos de limpieza.
display: contents
El valor contents hace que el elemento en sí mismo "desaparezca" visualmente, pero sus hijos se renderizan como si fueran hijos directos del contenedor del elemento. Esto es particularmente útil cuando queremos eliminar un elemento contenedor del árbol de renderizado sin eliminar sus hijos.
.wrapper {
display: contents;
}
Veamos un ejemplo práctico:
<div class="grid-container">
<div class="wrapper">
<div class="item">Elemento 1</div>
<div class="item">Elemento 2</div>
</div>
<div class="item">Elemento 3</div>
</div>
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.wrapper {
display: contents; /* Los hijos se comportan como hijos directos de grid-container */
}
.item {
background-color: #9b59b6;
color: white;
padding: 20px;
text-align: center;
}
En este ejemplo, los elementos 1 y 2 se comportan como si fueran hijos directos del contenedor grid, a pesar de estar dentro de .wrapper. Sin display: contents, el elemento .wrapper ocuparía una celda completa de la cuadrícula.
Este valor es especialmente útil cuando:
- Trabajamos con componentes anidados en sistemas de grid o flexbox
- Queremos mantener la estructura semántica del HTML pero necesitamos un comportamiento visual diferente
- Necesitamos evitar que un contenedor interfiera con el diseño visual
display: flex
Flexbox (o Modelo de Caja Flexible) es un sistema de layout unidimensional que permite distribuir espacio y alinear elementos de forma eficiente, ya sea en filas o columnas.
.flex-container {
display: flex;
gap: 10px;
}
Al establecer display: flex en un elemento, este se convierte en un contenedor flex y sus hijos directos se convierten en elementos flex. A diferencia de los valores tradicionales, flex introduce un conjunto completo de propiedades adicionales para controlar el layout:
.flex-container {
display: flex;
flex-direction: row; /* row, row-reverse, column, column-reverse */
justify-content: space-between; /* alineación en el eje principal */
align-items: center; /* alineación en el eje cruzado */
flex-wrap: wrap; /* permite que los elementos se envuelvan */
gap: 10px; /* espacio entre elementos */
}
.flex-item {
flex: 1; /* crecimiento proporcional */
}
Un ejemplo básico de uso:
<div class="flex-container">
<div class="flex-item">1</div>
<div class="flex-item">2</div>
<div class="flex-item">3</div>
</div>
.flex-container {
display: flex;
background-color: #f1f1f1;
padding: 15px;
gap: 10px;
}
.flex-item {
background-color: #2ecc71;
color: white;
padding: 20px;
text-align: center;
flex: 1;
}
Flexbox es ideal para:
- Barras de navegación y menús horizontales
- Centrado vertical y horizontal de elementos
- Distribución de espacio entre elementos
- Ordenamiento visual independiente del orden en el HTML
- Layouts responsivos de una dimensión (filas o columnas)
display: grid
CSS Grid es un sistema de layout bidimensional que permite crear diseños complejos basados en filas y columnas. A diferencia de flexbox, grid está diseñado para manejar tanto filas como columnas simultáneamente.
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
gap: 15px;
}
Al establecer display: grid, el elemento se convierte en un contenedor grid y sus hijos directos se convierten en elementos grid. Grid introduce numerosas propiedades para definir la estructura:
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3 columnas de igual tamaño */
grid-template-rows: auto auto; /* 2 filas de altura automática */
gap: 15px; /* espacio entre filas y columnas */
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }
Un ejemplo práctico:
<div class="grid-container">
<div class="grid-item header">Cabecera</div>
<div class="grid-item sidebar">Barra lateral</div>
<div class="grid-item content">Contenido principal</div>
<div class="grid-item footer">Pie de página</div>
</div>
.grid-container {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: auto 1fr auto;
gap: 10px;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
min-height: 300px;
}
.grid-item {
padding: 20px;
text-align: center;
}
.header {
grid-area: header;
background-color: #3498db;
}
.sidebar {
grid-area: sidebar;
background-color: #e67e22;
}
.content {
grid-area: content;
background-color: #2ecc71;
}
.footer {
grid-area: footer;
background-color: #9b59b6;
}
Grid es especialmente útil para:
- Layouts de página completa
- Sistemas de cuadrícula para galerías o tarjetas
- Diseños asimétricos complejos
- Posicionamiento preciso de elementos
- Alineación en dos dimensiones
Combinando valores modernos de display
Una de las grandes ventajas de estos valores modernos es que pueden combinarse para crear layouts complejos y flexibles:
<div class="grid-layout">
<header>Cabecera</header>
<nav class="flex-nav">
<a href="#">Inicio</a>
<a href="#">Productos</a>
<a href="#">Servicios</a>
<a href="#">Contacto</a>
</nav>
<main>
<div class="card-container">
<div class="wrapper">
<div class="card">Tarjeta 1</div>
<div class="card">Tarjeta 2</div>
</div>
<div class="card">Tarjeta 3</div>
</div>
</main>
<footer>Pie de página</footer>
</div>
.grid-layout {
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto auto 1fr auto;
min-height: 100vh;
}
.flex-nav {
display: flex;
justify-content: space-around;
background-color: #34495e;
padding: 15px;
}
.flex-nav a {
color: white;
text-decoration: none;
}
.card-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
padding: 20px;
}
.wrapper {
display: contents;
}
.card {
background-color: #ecf0f1;
border-radius: 5px;
padding: 20px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
header, footer {
background-color: #2c3e50;
color: white;
padding: 20px;
text-align: center;
}
Soporte en navegadores y fallbacks
El soporte para estos valores modernos varía:
flow-root: Buen soporte en navegadores modernoscontents: Soporte decente, pero con algunas limitaciones en Safariflex: Excelente soporte en todos los navegadores modernosgrid: Buen soporte en navegadores modernos
Para proporcionar alternativas en navegadores antiguos, podemos usar:
/* Fallback para navegadores que no soportan grid */
.container {
display: flex;
flex-wrap: wrap;
}
/* Versión moderna con grid */
@supports (display: grid) {
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
}
Consideraciones de rendimiento
Cada valor de display tiene diferentes implicaciones de rendimiento:
flow-root: Rendimiento similar ablockcontents: Puede mejorar el rendimiento al eliminar nodos del árbol de renderizadoflex: Eficiente para layouts unidimensionales, pero puede ralentizarse con muchos elementosgrid: Más costoso computacionalmente que flex, especialmente con layouts complejos
Para optimizar el rendimiento:
- Usa el valor de
displaymás simple que resuelva tu problema de diseño - Evita anidaciones excesivas de contenedores flex o grid
- Considera usar
will-change: transformpara elementos que cambiarán frecuentemente
Elección del valor adecuado
Para elegir el valor de display más apropiado:
- flow-root: Cuando necesites contener elementos flotantes o crear un nuevo contexto de formato
- contents: Cuando quieras "eliminar" un contenedor pero mantener sus hijos en el flujo
- flex: Para layouts unidimensionales (filas o columnas)
- grid: Para layouts bidimensionales (filas y columnas simultáneamente)
Estos valores modernos de display han transformado radicalmente cómo construimos layouts en CSS, permitiéndonos crear diseños más robustos, flexibles y mantenibles con menos código y sin los hacks que solíamos necesitar en el pasado.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en CSS
Documentación oficial de CSS
Alan Sastre
Ingeniero de Software y formador, CEO en CertiDevs
Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, CSS es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.
Más tutoriales de CSS
Explora más contenido relacionado con CSS y continúa aprendiendo con nuestros tutoriales gratuitos.
Aprendizajes de esta lección
Explorar los valores modernos de la propiedad 'display' como flow-root, contents, flex y grid. Entender cuándo usar flow-root para contener flotantes sin clearfix. Conocer el valor contents y sus usos en grids y flexbox anidados. Saber cuándo y cómo usar flex y grid para crear layouts eficientes y adaptables.