Qué hace overflow
Cuando el contenido es más grande que su caja (una altura fija, una palabra larga, una tabla ancha), se desborda. La propiedad overflow decide qué pasa con lo que sobra:
| Valor | Lo que ves | Contenedor de desplazamiento |
|---|---|---|
visible (por defecto) | El contenido sale de la caja y se superpone a lo que sigue | No |
hidden | Recortado en el borde del padding, sin barras (un script todavía puede desplazarlo) | Sí |
clip | Recortado, y sin ningún desplazamiento, ni siquiera por script | No |
scroll | Siempre muestra barras de desplazamiento, aunque el contenido quepa | Sí |
auto | Barras de desplazamiento solo cuando el contenido no cabe | Sí |
En macOS y en los teléfonos las barras de desplazamiento se superponen al contenido y se desvanecen, así que scroll y auto pueden verse igual hasta que te desplazas.
Crear una caja con scroll
Una caja solo se desborda si algo limita su tamaño. Una height o una max-height, más overflow-y: auto, convierten una lista larga en un panel con desplazamiento:
Aquí max-height es mejor que height: una lista corta sigue siendo corta y solo se desplaza una lista larga. Una región con scroll que no tiene contenido enfocable dentro debería llevar tabindex="0" para que los usuarios de teclado también puedan desplazarla.
overflow-x y overflow-y
Los dos ejes se pueden definir por separado. El uso común es una tabla ancha que se desplaza hacia los lados dentro de su contenedor en lugar de ensanchar toda la página:
Una regla para recordar: si un eje es hidden, scroll o auto, un valor visible en el otro eje pasa a ser auto. Así, overflow-x: hidden solo puede darte una barra vertical inesperada. overflow-x: clip no tiene ese efecto:
.a { overflow-x: hidden; } /* overflow-y computes to auto */
.b { overflow-x: clip; } /* overflow-y stays visible */
Cortar texto con puntos suspensivos
text-overflow: ellipsis reemplaza el final recortado de una línea por "…". Necesita tres cosas a la vez: un ancho limitado, texto que no pueda pasar a otra línea y el desbordamiento oculto:
El line clamp con prefijo -webkit- funciona en Chrome, Firefox y Safari. Los lectores de pantalla siguen leyendo el texto completo, así que para ellos las palabras recortadas no se pierden.
Efectos secundarios de overflow
Poner overflow en cualquier valor distinto de visible o clip cambia algo más que el recorte:
- Contiene los floats y los márgenes de los hijos. El elemento forma un nuevo contexto de formato de bloque, así que crece para envolver a los hijos con float.
display: flow-roothace lo mismo sin recortar nada. - Rompe
position: stickypor debajo. Un hijo sticky se queda fijo respecto al contenedor de desplazamiento más cercano; si ese contenedor no se desplaza, nada se queda fijo. - Recorta a los hijos con posición absoluta (cuando el elemento que se desborda también es su bloque contenedor), incluidos menús desplegables y tooltips, y también recorta las sombras de los hijos.
Ocultar la barra de desplazamiento
Puedes mantener una caja con scroll y ocultar su barra con scrollbar-width: none. Úsalo con moderación: sin barra, muchos lectores no se dan cuenta de que hay más contenido. scrollbar-gutter: stable hace lo contrario: reserva el espacio de la barra para que el contenido no se mueva cuando aparece una.
Errores comunes
- Esperar un desbordamiento sin límite de tamaño. Una caja sin
heightnimax-heightcrece en lugar de desbordarse. overflow: hiddenenbodypara "arreglar" el scroll horizontal. Busca el elemento que es demasiado ancho (a menudo unwidthfijo, una URL larga o100vwcon barra de desplazamiento).- Puntos suspensivos sin
white-space: nowrap. El texto pasa a otra línea, así que nada se desborda en horizontal y no aparecen los puntos suspensivos. overflow-x: hiddenque crea una barra vertical. Usaclip.- Un menú desplegable cortado por su tarjeta. El
overflow: hiddende la tarjeta lo recorta; mueve la regla de overflow o renderiza el menú por fuera.
Preguntas frecuentes
¿Qué hace overflow: hidden?
Recorta el contenido que no cabe dentro de la caja de padding del elemento, sin barras de desplazamiento. La parte oculta todavía se puede alcanzar con un script o enfocando algo que esté dentro.
¿Qué diferencia hay entre overflow auto y scroll?
scroll siempre reserva las barras de desplazamiento, aunque el contenido quepa. auto muestra una barra solo cuando el contenido es más grande que la caja, que es lo que normalmente quieres.
¿Cómo hago que un div tenga scroll?
Limita su tamaño y permite el desplazamiento: max-height: 300px; overflow-y: auto;. Sin un límite de height o max-height, el div crece con su contenido y nunca se desborda.
¿Por qué overflow-x: hidden también agrega una barra vertical?
Si un eje es hidden, scroll o auto, un valor visible en el otro eje se calcula como auto. Usa overflow-x: clip, que no crea un contenedor de desplazamiento y deja visible el otro eje.
¿Cómo agrego puntos suspensivos (...) al texto que se desborda?
Para una línea: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; en un elemento con ancho limitado. Para varias líneas, usa display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.