Propiedad 'display' - parte 2

Intermedio
CSS
CSS
Actualizado: 24/04/2026

Diagrama del tema

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 modernos
  • contents: Soporte decente, pero con algunas limitaciones en Safari
  • flex: Excelente soporte en todos los navegadores modernos
  • grid: 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 a block
  • contents: Puede mejorar el rendimiento al eliminar nodos del árbol de renderizado
  • flex: Eficiente para layouts unidimensionales, pero puede ralentizarse con muchos elementos
  • grid: Más costoso computacionalmente que flex, especialmente con layouts complejos

Para optimizar el rendimiento:

  • Usa el valor de display más simple que resuelva tu problema de diseño
  • Evita anidaciones excesivas de contenedores flex o grid
  • Considera usar will-change: transform para 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 - Autor del tutorial

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.