Generador de barra de desplazamiento CSS

Siguiente

Las barras de desplazamiento personalizadas solían ser una pesadilla de pseudoelementos con prefijos de proveedor. Hoy, scrollbar-color y scrollbar-width cubren los casos habituales en todos los navegadores modernos: ancho estrecho o normal y un tema de dos colores (control y guía). Para un control a nivel de píxel (relleno de la guía, radio del control, estados al pasar el cursor), los antiguos pseudoelementos ::-webkit-scrollbar siguen funcionando en Chrome y Safari. Este generador produce ambas versiones y las combina correctamente en cascada.

Cómo dar estilo a una barra de desplazamiento

  1. 1

    Elige el ancho

    Auto (ancho predeterminado de la plataforma), estrecho (más fino) o un valor concreto en píxeles mediante las reglas de webkit.

  2. 2

    Define los colores del control y la guía

    El moderno `scrollbar-color` acepta dos colores. Las reglas de webkit permiten color, radio y estados al pasar el cursor por separado.

  3. 3

    Añade un efecto al pasar el cursor (opcional)

    El control se aclara al pasar el cursor. Funciona mediante `::-webkit-scrollbar-thumb:hover`.

  4. 4

    Decide el ámbito

    Aplícalo a `html` / `body` (toda la página) o solo a un contenedor con desplazamiento concreto.

  5. 5

    Copia el CSS

    Reglas modernas y de webkit combinadas: funciona en cualquier navegador moderno con una degradación elegante.

Propiedades estándar modernas (2023 en adelante)

/* Applies to the element that scrolls */
html {
  scrollbar-width: thin;           /* auto | thin | none */
  scrollbar-color: #4f46e5 #e5e7eb; /* thumb track */
}

Compatibilidad de navegadores (2024):

  • scrollbar-width: Chrome 121+, Safari 18.2+, Firefox 64+.
  • scrollbar-color: Chrome 121+, Safari 18.2+, Firefox 64+.
  • scrollbar-gutter: stable: Chrome 94+, Safari 14+, Firefox 97+. Reserva el espacio de la barra de desplazamiento incluso cuando no se necesita, evitando saltos en el diseño.

Pseudoelementos de webkit (Chrome, Safari, Edge antiguo)

::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}
::-webkit-scrollbar-track {
  background: #e5e7eb;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 10px;
}
::-webkit-scrollbar-thumb:hover {
  background: #3730a3;
}

Un control más detallado. width fija el ancho de la barra de desplazamiento vertical; height fija la altura de la horizontal. Añade ambas para contenedores que pueden desplazarse en cualquier dirección.

Combina los dos enfoques en cascada

Especifica primero las reglas modernas y luego webkit como mejora para los navegadores que interpretan ambas:

.scroll-area {
  scrollbar-width: thin;
  scrollbar-color: #4f46e5 #e5e7eb;
}
.scroll-area::-webkit-scrollbar       { width: 8px; }
.scroll-area::-webkit-scrollbar-track { background: #e5e7eb; }
.scroll-area::-webkit-scrollbar-thumb {
  background: #4f46e5;
  border-radius: 4px;
  border: 2px solid #e5e7eb;
}

Firefox solo respeta las reglas modernas scrollbar-*. Chrome y Safari respetan las reglas de webkit (que anulan las modernas, de modo que el comportamiento es coherente).

scrollbar-gutter evita el desplazamiento del contenido

Sin un espacio reservado, el contenido se reajusta cuando aparece una barra de desplazamiento (habitual en listas dinámicas). Solución:

html { scrollbar-gutter: stable; }
/* or */
html { scrollbar-gutter: stable both-edges; }

El hueco de la barra de desplazamiento se reserva tanto si el contenido se desplaza como si no. both-edges añade un hueco equivalente en el lado opuesto para mantener el contenido visualmente centrado.

Ocultar las barras de desplazamiento por completo

.no-scrollbar {
  scrollbar-width: none;           /* Firefox */
}
.no-scrollbar::-webkit-scrollbar { display: none; }  /* Chrome, Safari */

Ten cuidado: ocultar la barra de desplazamiento impide que los usuarios vean que el contenido se puede desplazar. Úsalo solo con un indicador claro (flechas, puntos de página) o cuando el comportamiento de desplazamiento sea evidente por el contexto (carruseles horizontales, historiales de chat).

Consideraciones en móviles

En iOS y Android, las barras de desplazamiento solo aparecen un instante durante el desplazamiento. Tu CSS de barra personalizada se sigue aplicando, pero es posible que los usuarios no la vean más de un segundo. Diseña en consecuencia: no inviertas demasiado en detalles visuales que apenas se ven.

Accesibilidad

  • Contraste: el control frente a la guía debe cumplir un 3:1 para el contraste no textual (WCAG 1.4.11).
  • Ancho: las barras de desplazamiento finas pueden ser difíciles de agarrar con el ratón, sobre todo para usuarios con dificultades motoras. El ancho normal es un valor predeterminado más seguro.
  • Nunca elimines la barra de desplazamiento en regiones desplazables sin ofrecer otro medio de desplazamiento. Los usuarios que dependen de la barra quedarán bloqueados.

Preguntas frecuentes

Sí, con las propiedades modernas scrollbar-width y scrollbar-color. Firefox no admite los pseudoelementos de webkit, así que, para lograr una apariencia coherente entre navegadores, usa primero las propiedades modernas y añade las reglas de webkit como mejora.

Porque las barras de desplazamiento predeterminadas se superponen al contenido y no reservan espacio hasta que hacen falta. Define scrollbar-gutter: stable en el elemento desplazable para reservar siempre el hueco y evitar el reajuste cuando la barra aparece o desaparece.

Normalmente sí, porque la barra de desplazamiento desentona y compite con el contenido. Añade puntos de paginación o controles de flecha visibles para que los usuarios sigan sabiendo que el contenido se desplaza. Respeta prefers-reduced-motion si usas ajuste de desplazamiento (scroll-snapping).

Puede hacerlo. Las barras muy finas o de bajo contraste son difíciles de usar para personas con dificultades motoras y baja visión. Mantén la barra con al menos 8–10 px de ancho para un agarre cómodo y conserva un contraste de 3:1 entre el control y la guía.

Herramientas relacionadas