Barra de desplazamiento CSS personalizada para Firefox

313

Quiero personalizar una barra de desplazamiento con CSS.

Uso este código CSS de WebKit, que funciona bien para Safari y Chrome:

::-webkit-scrollbar {
    width: 15px;
    height: 15px;
}

::-webkit-scrollbar-track-piece  {
    background-color: #C2D2E4;
}

::-webkit-scrollbar-thumb:vertical {
    height: 30px;
    background-color: #0A4C95;
}

¿Cómo puedo hacer lo mismo en Firefox?

Sé que puedo hacerlo fácilmente usando jQuery, pero preferiría hacerlo con CSS puro si es factible.

Agradecería el consejo experto de alguien!

Dimitri Vorontzov
fuente
1
Por favor, comparta cómo puede hacerlo usando jQuery. Me enfrento al mismo problema, pero usé CSS para solucionarlo para Webkit. Sin embargo, Firefox plantea un problema con el que su solución jQuery puede ayudarlo.
iGbanam
1
Recomiendo usar jscrollpane jQuery plugin.
Dimitri Vorontzov
Hay un problema con jScrollPane en Firefox. jScrollPane funciona perfectamente en Chrome, pero en Firefox tiene una barra de desplazamiento del sistema vacía a la derecha de la barra de desplazamiento de jScrollPane. Solo debería haber una barra de desplazamiento
iGbanam
1
No es verdad. Si tienes eso, hiciste algo mal en alguna parte.
Dimitri Vorontzov

Respuestas:

239

¡A finales de 2018, ahora hay una personalización limitada disponible en Firefox!

Ver estas respuestas:

Y esto para información de fondo: https://bugzilla.mozilla.org/show_bug.cgi?id=1460109


No hay equivalente de Firefox ::-webkit-scrollbary amigos.

Tendrás que seguir con JavaScript.

A mucha gente le gustaría esta función, consulte: https://bugzilla.mozilla.org/show_bug.cgi?id=77790


En cuanto a los reemplazos de JavaScript, puede intentar:

Thirtydot
fuente
2
Gracias ThirtyDot. Sin embargo, una pregunta: ¿qué pasa con -moz-apariencia: scrollbartrack-vertical y otras extensiones CSS relacionadas? ¿Quizás se pueden usar de alguna manera?
Dimitri Vorontzov
2
No. Desafortunadamente, ninguno de los valores posibles para -moz-appearancepuede ayudar. "The -moz-appearance CSS property is used in Gecko (Firefox) to display an element using a platform-native styling based on the operating system's theme."- solo obtendrás una barra de desplazamiento nativa.
thirtydot
15
En caso de que alguien que lea esto necesite una solución práctica, terminé usando el complemento jscrollpane jQuery.
Dimitri Vorontzov
1
@JacquesMathieu, veo a qué te refieres. Aunque eso no es culpa de Baron, si descargo la página y evito que el barón se inicie, el error aún ocurre. Entonces parece que Chrome tiene la culpa aquí.
thephpdev
3
drafts.csswg.org/css-scrollbars-1 es el inicio de la etapa 1 de la especificación, pero está habilitado en Firefox Nightly ahora de forma predeterminada.
Wegry
53

Firefox 64 agrega soporte para el borrador de especificación CSS Scrollbars Module Level 1 , que agrega dos nuevas propiedades de scrollbar-widthy scrollbar-colorque dan cierto control sobre cómo se muestran las barras de desplazamiento.

Puede establecer scrollbar-coloruno de los siguientes valores (descripciones de MDN):

  • auto Representación de plataforma predeterminada para la parte de seguimiento de la barra de desplazamiento, en ausencia de otras propiedades de color de la barra de desplazamiento relacionadas.
  • dark Muestre una barra de desplazamiento oscura, que puede ser una variante oscura de la barra de desplazamiento proporcionada por la plataforma o una barra de desplazamiento personalizada con colores oscuros.
  • light Muestre una barra de desplazamiento clara, que puede ser una variante ligera de la barra de desplazamiento proporcionada por la plataforma o una barra de desplazamiento personalizada con colores claros.
  • <color> <color> Aplica el primer color al pulgar de la barra de desplazamiento, el segundo a la pista de la barra de desplazamiento.

Tenga en cuenta que darky los lightvalores no se implementan actualmente en Firefox .

notas de macOS:

Las barras de desplazamiento semitransparentes de ocultación automática que son las predeterminadas de macOS no se pueden colorear con esta regla (todavía eligen su propio color de contraste basado en el fondo). Solo las barras de desplazamiento que se muestran permanentemente (Preferencias del sistema> Mostrar barras de desplazamiento> Siempre) están coloreadas.

Demostración visual:

Puede establecer scrollbar-widthuno de los siguientes valores (descripciones de MDN):

  • auto El ancho de barra de desplazamiento predeterminado para la plataforma.
  • thin Una variante de ancho de barra de desplazamiento delgada en plataformas que proporcionan esa opción, o una barra de desplazamiento más delgada que el ancho de barra de desplazamiento de plataforma predeterminado.
  • none No se muestra la barra de desplazamiento, sin embargo, el elemento seguirá siendo desplazable.

También puede establecer un valor de longitud específico, de acuerdo con la especificación. Ambos thiny una longitud específica pueden no hacer nada en todas las plataformas, y lo que hace exactamente es específico de la plataforma. En particular, Firefox no parece admitir actualmente un valor de longitud específico ( este comentario en su rastreador de errores parece confirmar esto ). Sin thinembargo, el trabajo de teclado parece estar bien soportado, con macOS y Windows al menos.

Probablemente valga la pena señalar que la opción de valor de longitud y toda la scrollbar-widthpropiedad se están considerando para su eliminación en un borrador futuro, y si eso sucede, esta propiedad en particular puede eliminarse de Firefox en una versión futura.

Demostración visual:

Alexander O'Mara
fuente
Gracias por esta respuesta He actualizado mi respuesta aceptada para promover esta (y la otra respuesta relevante) para que las personas tengan más probabilidades de verla.
thirtydot
1
Esto esencialmente duplica la respuesta de Luca de tres semanas antes.
Josh Habdas
@JoshHabdas Esa respuesta no contiene casi tanta información de compatibilidad o uso. Creé esta respuesta porque la otra respuesta no tenía la información importante que estaba buscando.
Alexander O'Mara
1
Puede darles crédito, sugerir comentarios o considerar editar su respuesta.
Josh Habdas
2
@JoshHabdas Bueno, 5 personas ya lo encontraron útil, y contiene información que no se encuentra en ningún otro lugar en la web, así que no estoy de acuerdo.
Alexander O'Mara
43

¿Puedo ofrecer una alternativa?

Sin secuencias de comandos, solo estilos CSS estandarizados y un poco de creatividad. Respuesta corta: enmascarar partes de la barra de desplazamiento del navegador existente, lo que significa que conserva toda su funcionalidad.

.scroll_content {
    position: relative;
    width: 400px;
    height: 414px;
    top: -17px;
    padding: 20px 10px 20px 10px;
    overflow-y: auto;
}

Para una demostración y una explicación un poco más detallada, consulte aquí ...

jsfiddle.net/aj7bxtjz/1/

Tomaz
fuente
77
Esto no responde la pregunta, desafortunadamente. Dimitri está tratando de diseñar la barra de desplazamiento, no ocultarla.
stvnrynlds
14
Eso fue hace 4 años (soy consciente de eso), así que estoy seguro de que ya ha hecho algo. Pero el tema sigue siendo relevante hoy en día, mientras que otros navegadores permiten algún tipo de modificación "ilegal" de las barras de desplazamiento, FF no. Es por eso que decidí publicarlo, y el resultado inicial es el estilo visual de la barra de desplazamiento, independientemente del hecho de que la forma de hacerlo está ocultando parte de ella.
Tomaz
Me encanta esta solución, excepto por todo el marcado adicional con posicionamiento absoluto (hace que las cosas de tamaño variable sean una pesadilla) y además no puedes cambiar el estilo, simplemente estás enmascarando / ocultando elementos del desplazador existente, ¡muy mal si quiero una barra verde!
RozzA
3
sí, después de cuatro años, no se trata de responder a la pregunta del OP sino de contribuir a la comunidad.
tmthyjames
3
La esencia del problema es que las soluciones proporcionadas por algunos motores de renderizado no son estándar. Esta es la pregunta que mejor aborda mis preocupaciones y esta es la respuesta que buscaba.
Filip Dupanović
36

Pensé que compartiría mis hallazgos en caso de que alguien esté considerando un complemento JQuery para hacer el trabajo.

Le di una oportunidad a JQuery Custom Scrollbar . Es bastante elegante y tiene un desplazamiento suave (con inercia de desplazamiento) y tiene muchos parámetros que puede ajustar, pero terminó siendo demasiado intensivo para mi CPU (y agrega una cantidad considerable al DOM).

Ahora estoy probando Perfect Scrollbar . Es simple y liviano (6 KB) y hasta ahora está haciendo un trabajo decente. No es intensivo en CPU (por lo que puedo decir) y agrega muy poco a su DOM. Solo tiene un par de parámetros para ajustar (wheelSpeed ​​y wheelPropagation), pero es todo lo que necesito y maneja las actualizaciones del contenido de desplazamiento muy bien (como cargar imágenes).

PD: He echado un vistazo rápido a JScrollPane, pero @simone tiene razón, ahora está un poco anticuado y es un PITA.

Markus Coetzee
fuente
3
También hay un emulador de desplazamiento de trackpad : es lo que usa twitch.tv.
forivall
1
Perfect Scrollbar es realmente muy bueno. Después de agotar muchas otras opciones, encontré que era la mejor solución. Gracias por sugerirlo.
Leonard Teo
nanoScroller también es realmente bueno y relativamente delgado. jamesflorentino.github.io/nanoScrollerJS Opuesto a los pesados ​​complementos de JS, este simplemente oculta el desplazamiento nativo y muestra un desplazamiento alternativo que usa el evento 'desplazamiento' nativo
Danny R
1
He estado evitando todas las soluciones de jquery, ya que todas se quedan atrás en máquinas más lentas o máquinas bajo estrés, pero PS parece un ganador
RozzA
31

Desde Firefox 64 , es posible utilizar nuevas especificaciones para un estilo de barra de desplazamiento simple ( no tan completo como en Chrome con prefijos de proveedor ).

En este ejemplo, es posible ver una solución que combina diferentes reglas para abordar Firefox y Chrome con un resultado final similar (no igual) (por ejemplo, use sus reglas originales de Chrome):

Las reglas clave son:

Para Firefox

.scroller {
  overflow-y: scroll;
  scrollbar-color: #0A4C95 #C2D2E4;
}

Para cromo

.scroller::-webkit-scrollbar {
    width: 15px;
    height: 15px;
}

.scroller::-webkit-scrollbar-track-piece  {
    background-color: #C2D2E4;
}

.scroller::-webkit-scrollbar-thumb:vertical {
    height: 30px;
    background-color: #0A4C95;
}

Tenga en cuenta que con respecto a su solución, es posible utilizar también reglas de Chrome más simples como las siguientes:

.scroller::-webkit-scrollbar-track  {
    background-color: #C2D2E4;
}

.scroller::-webkit-scrollbar-thumb {
    height: 30px;
    background-color: #0A4C95;
}

Finalmente, para ocultar las flechas en las barras de desplazamiento también en Firefox, actualmente es necesario configurarlo como " delgado " con la siguiente reglascrollbar-width: thin;

Luca Detomi
fuente
1
Parece que IE 5.5 puede haber hecho algo bien después de todo. :)
Josh Habdas
5

Año 2020 esto funciona

/* Thin Scrollbar */
:root{
  scrollbar-color: rgb(210,210,210) rgb(46,54,69) !important;
  scrollbar-width: thin !important;
}

https://github.com/Aris-t2/CustomCSSforFx/issues/160

humano
fuente
Buenas noticias, pero ¿cómo podemos cambiar el esquema?
AbeIsWatching
0

Funciona en estilo de usuario, y parece que no funciona en páginas web. No he encontrado la dirección oficial de Mozilla sobre esto. Si bien puede haber funcionado en algún momento, Firefox no tiene soporte oficial para esto. Este error aún está abierto https://bugzilla.mozilla.org/show_bug.cgi?id=77790

scrollbar {
/*  clear useragent default style*/
   -moz-appearance: none !important;
}
/* buttons at two ends */
scrollbarbutton {
   -moz-appearance: none !important;
}
/* the sliding part*/
thumb{
   -moz-appearance: none !important;
}
scrollcorner {
   -moz-appearance: none !important;
   resize:both;
}
/* vertical or horizontal */
scrollbar[orient="vertical"] {
    color:silver;
}

consulte http://codemug.com/html/custom-scrollbars-using-css/ para obtener más detalles.

ipirlo
fuente
2
Intenté lo mismo que escribiste , pero no funciona para mi en FF, revisa jsfiddle.net/gGbkY/1 ¿ Me estoy perdiendo algo?
Satinder singh
Funciona en estilo de usuario, y parece que no funciona en páginas web. No he encontrado la dirección oficial de Mozilla sobre esto.
ipirlo
1
mira
3
¿Cuál es el estilo de usuario?
Marecky
El error que vinculó se informó hace 17 años y aún no se ha asignado. Creo que es seguro decir que FF nunca admitirá la ocultación de las barras de desplazamiento nativas.
Sterling Bourne
-2
@-moz-document url-prefix(http://),url-prefix(https://) {
    scrollbar {
       -moz-appearance: none !important;
       background: rgb(0,255,0) !important;
    }
    thumb,scrollbarbutton {
       -moz-appearance: none !important;
       background-color: rgb(0,0,255) !important;
    }

    thumb:hover,scrollbarbutton:hover {
       -moz-appearance: none !important;
       background-color: rgb(255,0,0) !important;
    }
    scrollbarbutton {
       display: none !important;
    }
    scrollbar[orient="vertical"] {
      min-width: 15px !important;
    }
}
ramme
fuente
55
Ha proporcionado un blob de código con poca o ninguna información que describa lo que hace o cómo lo hace.
Josh Habdas