Skip to content

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

📜 Bloque de scroll en CSS y jQuery: altura fija con desplazamiento

📜 Bloque de scroll en CSS y jQuery: altura fija con desplazamiento

Bloques interminables de texto SEO, comentarios que ocupan media pantalla, registros de administración y tablas de 30 columnas rompen la maquetación y obligan a los lectores a desplazarse sin fin. ¿Le suena familiar? Existe una solución, y es vergonzosamente simple: un bloque con altura fija y desplazamiento interno.

Cuando empecé a construir maquetaciones, metía el contenido en overflow: hidden y rezaba para que nadie notara el texto cortado. Luego descubrí los bloques con desplazamiento y lo cambió todo: los textos SEO de los clientes quedaban ordenados, las páginas dejaban de hincharse en el móvil y los scripts vecinos ya no entraban en conflicto.

A continuación presento dos enfoques funcionales: CSS puro (para la mayoría de las tareas) y un envoltorio jQuery (para escenarios personalizados). Ambos están probados en decenas de proyectos, funcionan correctamente en dispositivos móviles y no interfieren con scripts vecinos.

💡 Resumen rápido:

  • Envuelva el contenido en un <div> con las clases scroll-block y scroll-content
  • Establezca max-height + overflow-y: auto en CSS, el bloque con desplazamiento ya está listo
  • Conecte el plugin jQuery del artículo para obtener desplazamiento automático, animación y eventos
  • Estilice la barra de desplazamiento mediante ::-webkit-scrollbar para que combine con el diseño de su sitio

Qué es un bloque con desplazamiento y dónde lo necesita realmente

Un bloque con desplazamiento es un contenedor con altura fija cuyo contenido se desplaza internamente, independiente del desplazamiento principal de la página. El navegador añade una barra de desplazamiento automáticamente cuando el contenido supera la altura establecida.

Dónde aplico esta solución constantemente:

  • Textos SEO. El cliente quiere un muro de 3000 palabras en medio de una página de aterrizaje, lo envuelvo en un bloque con desplazamiento, la página no se convierte en un lienzo infinito.
  • Comentarios y registros. Hilos de discusión largos o registros de depuración en el panel de administración, la altura fija salva la interfaz del desorden.
  • Tablas de datos. El desplazamiento horizontal para tablas es clásico, pero el desplazamiento vertical en una tabla con más de 50 filas resuelve el problema igual de bien.
  • Widgets de chat y notificaciones. Una ventana de chat con historial de mensajes, el mismo bloque con desplazamiento, solo que con desplazamiento automático al último mensaje.

Técnicamente todo se basa en dos propiedades CSS: max-height (o height) y overflow-y. Pero el diablo está en los detalles: los navegadores móviles, los contenedores anidados, los conflictos con position: fixed y las peculiaridades de iOS Safari requieren un enfoque cuidadoso.

Consulte este breve tutorial sobre la propiedad overflow, muestra claramente todos los modos de desplazamiento y su comportamiento:

Solución CSS: rápida y sin JavaScript

Para la gran mayoría de los casos, no se necesita JavaScript. Bastan tres líneas de CSS:

1.scroll-block {
2 max-height: 320px;
3 overflow-y: auto;
4 border: 1px solid #e0e0e0;
5 padding: 16px;
6}

Analicémoslo. max-height establece el techo, el bloque no crecerá más de 320px pero puede ser más bajo si hay menos contenido. overflow-y: auto le dice al navegador: «muestre la barra de desplazamiento solo cuando el contenido desborde el contenedor». El borde y el relleno son opcionales, pero sin relleno el texto se pega a la barra de desplazamiento y se ve barato.

El HTML se mantiene semánticamente limpio:

1<div class="scroll-block">
2 <p>Your long SEO text, logs, table, or whatever.</p>
3</div>

Esta solución funciona de manera idéntica en Chrome, Firefox, Safari y Edge, la especificación overflow ha sido estable desde CSS2 y es compatible con todos los navegadores modernos. En dispositivos móviles, el desplazamiento dentro del bloque no entra en conflicto con el desplazamiento principal de la página (a diferencia de las ingeniosas soluciones JavaScript de la década de 2010 que capturaban touchmove y a menudo rompían el desplazamiento).

Pero hay un matiz con iOS Safari: por defecto, el desplazamiento dentro del bloque es «inelástico», no hay efecto nativo de rebote. Si necesita un desplazamiento inercial suave como el del contenido principal, añada:

1.scroll-block {
2 -webkit-overflow-scrolling: touch;
3}

La propiedad -webkit-overflow-scrolling: touch habilita el desplazamiento nativo con inercia en iOS. Nota: con iOS 13, Apple convirtió esto en el comportamiento predeterminado para overflow: auto, por lo que para versiones recientes el prefijo es opcional. Pero si el proyecto admite iPads antiguos, consérvelo.

Solución jQuery: cuando necesita control total

El método CSS resuelve la mayoría de las tareas. Los casos restantes son cuando necesita desplazamiento programático al final (chat), eventos personalizados al alcanzar los límites del bloque, o animación de desplazamiento mediante un botón. Aquí es donde entra jQuery.

Aquí tiene un plugin listo para usar, mínimo, sin dependencias excepto jQuery, probado en proyectos con versiones modernas de WordPress y no entra en conflicto con otros scripts del tema:

1(function($) {
2 $.fn.scrollBlock = function(options) {
3 var settings = $.extend({
4 maxHeight: 320,
5 autoScroll: false,
6 scrollSpeed: 400,
7 onTopReached: null,
8 onBottomReached: null
9 }, options);
10
11 return this.each(function() {
12 var $block = $(this);
13
14 $block.css({
15 'max-height': settings.maxHeight + 'px',
16 'overflow-y': 'auto'
17 });
18
19 if (settings.autoScroll) {
20 $block.animate({
21 scrollTop: $block[0].scrollHeight
22 }, settings.scrollSpeed);
23 }
24
25 $block.on('scroll', function() {
26 var scrollTop = $block.scrollTop();
27 var maxScroll = $block[0].scrollHeight - $block.outerHeight();
28
29 if (scrollTop <= 0 && settings.onTopReached) {
30 settings.onTopReached.call(this);
31 }
32 if (scrollTop >= maxScroll && settings.onBottomReached) {
33 settings.onBottomReached.call(this);
34 }
35 });
36 });
37 };
38})(jQuery);

Dónde lanzarlo: su script (archivo JS separado del tema o sección <script> en el pie de página). Inclúyalo después de jQuery:

1$(document).ready(function() {
2 $('.scroll-content').scrollBlock({
3 maxHeight: 400,
4 autoScroll: true,
5 scrollSpeed: 600,
6 onBottomReached: function() {
7 console.log('Reached bottom of block');
8 }
9 });
10});

Lo que sucede aquí: el plugin toma un selector, aplica un límite de altura CSS, opcionalmente desplaza el bloque hasta el final y rastrea el alcance de los límites superior/inferior mediante callbacks. Nada de magia, solo un envoltorio sobre los métodos estándar de jQuery .css(), .animate() y el evento scroll.

Use esta solución cuando: a) necesite desplazar automáticamente el chat al último mensaje, b) se requiera una animación de desplazamiento suave mediante un botón externo de «Abajo»/«Arriba», c) necesite adjuntar analíticas al evento «el usuario leyó hasta el final».

Múltiples bloques en una página

Escenario: tres bloques con desplazamiento y diferente contenido en la página. Si establece una clase .scroll-block sin identificadores únicos, todo funciona, el CSS se aplica a todos a la vez. Pero tan pronto como cada bloque necesita su propia altura, bienvenido al mundo de los ID.

CSS para múltiples bloques con diferentes alturas:

1#seo-text-block {
2 max-height: 320px;
3 overflow-y: auto;
4}
5
6#changelog-block {
7 max-height: 480px;
8 overflow-y: auto;
9}
10
11#comments-block {
12 max-height: 600px;
13 overflow-y: auto;
14}

HTML:

1<div id="seo-text-block" class="scroll-block">
2 <!-- Long SEO text -->
3</div>
4
5<div id="changelog-block" class="scroll-block">
6 <!-- Changelog list -->
7</div>

Con el plugin jQuery, la misma lógica: inicialice cada bloque por separado con sus propios ajustes:

1$('#seo-text-block').scrollBlock({ maxHeight: 320 });
2$('#changelog-block').scrollBlock({ maxHeight: 480, autoScroll: true });
3$('#comments-block').scrollBlock({ maxHeight: 600, autoScroll: true, scrollSpeed: 300 });

Si hay muchos bloques (más de 10) y todos son idénticos, una clase común es suficiente. Si son diferentes, ID más ajustes individuales. Nada de magia con nth-child o iteración manual, los selectores CSS manejan esto de fábrica.

Estilizar la barra de desplazamiento: para que no parezca de 2007

La barra de desplazamiento predeterminada del navegador es un rectángulo gris de la era de Windows XP. Dos minutos de CSS y encaja en su diseño:

1.scroll-block::-webkit-scrollbar {
2 width: 6px;
3}
4
5.scroll-block::-webkit-scrollbar-track {
6 background: #f1f1f1;
7 border-radius: 3px;
8}
9
10.scroll-block::-webkit-scrollbar-thumb {
11 background: #c1c1c1;
12 border-radius: 3px;
13}
14
15.scroll-block::-webkit-scrollbar-thumb:hover {
16 background: #a1a1a1;
17}

Importante: los pseudoelementos ::-webkit-scrollbar funcionan en Chrome, Edge, Safari y Opera, cubriendo a la gran mayoría de usuarios. Firefox usa propiedades separadas scrollbar-width: thin y scrollbar-color, pero no se puede estilizar globalmente la barra de desplazamiento en Firefox a nivel de elemento (solo a nivel de página). Para Firefox, esto es suficiente:

1html {
2 scrollbar-width: thin;
3 scrollbar-color: #c1c1c1 #f1f1f1;
4}

No exagere con el ancho de la barra de desplazamiento: de 4 a 8px es el rango óptimo. Más delgada de 4px, los usuarios no acertarán con el dedo en el móvil. Más gruesa de 8px, la barra empieza a llamar demasiado la atención.

⁉️🤔 Preguntas frecuentes

¿Funciona el bloque con desplazamiento en dispositivos móviles?

Sí, y sin trucos. La propiedad CSS overflow-y: auto es compatible de forma nativa con iOS Safari y Chrome para Android. El desplazamiento interno del bloque no entra en conflicto con el desplazamiento principal de la página, el navegador determina qué contenedor desplazar según la posición del dedo. Único matiz: en iOS antiguo (anterior a 13), añada -webkit-overflow-scrolling: touch para el desplazamiento inercial.

¿Se puede usar un bloque con desplazamiento dentro de un contenedor Flexbox o Grid?

Se puede. El bloque con desplazamiento necesita altura fija, establézcala mediante max-height en píxeles o mediante flex-basis/grid-row con un valor absoluto. No use altura porcentual dentro de un hijo flex sin altura explícita en el padre, el navegador no puede calcular la base para el cómputo del desbordamiento y el desplazamiento no aparecerá.

¿Cómo hacer un desplazamiento suave del bloque hasta el final sin jQuery?

En JavaScript puro: element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' }). El método scrollTo con la opción behavior: 'smooth' es compatible con todos los navegadores modernos. Para el desplazamiento automático del chat, llame a esta línea después de añadir cada nuevo mensaje.

¿El bloque con desplazamiento entra en conflicto con otros scripts de la página?

La solución CSS, no. Son propiedades nativas del navegador, funcionan de forma aislada. El plugin jQuery del artículo usa su propio espacio de nombres $.fn.scrollBlock y no toca variables globales, por lo que los conflictos están descartados. Probado en sitios con más de 20 plugins activos, no surgió ningún problema.

¿Se puede animar la aparición de un bloque con desplazamiento?

Sí. Añada max-height: 0 y overflow: hidden en el estado inicial, luego anime hasta la altura objetivo. Cuando la animación termine, cambie overflow a auto. En jQuery esto se hace mediante .animate({ 'max-height': '320px' }, 500, function() { $(this).css('overflow-y', 'auto') }). En CSS puro, mediante transition: max-height 0.5s ease.

JQuery o CSS: qué usar en 2026

La solución CSS cubre la gran mayoría de los escenarios y pesa cero kilobytes. Si solo necesita un bloque ordenado con desplazamiento interno, úsela y no complique las cosas en exceso.

El plugin jQuery se justifica cuando: está construyendo un chat con desplazamiento automático, adjuntando analíticas a eventos de desplazamiento o animando el desplazamiento mediante un botón externo. En otros casos, el envoltorio jQuery es una solución excesiva que añade una dependencia de biblioteca para tres líneas de CSS.

Pruebe la variante CSS ahora mismo: copie tres líneas de estilos, envuelva contenido de prueba en <div class="scroll-block"> y abra la página en su teléfono. Verá resultados en un minuto, sin npm install, sin empaquetadores, sin dolor.