Accede a todo EDteam con un único pago¡Sube a premium!

Domina las barras de scroll con variables CSS y JavaScript

Las barras de scroll son un dolor de cabeza en Responsive Web Design pero con un sencillo truco podrás dominarlas de una vez por todas.

Diseño web
2 minutos
Hace 6 años
Domina las barras de scroll con variables CSS y JavaScript

Un problema común en el responsive web design es comprender a la barra de scroll. ¿Es parte del viewport? ¿Su ancho influye en nuestro diseño web o desmaquetará algo?

Responder a estas preguntas no es sencillo. Digamos que la barra de scroll sí es parte del viewport pero no participa en él. Sí, pero no, como diría Beto.

Sí es parte del viewport porque la podemos ver (de otro modo sería invisible). Pero no es parte del viewport porque no participa en los cálculos de las dimensiones. Te lo explico con el siguiente gráfico:

Papel de la barra de scroll en el calculo del viewport

Como puedes ver si a un elemento (hijo de body) le damos 100% de ancho se extenderá hasta tocar la barra de scroll. Mientras que un elemento con 100vw (100% del ancho del viewport) se extenderá hasta el área ocupada por la barra de scroll (generando un scroll horizontal, no pasando por debajo o por encima ella, lo que demuestra que la barra de scroll no es parte del viewport). Esto suele generar muchos dolores de cabeza a los diseñadores web.

Calcular el ancho de la barra de scroll con JavaScript

Sin embargo, si te fijas bien, del gráfico anterior se deduce que es muy sencillo calcular el ancho de la barra de scroll. Basta una simple función de JavaScript:

1const getScrollBarWidth = () => window.innerWidth - document.documentElement.getBoundingClientRect().width 2

Ahora, llevaremos ese valor a css con una variable.

1document.documentElement.style.setProperty('--scrollbar', `${getScrollBarWidth()}px`) 2

A partir de ahora, en css podemos estar seguros que ningun contenido con viewport se desborde. Por ejemplo:

1.container { 2 width: calc(100vw - var(--scrollbar)) 3} 4

Recalcular el ancho de la barra de scroll al redimensionar la pantalla

Puesto que al redimensionar la pantalla, la barra de scroll puede aparecer o desaparecer, debemos detectar también el evento resize. Por ejemplo, en móvil la barra de scroll no interfiere con el viewport, así que aunque exista scroll su ancho siempre será cero.

Nuestro código finalmente quedará así:

1// función para obtener el ancho de la barra de scroll 2const getScrollBarWidth = () => window.innerWidth - document.documentElement.getBoundingClientRect().width 3 4// funcion para asignar ese valor a una variable css 5const cssScrollBarWidth = () => document.documentElement.style.setProperty('--scrollbar', `${getScrollBarWidth()}px`) 6 7// asignar la variable css al cargar la página 8addEventListener('load', cssScrollBarWidth) 9 10// reasignar la variable css al redimensionar la ventana 11addEventListener('resize', cssScrollBarWidth) 12

Basta copiar este código javascript en tu proyecto y saber que tienes a tu disposición la variable css --scrollbar para utilizarla cada vez que la barra de scroll te haga renegar ?

Comentarios de los usuarios

Pregunta a ChatEDT