El flujo normal
Sin CSS, el navegador coloca las cajas siguiendo unas reglas fijas que se llaman flujo normal. Ya lo has visto en todas tus páginas:
- Los títulos, párrafos, listas y secciones se apilan de arriba abajo, cada uno en su propia fila.
- Los enlaces, negritas y cursivas van dentro de la línea de texto, uno detrás de otro, como palabras.
Esto pasa porque cada elemento tiene un tipo de caja por defecto, que se controla con la propiedad display.
Bloque y en línea
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Bloque (display: block) | En línea (display: inline) | |
|---|---|---|
| Dónde empieza | En una línea nueva | Sigue en la misma línea |
| Ancho | Todo el disponible | Lo que mide su contenido |
width y height | Funcionan | Se ignoran |
| Márgenes verticales | Funcionan | Se ignoran |
| Ejemplos | <p>, <h1>…<h6>, <div>, <ul>, <li>, <section>, <form> | <a>, <span>, <strong>, <em>, <img>, <label>, <input> |
Cambiar el tipo con display
La propiedad display permite cambiar el tipo de caja de cualquier elemento. Que algo sea un <li> (de bloque) no le impide colocarse en línea si tú lo dices.
display: inline-block: lo mejor de los dos
Se coloca en línea, como el texto, pero acepta ancho, alto, padding y márgenes como un bloque. Es ideal para botones, etiquetas o menús sencillos:
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Fíjate en list-style: none (quita las viñetas) y padding: 0 (quita la sangría que trae la lista). Son las dos líneas que verás en casi todos los menús.
display: block: un enlace que ocupa toda la fila
Al revés también funciona. Un enlace con display: block ocupa todo el ancho, y se puede hacer clic en cualquier parte de la fila, no solo en el texto:
.lista-ajustes a {
display: block;
padding: 16px;
}
display: none: ocultar
display: none oculta por completo un elemento: no se ve y no ocupa espacio, como si no existiera. Lo usarás, por ejemplo, para esconder algo en el móvil y mostrarlo en el ordenador.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Lo que viene: flex y grid
display tiene dos valores más que han cambiado por completo la forma de hacer webs: display: flex y display: grid. Con ellos colocarás cajas en filas, columnas y cuadrículas con muy pocas líneas. Son las dos próximas lecciones, y con ellas inline-block se queda para casos pequeños.
Errores típicos
- Dar
width,heighto margen vertical a un elemento en línea (<a>,<span>) y que no haga nada. Cámbialo ainline-blockoblock. - Usar
<br>o espacios para colocar cosas. Para eso estádisplay(y, pronto, Flexbox). - Olvidar quitar las viñetas y el padding de una lista que se usa como menú.
- Ocultar con
display: nonecontenido importante que debería estar visible para todo el mundo.
Ejercicios
Ejercicio 1: etiquetas (fácil)
Convierte estos <span> en etiquetas: fondo lavender, 4px 10px de relleno, esquinas de 999px y 4px de margen a la derecha. Después prueba a darles width: 120px con display: inline y con display: inline-block. ¿Qué cambia?
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
Los <span> son en línea: el ancho solo funcionará con inline-block.
Solución
.etiqueta {
display: inline-block;
background: lavender;
padding: 4px 10px;
border-radius: 999px;
margin-right: 4px;
}
Con display: inline, el width se ignora; con inline-block, cada etiqueta mide 120px.
Ejercicio 2: el menú en línea (medio)
Haz que este menú se vea en horizontal, sin viñetas, con cada enlace como un botón con relleno, borde de 2px negro y un :hover con fondo amarillo.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
Tres reglas: la lista (list-style y padding), los li (display) y los a (aspecto de botón).
Solución
.menu {
list-style: none;
padding: 0;
}
.menu li {
display: inline-block;
}
.menu a {
display: inline-block;
padding: 8px 14px;
border: 2px solid black;
color: black;
text-decoration: none;
}
.menu a:hover,
.menu a:focus {
background: yellow;
}
Ficha resumen
- Flujo normal: bloques de arriba abajo; elementos en línea dentro del texto.
- Bloque: línea nueva, todo el ancho, acepta
width/height. En línea: mide su contenido, ignorawidth/height. display: inline-block= en línea pero con medidas de bloque.display: none= oculto y sin ocupar espacio.- Menús:
list-style: none; padding: 0;en la lista.
Glosario
| Término | Definición |
|---|---|
| Flujo normal | Colocación por defecto de las cajas: los bloques se apilan y los elementos en línea siguen el texto. |
display | Propiedad que decide el tipo de caja de un elemento: block, inline, inline-block, none, flex, grid… |
| Elemento de bloque | Elemento que empieza en una línea nueva y ocupa todo el ancho disponible. |
| Elemento en línea | Elemento que se coloca dentro de la línea de texto y mide lo que su contenido. |
inline-block | Valor de display para cajas que van en línea pero aceptan ancho, alto y márgenes. |
outline | Contorno que se dibuja por fuera de una caja sin ocupar espacio. |