Skip to content

Todo para WordPress, el desarrollo web — y mucho más

🔍 El misterioso inline-flex: qué es y en qué se diferencia de display: flex

🔍 El misterioso inline-flex: qué es y en qué se diferencia de display: flex

Qué es display: inline-flex

Flexbox se ha convertido en un pilar del diseño web cotidiano. Todo desarrollador front-end conoce y usa display: flex. Pero esta propiedad tiene un hermano menos conocido, display: inline-flex. Rara vez se escribe sobre él y se usa aún menos. Es un error.

La diferencia se resume en una frase: inline-flex crea un contenedor flex que se comporta como un elemento en línea. Sus hijos son ítems flex ordinarios con todas las capacidades de Flexbox. El padre, sin embargo, no ocupa todo el ancho disponible de la línea. Se ajusta al tamaño de su contenido y se ubica en la misma fila que los elementos vecinos.

La propiedad inline-flex en el panel DevTools del navegador

La situación es exactamente como el par display: block y display: inline-block. Un elemento de bloque ocupa toda la línea, uno en línea ocupa solo lo que el contenido necesita. Lo mismo aplica aquí: flex establece un contenedor flex de nivel bloque, mientras que inline-flex establece uno de nivel en línea.

En la práctica, esto abre escenarios que requerirían envoltorios extra, trucos de ancho o reliquias como float con flex común.

💡 Resumen rápido:

  • display: inline-flex crea un contenedor flex que se comporta como un elemento en línea y no ocupa toda la línea. El ancho de dicho contenedor lo determina su contenido, no su padre.
  • Todas las propiedades flex funcionan dentro de inline-flex exactamente igual que en display: flex común. No hay diferencias en cómo se distribuyen los hijos; la única diferencia está en el comportamiento externo del contenedor.
  • El caso de uso principal: insignias, etiquetas y botones con iconos, donde un solo inline-flex en el elemento reemplaza la combinación de un padre flex y un hijo en línea. Obtiene centrado de contenido sin envoltorios extra.
  • Otros valores de display también tienen contrapartes en línea: inline-block, inline-table e inline-grid funcionan bajo el mismo principio. La lógica de disposición interna se preserva; solo cambia el comportamiento externo del contenedor.

Caso real: insignias con iconos

Imagine una tarea típica. Una página necesita una fila de insignias. Cada una tiene un icono y texto, con el icono centrado vertical y horizontalmente dentro de un círculo de color. Las insignias mismas se ubican en una línea como texto común y saltan a la siguiente línea cuando no caben.

Maqueta de diseño de insignias con iconos centrados

Si establece display: flex en las insignias, cada una se estirará al ancho completo del padre. Las insignias se apilarán en una columna, no en una fila. Puede arreglarlo con un envoltorio que tenga display: flex en el padre. Pero, ¿para qué añadir un envoltorio extra cuando tiene inline-flex?

La estructura HTML es elemental:

1<div class="badges-list">
2 <span class="c-badge">
3 <svg class="c-icon" width="24" height="24">...</svg>
4 </span>
5 <span class="c-badge">
6 <svg class="c-icon" width="24" height="24">...</svg>
7 </span>
8 <!-- other badges -->
9</div>

Note que el envoltorio .badges-list no hace nada para el posicionamiento en línea. La propia .c-badge se encarga de eso.

CSS para la insignia:

1.c-badge {
2 display: inline-flex;
3 justify-content: center;
4 align-items: center;
5}

Eso es todo. Cada insignia es un contenedor flex con comportamiento en línea. El icono interior se centra usando justify-content y align-items. Las insignias mismas se alinean en una fila y saltan a una nueva línea cuando no hay suficiente ancho. Exactamente lo que el diseño requería, sin envoltorios extra.

Inline-flex vs flex: una comparación visual

La mejor manera de entender la diferencia es observar dos conjuntos idénticos de contenedores, uno con display: flex y el otro con display: inline-flex.

Ejemplo 1: display: flex

Tres contenedores padre con fondo azul. Dentro de cada uno hay tres hijos rojos con flex: 1. Los padres tienen display: flex.

Resultado: cada contenedor azul ocupa toda la línea. Los hijos internos se estiran a un ancho igual. Los contenedores se apilan en una columna, uno debajo del otro.

1.container--flex {
2 display: flex;
3}
4
5.container--flex > div {
6 flex: 1;
7}
Tres contenedores flex apilados verticalmente, cada uno en su propia línea

Ejemplo 2: display: inline-flex

Los mismos tres contenedores, pero con display: inline-flex. Los hijos tienen min-width: 50px añadido para que el contenedor no colapse a cero.

1.container--inline-flex {
2 display: inline-flex;
3}
4
5.container--inline-flex > div {
6 flex: 1;
7 min-width: 50px;
8}

Resultado: los contenedores se ubican en una sola fila. Cada uno ocupa exactamente el ancho que sus hijos necesitan (50px × 3 = 150px). Se comportan como palabras en una oración y saltan a la siguiente línea solo cuando se acaba el espacio.

Tres contenedores inline-flex en una sola fila con comportamiento en línea

La conclusión clave: para los ítems flex dentro del contenedor, no hay diferencia alguna. Propiedades como justify-content y align-items, así como gap y flex-direction, funcionan de forma idéntica. La única diferencia es cómo el contenedor mismo interactúa con el mundo exterior: como un bloque o como un elemento en línea.

Cuándo usar inline-flex: 4 escenarios

No todo diseño requiere inline-flex. Pero hay situaciones donde resuelve la tarea con más elegancia que la combinación de flex + envoltorio.

1. Una lista de etiquetas o insignias. El caso de uso más común. Cada etiqueta es un contenedor flex con un icono y texto alineados al centro. Las etiquetas mismas fluyen en una línea con ajuste de línea. inline-flex en la etiqueta, y no se necesitan envoltorios.

2. Botones con iconos en una línea de texto. Cuando un botón de acción (copiar, abrir, eliminar) se ubica directamente dentro de un párrafo o encabezado. inline-flex le permite centrar el icono dentro del botón sin sacar el botón del flujo de texto.

3. Una barra de herramientas en línea. Un conjunto de botones de formato en un editor WYSIWYG. Cada botón es un contenedor inline-flex con un icono dentro. Todos los botones se ubican en una línea y se ajustan naturalmente.

4. Centrado vertical en un contexto en línea. Un clásico punto débil de CSS: centrar un icono verticalmente respecto al texto adyacente. vertical-align: middle funciona de forma esporádica. inline-flex con align-items: center funciona siempre.

Aquí está el código para los escenarios 2 y 3, para que no queden en teoría.

Botón con icono en texto (escenario 2). Suponga que necesita un botón de «copiar» dentro de un párrafo. Debe permanecer en el flujo de texto y no romper la línea. Aquí está el CSS mínimo:

1.inline-action-btn {
2 display: inline-flex;
3 align-items: center;
4 justify-content: center;
5 width: 24px;
6 height: 24px;
7 border: none;
8 background: transparent;
9 cursor: pointer;
10 vertical-align: middle;
11}

Tres líneas de centrado flexbox, y el icono dentro del botón queda alineado en ambos ejes. Sin trucos de line-height, sin position: relative más transform. El botón se ubica en el texto como una palabra más.

Barra de herramientas (escenario 3). Un editor WYSIWYG típico: botones de negrita, cursiva y enlace se ubican en una fila. Cada botón es un contenedor inline-flex:

1.toolbar__btn {
2 display: inline-flex;
3 align-items: center;
4 justify-content: center;
5 width: 32px;
6 height: 32px;
7 border-radius: 4px;
8}

Los botones se ajustan cuando la ventana se estrecha, sin envoltorios adicionales. Para la barra de herramientas padre, display: flex con flex-wrap: wrap y gap: 4px funciona bien. Obtiene una composición flex de dos niveles: el contenedor exterior gestiona la fila de botones, y cada botón centra su icono.

Escollos de inline-flex

Tres situaciones no obvias que ahorran horas en DevTools.

Espacio en blanco entre elementos. Al igual que inline-block, los elementos con inline-flex son sensibles al espacio en blanco en HTML. Tres elementos <span> con inline-flex en líneas separadas tendrán un espacio de 4-5 píxeles. La solución: font-size: 0 en el padre con restauración en los hijos, eliminar el espacio en blanco entre etiquetas, o una combinación de display: flex en el padre más inline-flex en los hijos.

text-align no funciona en hijos flex. Para inline-block, los elementos se alinean mediante text-align: center en el padre. Con inline-flex, esta técnica funciona solo mientras los hijos no se hayan convertido ellos mismos en contenedores flex. Los ítems flex no responden a text-align. Alinee contenedores mediante justify-content en un padre flex o margin: auto.

Dirección flex por defecto. inline-flex, al igual que display: flex, dispone a los hijos en una fila por defecto (flex-direction: row). Si espera una columna dentro de un contenedor en línea, establezca flex-direction: column explícitamente. La especificación no lee la mente del desarrollador.

Portátil con código HTML en pantalla, desarrollador front-end trabajando

Parientes: otras variantes de display en línea

inline-flex tiene hermanos conceptuales. Casi todo valor de display de bloque tiene una contraparte en línea:

Valor de bloque

Contraparte en línea

block

inline-block

flex

inline-flex

grid

inline-grid

table

inline-table

El mecanismo es el mismo en todos lados: la lógica de disposición interna se preserva por completo, solo cambia el comportamiento externo del contenedor. Con inline-grid, la historia es la misma: un contenedor de cuadrícula que se ubica en una fila en lugar de ocupar todo el ancho del padre.

En la práctica, inline-flex se usa más a menudo que inline-grid. La razón es simple: los contenedores flex se necesitan más comúnmente para componentes pequeños (insignia, botón, grupo de iconos), donde el comportamiento en línea es justo lo que se necesita. Los diseños de cuadrícula se aplican más a menudo a grandes bloques estructurales, donde el comportamiento inline no sirve a ningún propósito.

El soporte de navegadores para inline-flex es prácticamente completo. La propiedad apareció en la especificación Flexible Box Layout Module Level 1 (W3C Candidate Recommendation, 2016) y funciona en todos los navegadores modernos: Chrome desde la versión 29 (2013), Firefox desde la versión 20 (2013), Safari desde la versión 9 (2015) y Edge desde la versión 12 (2015). Internet Explorer 11 soporta inline-flex con salvedades, pero según datos de StatCounter para 2025, la cuota de IE11 es inferior al 0,1% del mercado global. Para proyectos que deban soportar IE11, pruebe inline-flex manualmente: este navegador se comporta de forma impredecible con algunos errores de flex-basis y min-height.

⁉️🤔 Preguntas frecuentes

¿Cuál es la diferencia entre display: inline-flex y display: flex?

display: flex crea un contenedor flex de nivel bloque que ocupa todo el ancho disponible de la línea. display: inline-flex crea un contenedor flex de nivel en línea cuyo ancho lo determina su contenido y puede ubicarse en la misma línea que otros elementos. Para los hijos dentro del contenedor, no hay diferencia: todas las propiedades flex funcionan igual en ambos casos.

¿Cuándo es inline-flex mejor que inline-block?

inline-block no le da control sobre la alineación de los hijos. Si necesita centrar un icono dentro de un botón tanto vertical como horizontalmente, inline-block le obligará a recordar trucos de line-height y vertical-align. inline-flex con justify-content: center y align-items: center hace esto sin dar rodeos.

¿Se puede usar gap con inline-flex?

Sí, gap funciona en inline-flex exactamente igual que en flex común. Usted establece el espacio entre ítems flex, y el navegador lo aplica independientemente de si el contenedor es de nivel bloque o de nivel en línea. Soporte para gap en flexbox: todos los navegadores modernos desde 2021.

¿Afecta inline-flex a los contenedores flex anidados?

No. La propiedad display no se hereda. Si un elemento con display: flex está dentro de un contenedor inline-flex, será un contenedor flex de nivel bloque común. El comportamiento en línea aplica solo al elemento al que explícitamente le establezca inline-flex.

*inline-flex** y accesibilidad: ¿hay algún escollo?*

Los lectores de pantalla no hacen distinción entre flex e inline-flex. Ambos valores afectan solo el diseño visual y no cambian la semántica ni el orden de lectura. La propiedad flex order cambia el orden visual pero no el orden en el árbol de accesibilidad; esto es cierto para ambos valores de display.

Qué usar: flex o inline-flex

La elección se reduce a una pregunta simple: ¿el contenedor debe ubicarse en una línea con sus vecinos o ocupar todo el ancho de su padre?

Si está estilando un componente (insignia, botón con icono, etiqueta, ítem de barra de herramientas), use inline-flex. Obtendrá centrado flex del contenido preservando el comportamiento en línea natural sin envoltorios adicionales.

Si está estilando una sección, tarjeta, cabecera, pie de página o diseño, quédese con display: flex. El comportamiento de bloque es apropiado aquí: el contenedor debe ocupar su línea, no apretarse entre elementos vecinos.

La regla de oro: abra DevTools y mire el elemento. Si está en una línea con otros, use inline-flex. Si está en su propia línea, use flex. Es así de simple.