La propiedad display

Conceptos fundamentales de maquetación


Probablemente, una de las partes más complejas de CSS sea la creación de layouts, colocación y distribución de los elementos a lo largo de una página, y sin duda el que más le cuesta a los desarrolladores que están comenzando. Sin embargo, es una parte fundamental dentro de CSS, y es necesario entenderla correctamente para que resulte más fácil de trabajar y crear nuestros diseños.

Para establecer estos mecanismos básicos de layout se utiliza una propiedad llamada display que, aunque no la estemos utilizando explícitamente, está actuando por omisión. Vamos a aprender de que se trata.

OJO: Si aún no conoces como funciona la propiedad display, te aconsejo empezar por este post. Si ya la conoces, echa un vistazo a su versión moderna: la propiedad display multi-keyword.

La propiedad display

Por defecto, y aunque no lo sepamos, todos los elementos HTML tienen una forma de comportarse a la hora de renderizarse (dibujarse) en el navegador. Algunos elementos HTML como <div> o <p> actuan de una forma, y otros elementos como <a> o <span> de otra forma diferente. Esto tiene una razón de ser, y la explicaremos un poco más adelante.

Como hemos mencionado, aunque no lo hagamos explícitamente, todos los elementos HTML tienen una forma de representarse. Pero esa forma puede cambiarse a través de la propiedad CSS display, indicandole un tipo de representación concreta:

PropiedadValoresDescripción
displaynone | Cambia el tipo o forma de representación del elemento.

Cambiando ese tipo de representación (de los que veremos a continuación) o utilizando el valor none, podemos indicar al navegador que debe renderizarse de una forma concreta o no tiene ningún tipo de representación y debe ocultarse (en el caso de none).

A continuación daremos un repaso por los tipos de representación que existen en CSS:

TipoDescripciónMás info
inlineSe coloca a continuación del otro (en horizontal). Ignora dimensiones.
blockSe coloca encima de otro (en vertical).
inline-blockHíbrido en línea-bloque. Actúa como un elemento en línea, pero obedece dimensiones.
flexUtiliza el modelo de cajas flexibles de CSS. Ideal para estructuras de 1 dimensión.Ver Flex CSS
inline-flexVersión en línea (ocupa sólo su contenido) del modelo de cajas flexibles de CSS.
gridUtiliza cuadrículas o rejillas con el modelo de cajas Grid CSS.Ver Grid CSS
inline-gridLa versión en línea (ocupa sólo su contenido) del modelo de cajas Grid CSS.
list-itemActúa como un ítem de una lista. Es el comportamiento de etiquetas como <li>.Ver listas HTML
tableActúa como una tabla. Es el comportamiento de etiquetas como <table>.Ver tablas HTML
table-cellActúa como la celda de una tabla. Es el comportamiento de etiquetas como <th> o <td>.
table-rowActúa como la fila de una tabla. Es el comportamiento de etiquetas como <tr>.
contentsIgnora la caja del elemento. Útil para mantener Grid/Flex aún teniendo un wrapper intermedio.Ver contents
noneNo dibuja en el navegador el contenido del elemento ni sus hijos.Ver visibilidad

Veamos una breve explicación de los más básicos. Flex y Grid son más complejos, por lo que los veremos más adelante.

¿Qué es inline?

Como norma general (con excepciones) los elementos que se utilizan dentro de un párrafo, son de tipo inline. Este tipo se caracteriza por varias cosas:

  • 1️⃣ Los elementos se alinean uno detrás de otro (en horizontal).
  • 2️⃣ Su tamaño o dimensiones se adaptan al de su contenido.
  • 3️⃣ Aunque uses width o height, se ignora y no cambia tamaño.

Por ejemplo, todos los elementos <span> o <strong> se comportan como elementos en línea (inline), mientras que los elementos <div> por defecto se comportan como elementos en bloque (lo explicaremos en el siguiente apartado):

div {
  background: darkblue;
  color: white;
}

span {
  background: darkred;
  color: white;
}
<div>Ejemplo de bloque</div>
<div>Ejemplo de bloque</div>
<span>Ejemplo de span</span>
<span>Ejemplo de span</span>

Observa, que aún sin haberlo indicado, los elementos <div> se comportan como si tuvieran un display: block y los elementos <span> se comportan como si tuvieran un display: inline.

No obstante, nosotros podemos forzar y cambiar su tipo:

div {
  background: darkblue;
  color: white;
  display: inline;
}

span {
  background: darkred;
  color: white;
}
<div>Ejemplo de bloque</div>
<div>Ejemplo de bloque</div>
<span>Ejemplo de span</span>
<span>Ejemplo de span</span>

Observa que ahora, tanto <div> como <span> se comportan de la misma forma: como un elemento en línea. Normalmente, este tipo de representación de elementos se usa para agrupar fragmentos de texto.

¿Qué es block?

Por su parte, los elementos que se utilizan para agrupar otros elementos HTML, por norma general, son de tipo block. Este tipo de elementos se caracteriza por lo siguiente:

  • 1️⃣ Los elementos se apilan uno encima de otro (en vertical).
  • 2️⃣ Por defecto, usa todo el ancho (en horizontal) disponible.
  • 3️⃣ Si usas width o height, obedece y cambia el tamaño del elemento.

Por ejemplo, todos los elementos <div> se comportan como elementos de bloque (block). En este ejemplo, además, aunque los elementos <span> se comportan como elementos en línea, vamos a cambiarlos con display para que se comporten como elementos en bloque, apilándose unos encima de otros:

div {
  background: darkblue;
  color: white;
}

span {
  background: darkred;
  color: white;
  display: block;
}
<div>Ejemplo de bloque</div>
<div>Ejemplo de bloque</div>
<span>Ejemplo de span</span>
<span>Ejemplo de span</span>

Normalmente, este tipo de representación de elementos se usa para agrupar múltiples elementos HTML y organizarlos.

¿Qué es inline-block?

Si utilizamos la propiedad display con el valor inline-block, conseguiremos un elemento que funcionará como si fuera un elemento inline, pero obedeciendo a las propiedades width y height, las cuales se ignoran si estamos utilizando un display: inline.

Se trata de una especie de híbrido entre inline y block:

div {
  background: darkblue;
  color: white;
}

span {
  background: darkred;
  color: white;
  width: 200px;
}

.inline-block {
  background: green;
  color: white;
  display: inline-block;
  width: 300px;
}
<div>Ejemplo de bloque</div>
<div>Ejemplo de bloque</div>
<span>Ejemplo de span</span>
<span>Ejemplo de span</span>
<span class="inline-block">Ejemplo de inline-block</span>
<span class="inline-block">Ejemplo de inline-block</span>

Observa que en el caso del elemento <span> (inline), el navegador ignora las dimensiones de ancho que le hemos indicado, al contrario que en los <div> (block) o en el elemento inline-block. El valor inline-block nos puede venir muy bien cuando necesitamos una mezcla de ambos: donde se comporte como un inline pero que haga caso a las medidas de dimensión como los block.

¿Qué es list-item?

Aunque no es muy utilizado hoy en día, el valor list-item se puede utilizar para que un elemento se represente visualmente como los ítems de una lista:

.list {
  margin: 2.5rem;

  & div {
    background: green;
    display: list-item;
  }
}
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
</ul>

<div class="list">
  <div>Item 1</div>
  <div>Item 2</div>
  <div>Item 3</div>
</div>

De esta forma, podemos renderizar como elementos de una lista a elementos HTML que no lo sean realmente. Ten en cuenta que aunque se pueda hacer esto, se recomienda utilizar el HTML de una lista, salvo en casos donde no tengas más remedio.

¿Qué es table?

Tampoco es demasiado utilizado hoy en día, pero mediante el valor table en la propiedad display podemos obligar a un elemento cualquiera a renderizarse como si fuera una tabla. De la misma forma, tenemos los valores table-cell y table-row para renderizar elementos como celdas de una tabla o filas de una tabla, respectivamente:

table {
  border: 1px solid #555;
  margin-bottom: 1rem;
}

.table {
  display: table;
  border: 1px solid green;

  & .row {
    display: table-row;
  }
  & .cell {
    display: table-cell;
    padding: 0.25rem;
  }
}
<table>
  <tr>
    <td>Item 1</td>
    <td>Item 2</td>
  </tr>
  <tr>
    <td>Item 3</td>
    <td>Item 4</td>
  </tr>
</table>

<div class="table">
  <div class="row">
    <div class="cell">Item 1</div>
    <div class="cell">Item 2</div>
  </div>
  <div class="row">
    <div class="cell">Item 3</div>
    <div class="cell">Item 4</div>
  </div>
</div>

De la misma forma que con las listas, se recomienda utilizar HTML basado en <table> si tenemos la oportunidad. Sólo utilizar esto si no tenemos más remedio.

El valor contents

Para este ejemplo, necesitaremos conocer previamente flex o grid. Utilizando display se puede conseguir un comportamiento muy especial, que puede ser realmente útil en algunas ocasiones, sobre todo cuando trabajamos con librerías de terceros, WebComponents o con Javascript (o ciertos frameworks).

Hay situaciones donde se puede arruinar el diseño de maquetaciones Grid o Flex, porque son sistemas que funcionan relacionando un elemento padre con su hijo, por lo que si se cambia el marcado HTML de forma que se rompa esa relación, el diseño deja de ser efectivo.

Imaginemos la siguiente situación, donde tenemos un layout creado con Grid:

.grid {
  display: grid;
  grid-template-columns: repeat(3, 200px);
  grid-template-rows: repeat(2, 100px);
  gap: 10px;
}

.item {
  background: deeppink;
}
<div class="grid">
  <div class="item item-1"></div>
  <div class="item item-2"></div>
  <div class="item item-3"></div>
  <div class="item item-4"></div>
  <div class="item item-5"></div>
  <div class="item item-6"></div>
</div>

Si introducimos un elemento con clase .middle dentro del .grid, que envuelva a todos los .item, el grid dejaría de funcionar porque se ha eliminado la relación padre-hijo entre .grid y los elementos .item. Sin embargo, si añadimos un .middle con un CSS asociado .middle { display: contents }, el navegador ignorará ese elemento intermedio que insertamos por razones de funcionalidad (normalmente en situaciones de sólo diseño no ocurre) y hará como que no existe:

.grid {
  display: grid;
  grid-template-columns: repeat(3, 200px);
  grid-template-rows: repeat(2, 100px);
  gap: 10px;
}

.item {
  background: deeppink;
}

.middle {
  display: contents;
}
<div class="grid">
  <div class="middle">
    <div class="item item-1"></div>
    <div class="item item-2"></div>
    <div class="item item-3"></div>
    <div class="item item-4"></div>
    <div class="item item-5"></div>
    <div class="item item-6"></div>
  </div>
</div>

Observa que a pesar de que existe el <div> con clase middle entre .grid y los .items, sigue funcionando la relación entre ambos y conservando el estilo del grid.

El valor none

Mediante el valor especial none podemos indicar a la propiedad display que el navegador no debe renderizar (dibujar) el elemento ni sus hijos y, aunque exista en el HTML, no se mostrará.

Esta es de las formas más básicas y utilizadas de ocultar visualmente secciones de una web mediante CSS. Existen otras variaciones, que puedes consultar en el apartado Visibilidad de elementos.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev