Propiedad CSS overflow-y: guía completa, valores y trucos

Actualización definitiva: 11/13/2025
  • Overflow-y controla el desbordamiento vertical: recorta, desplaza o muestra el contenido.
  • Auto/scroll/hidden crean contexto de formato; clip recorta sin permitir el desplazamiento.
  • Para que surta efecto, defina altura (o tamaño de bloque) y combine con overflow-x según convenga.
  • Atiende accesibilidad: foco por teclado, tabindex y roles/nombres ARIA apropiados.

Ilustración sobre la propiedad CSS overflow-y

Controlar cómo se comporta el contenido cuando se vende el contenedor es clave para un diseño web limpio y utilizable; en ese terreno, overflow-y en CSS manda sobre el desbordamiento vertical, decidiendo si recortar, mostrar barras de desplazamiento o dejar que el contenido quede fuera del cuadro.

Más allá de lo básico, hay matices que cambian por completo el resultado: ciertos valores se activan en un nuevo contexto de formato, algunos permiten desplazamiento con JavaScript y otros lo bloquean, y hasta hay efectos colaterales que pueden provocar que un contenedor pase a ser “scrollable” en ambos ejes si no se configura bien.

¿Qué es overflow-y y para qué sirve?

La propiedad desbordamiento-y indica al navegador qué hacer con el contenido que rebasa el elemento por su borde superior e inferior. Cuando un bloque tiene más contenido del que cabe en su altura definida (o máxima), este ajuste decide si el contenido se recorta, se hace desplazable o se deja visible fuera del recuadro.

Conviene recordar su relación con su “hermana” horizontal: overflow-x controla los laterales izquierdo y derecho, mientras que overflow-y se centra en arriba y abajo. Y, por supuesto, la propiedad abreviada desbordarse permite establecer ambos ejes a la vez con uno o dos valores.

Sintaxis y valoress

En su forma más directa, overflow-y acepta los valores oculto, desplazamiento, auto y visible; desde especificaciones modernas también existe clip. Puedes declararla así:

/* CSS */
selector {
  overflow-y: hidden | scroll | auto | visible | clip;
}

Si usas la abreviatura desbordarse, puedes pasar uno o dos valores. Con un valor, se aplica a ambos ejes; con dos valores, el primero corresponde a desbordamiento-x (horizontal) y el segundo a desbordamiento-y (vertical):

/* Un solo valor, aplica a X e Y */
.container { overflow: auto; }

/* Dos valores: overflow-x overflow-y */
.panel { overflow: hidden auto; }

Significado detallado de cada valor

Es fácil quedarse en la superficie, pero cada palabra clave encierra un comportamiento específico, y algunos incluyen reglas de accesibilidad y rendimiento importantes.

  • visible (valor por defecto): el contenido no se recorta y puede sobresalir más allá del área de padding del elemento. El elemento no se convierte en contenedor de desplazamiento; Útil si no quieres limitar el contenido, pero puede provocar solapamientos con otros componentes.

  • hidden: el contenido se recorta en el borde del padding; no se muestran barras de desplazamiento. El contenido sigue existiendo en el flujo interno, pero no es visible fuera del área. Aunque el usuario no pueda hacer scroll manual, sí puede desplazarse de forma programática (por ejemplo, con scrollTop o desplazando el foco), de modo que el elemento se considera contenedor de desplazamiento.

  • acortar: recortar el contenido en el borde de recorte de desbordamiento, definido por overflow-clip-margin. A diferencia de hidden, no permite desplazamiento, ni manual ni programático. No crea un nuevo contexto de formato por sí mismo; si necesitas aislar el flujo (como haría auto/scroll/hidden), combínalo con display: flow-root. Úsalo cuando quieras un corte tajante sin scroll ni “resquicios”.

  • mover : el contenido se recorta y siempre se muestran barras de desplazamiento en el eje al que aplicar, haya o no desbordamiento real. Esta constancia evita que las barras aparezcan y desaparezcan cuando el contenido fluctúa; diez en cuenta que, aun así, al imprimir puede que el contenido desbordado se incluya según el motor de impresión.

  • auto: similar a un pergamino, pero solo añade barras cuando son necesarios. Si el contenido cabe, el resultado visual se aproxima a visible, pero el elemento ya actúa como contenedor de desplazamiento y además establece un nuevo contexto de formato por motivos de rendimiento y reflujo con elementos flotantes.

Matices esenciales que cambian el resultado

Hay cinco detalles que no conviene pasar por alto y que, en la práctica, marcan la diferencia: las dimensiones, el contexto de formato, la interacción entre ejes, la impresión y el soporte de desplazamiento programático.

Para que el desbordamiento vertical tenga efecto real, el bloque debe tener altura (altura) o altura máxima (max-height) definidas; si trabajas en términos lógicos, usa tamaño de bloque o tamaño máximo de bloque. Para escenarios dinámicos, aprende a obtener la altura de un elemento. En el eje horizontal ocurre lo propio con ancho/ancho máximo o tamaño en línea/tamaño máximo en línea; otra opción para forzar el desbordamiento en línea es espacio en blanco: nowrap.

Al elegir cualquier valor distinto de Visible y acortar para overflow/overflow-y, el elemento crea un nuevo contexto de formato de bloque. Esto evita que, por ejemplo, un vecino flotante reempaquete el contenido en cada paso de desplazamiento, algo que degradaría el rendimiento al desplazarse.

Hay también reglas de interacción entre ejes que sorprenden la primera vez: si estableces visible en un eje y en el otro usas un valor que no sea visible ni clip, ese visible actúa como auto. Asimismo, si pones clip en un eje y en el otro no es visible ni clip, el El clip se comporta como oculto; conviene conocerlo para evitar resultados inesperados.

En la práctica diaria, mucha gente observa que al aplicar. scroll o auto en un eje, el elemento pasa a ser un contenedor de desplazamiento y ciertas acciones (como pseudo-elementos que sobresalen) pueden activar también el desplazamiento en el otro eje si no se controla bien. Es un comportamiento coherente con la especificación y los motores de renderizado actuales.

Ejemplo rápido: fijar la altura y activar el desplazamiento vertical

Una demostración típica consiste en acotar la altura de un bloque de texto y permitir que el exceso se desplace verticalmente. En este caso, desbordamiento-y: automático añade la barra solo cuando haga falta.

<div class="caja">
  <p>Texto largo...</p>
  <p>Más texto...</p>
</div>

.caja {
  max-height: 220px;
  padding: 12px;
  border: 1px solid #ccc;
  overflow-y: auto;   /* barra vertical solo si es necesaria */
  overflow-x: hidden; /* evitamos scroll horizontal accidental */
}

Fíjate en el detalle: overflow-x: complemento oculto de un overflow-y para impedir que vibraciones de diseño, sombras o pseudoelementos provoquen una barra horizontal indeseada.

Control y desplazamiento con JavaScript

Cuando el contenedor es desplazable (auto, scroll o incluso oculto), puedes mover el contenido por código con propiedades y métodos estándar como Element.scrollTop y Element.scrollTo(). Esto permite, por ejemplo, llevar el foco visual a un ancla interior o simular un salto al final de la lista.

// Desplazar 200px hacia abajo
const panel = document.querySelector('.panel');
panel.scrollTop = 200;

// O ir con precisión a una posición
panel.scrollTo({ top: 0, behavior: 'smooth' });

Hay una excepción específica: si usas overflow: clip, el agente de usuario no permite desplazamiento programático; el contenido fuera del borde de clip no es accesible ni con el ratón ni desde JavaScript.

Accesibilidad: teclado, foco y lectores de pantalla

Un área desplazable no siempre es enfocable por teclado, así que el usuario que navega sin ratón puede quedarse sin forma de desplazarla. En Firefox y en Chrome 132 o superior, los contenedores de desplazamiento se hacen enfocables por defecto; en otros navegadores, añade tabindex="0" al contenedor.

Ahora bien, si introduce ese tabulación a ciegas, un lector de pantalla puede llegar a la región sin contexto. Para mitigarlo, asigna un rol ARIA adecuado (por ejemplo, role="region") y proporciona un nombre accesible con aria-label o aria-labelledby. Un etiquetado claro mejora la navegación asistida sin sacrificar usabilidad.

Overflow-x y overflow-y: cómo se combinan

La propiedad abreviada desbordarse permite establecer ambos ejes a la vez con uno o dos valores; cuando especificas dos, el primero es para desbordamiento-x y el segundo para desbordamiento-y. Esto facilita casos como evitar la barra horizontal a la vez que permite desplazarse verticalmente.

/* Evita barra horizontal, permite scroll vertical si hace falta */
.contenedor { overflow: hidden auto; }

Como recordatorio rápido, los valores disponibles para configurar el desbordamiento son: Visible, hidden, acortar, mover y auto. A nivel de ejes, desbordamiento-x gobierna el flujo horizontal y desbordamiento-y el vertical, y puedes combinarlos según convenga.

“Recortar borde” y margen de recorte de desbordamiento

Si cans desbordamiento: recorte (o solo en el eje Y), el recorte se realiza en el denominado borde de clip de desbordamiento. Ese borde puede extenderse más allá del padding gracias a overflow-clip-margin, que acepta una longitud para dejar “aire” antes de recortar.

.tarjeta {
  overflow-y: clip;              /* cortar sin permitir scroll */
  overflow-clip-margin: 8px;     /* recorta 8px por fuera del padding */
}

recuérdalo clip no crea un nuevo contexto de formato. Si necesita ese aislamiento (por ejemplo, para gestionar flotadores o contener márgenes colapsados), combine clip con visualización: raíz de flujo y así consigues el mismo efecto de contención que aportan auto/scroll/hidden.

Cuándo necesitas dimensiones específicas

Para que el recorte o el scroll aparezcan de verdad, el elemento necesita una altura (altura o altura máxima) en el eje de bloque, o su equivalente lógico tamaño de bloque/tamaño máximo de bloque; Si no, el contenedor crecerá con el contenido y el desbordamiento no se activará.

En diseños horizontales (por ejemplo, carruseles), defina ancho/ancho máximo o tamaño en línea/tamaño máximo en línea para forzar el desbordamiento en el eje X; también puedes usar espacio en blanco: nowrap para impedir los saltos de línea y provocar que el contenido exceda el ancho disponible.

Evitar la barra horizontal por pseudo-elementos o sombras

Un caso real muy habitual: un pseudo-elemento ::después que flota hacia la derecha, o una sombra alargada, sobrepasa el contenedor y activa la barra horizontal en un elemento que ya tiene overflow-y. Esto sucede porque, al convertirse en contenedor de scroll, el motor considera el área desbordada para el eje opuesto.

Soluciones típicas: aplica overflow-x: oculto en el contenedor desplazable; controla el tamaño y posición del pseudo-elemento (p. ej., con transformar en lugar de posición absoluta si procede); o acota con clip/ruta de recorte si buscas un recorte tajante. Cualquiera de estas estrategias evita el desplazamiento horizontal indeseado sin sacrificar el vertical.

Demostración de resultados con cada valor

El siguiente bloque muestra cómo cambian la visibilidad y las barras con los distintos valores de overflow-y, todos con la misma altura máxima para forzar el desbordamiento vertical:

<div class="demo visible">Contenido largo...</div>
<div class="demo hidden">Contenido largo...</div>
<div class="demo clip">Contenido largo...</div>
<div class="demo scroll">Contenido largo...</div>
<div class="demo auto">Contenido largo...</div>

.demo {
  max-height: 140px;
  padding: 10px;
  margin-bottom: 12px;
  border: 1px solid #bbb;
}
.visible { overflow-y: visible; }
.hidden  { overflow-y: hidden; }
.clip    { overflow-y: clip; }
.scroll  { overflow-y: scroll; }
.auto    { overflow-y: auto; }

Observa que scroll siempre muestra la barra vertical, mientras que auto solo lo hace cuando el texto excede la altura. En oculto, el contenido sobrante no se ve pero sigue estando ahí; en clip, directamente no existe una vía de desplazamiento, ni si quiera con código.

Impresión y contenido desbordado

Un detalle menos conocido: con desbordamiento: desplazamiento, algunos motores de impresión pueden acabar imprimiendo el contenido desbordado aunque no quepa en la pantalla. Si tu caso de uso contempla exportar un PDF o papel, pruébalo y decide si prefieres hidden el incluido acortar para evitar salidas inesperadas.

Compatibilidad entre navegadores

Las propiedades desbordamiento, desbordamiento-x y desbordamiento-y gozan de soporte sólido en los navegadores modernos desde hace muchas versiones. El valor acortar y su compañera overflow-clip-margin pertenecen a especificaciones más recientes, pero su La adopción actual es amplia y crece con cada lanzamiento; Comprueba las matrices de compatibilidad si apuntas a entornos antiguos.

En cuanto al foco de contenedores desplazables, recuerda la peculiaridad: Firefox y Chrome 132+ los hacen enfocables por defecto; para el resto, añade tabindex=”0″ manualmente y un rol/nombre accesible para una experiencia consistente.

Buenas prácticas de maquetación.

No todo es poner una barra y listo: combina propiedades para prevenir desplazamientos indeseados y ganar en estabilidad visual. Aquí van unas pautas que funcionan muy bien en producción.

  • Definir dimensiones: sin altura/altura máxima o tamaño de bloque, el contenedor crecerá y no verás el efecto de desbordamiento.

  • + desbordamiento-x: oculto cuando usa overflow-y, salvo que necesites cinturones y tirantes horizontales. Evitas barras laterales provocadas por sombras, bordes o pseudo-elementos.

  • Prefiere auto frente a scroll si quieres que la barra aparezca solo cuando haga falta, y scroll si buscas dimensiones estables de diseño sin “saltos” por aparición/desaparición de barras de desplazamiento.

  • Usa clip cuando quieras recorte duro (sin rutas de desplazamiento), y combínalo con display: flow-root si necesitas contención del flujo.

Relación con el DOM y API útiles

En JavaScript, el DOM expone desbordamiento como propiedad de estilo, y puedes inspeccionar/ajustar el estado del elemento: element.style.overflowY y getComputedStyle(element).overflowY. Además, para desplazar contenidos usa desplazamiento hacia arriba y desplazarA(), salvo con clip donde no hay scroll de ningún tipo.

const panel = document.querySelector('.panel');
panel.style.overflowY = 'auto';
if (getComputedStyle(panel).overflowY !== 'visible') {
  panel.scrollTo({ top: panel.scrollHeight, behavior: 'smooth' });
}

Si trabajas con enlaces internos, recuerda que tabular hacia un elemento oculto dentro de un contenedor oculto/auto puede hacer que el navegador desplazar automáticamente para ponerlo en vista; es una forma legítima de desplazamiento programático, útil para mejorar la navegación con teclado.

Tabla mental rápida de opciones

Para tenerlo claro de un vistazo: Visible deja que todo singga; hidden recorta y permite el desplazamiento programático; acortar recortar y no permite scroll; mover recorta pero siempre muestra barras; y auto solo muestra barras cuando procede. Y recuerda que no visible/clip crea contexto de formato, vital para el rendimiento con flotadores.

Ejemplos de combinación por ejes

Dos patrones que verás constantemente: desplazamiento vertical sin barra horizontal, y recorte en un eje con clip mientras el otro se desplaza automáticamente.

/* Scroll vertical, sin horizontal */
.lista {
  max-height: 300px;
  overflow-x: hidden;
  overflow-y: auto;
}

/* Recorte duro en X, desplazamiento automático en Y */
.panel {
  overflow-x: clip;
  overflow-y: auto;
  display: flow-root; /* contén el flujo si lo necesitas */
}

Diez presentes las reglas de interacción: si un eje usa un valor distinto de visible/clip y el otro pone visible, ese visible se elevar un auto. Con clip sucede algo parecido: si el otro eje no es visible ni clip, el El clip actúa como oculto.

Casos de uso habitual

En interfaces modernas, desbordamiento-y Es imprescindible para chatboxes, paneles de filtros, menús largos, logs o listados con altura acotada. Se complementa con cabeceras pegajosas y pies de página dentro del contenedor, y suele acompañarse de desbordamiento-x: oculto para evitar barras laterales.

En diseños con tarjetas o modales, puedes alternar entre auto (para no mostrar la barra si no hace falta) y mover (para estabilizar el ancho cuando aparezcaría la barra durante la carga). Si el modal debe recortar partes decorativas, acortar evita interacciones y ahorra cálculos.

Errores comunes y cómo evitarlos

El fallo más repetido es declarar desbordamiento sin altura y esperar una barra que nunca llega; definir altura o altura máxima/tamaño de bloque. El segundo es olvidarse del eje horizontal: siempre valora overflow-x en paralelo, sobre todo si usas sombras o pseudo-elementos.

Un tercero es no considerar accesibilidad: contenedores desplazables sin foco de teclado o sin nombre accesible complican la vida a los usuarios con lector de pantalla. agrega tabindex, rol y etiqueta aria cuando no sea enfocable por defecto.

Recursos Relacionados

Si quieres ampliar, revisa el tutorial general de Desbordamiento en CSS y la referencia del DOM para desbordamiento en elementos. Estas páginas cubren desde fundamentos hasta peculiaridades finas de implementación y compatibilidad.

Dominar overflow-y implica entender qué recorta, cuándo se desplaza, cómo interactúa con el eje opuesto y qué efecto tiene en el contexto de formato; con las pautas de dimensiones, accesibilidad y combinación con overflow-x, es sencillo lograr paneles fluidos, sin barras imprevistas y con un desplazamiento suave tanto para usuarios como para scripts.

Artículo relacionado:
Resuelto: obtener la altura del elemento ref.
Artículos Relacionados: