Comment puis-je désactiver un navigateur ou un élément scrollbar, tout en permettant de défiler avec des touches wheel ou arrow?

je veux cacher toutes les barres de défilement de mes éléments div et mon entier body , mais encore laisser l'Utilisateur faire défiler avec la roue de la souris ou les touches fléchées. Comment cela peut-il être réalisé avec du JavaScript brut ou du jQuery? Des idées?

51
demandé sur TylerH 2009-08-25 11:27:58

7 réponses

comme les réponses précédentes, vous utiliseriez overflow:hidden pour désactiver les barres de défilement sur le corps/div.

alors vous lierez l'événement mousewheel à une fonction qui changerait le scrollTop de la div pour émuler le défilement.

pour les touches fléchées, vous liez l'événement keydown pour reconnaître une touche fléchée, puis changez scrollTop et scrollLeft de la div comme approprié pour émuler le défilement. (Remarque: vous utilisez keydown au lieu de keypress car IE ne reconnaît pas keypress pour les touches fléchées.)

Edit: Je n'ai pas pu obtenir FF/Chrome pour reconnaître keydown sur un div, mais il fonctionne dans IE8. Selon ce que vous avez besoin de cela pour, vous pouvez définir un keydown sur le document pour faire défiler le div. (Voir la référence du code de clé à titre d'exemple.)

par exemple, défiler avec la roue de la souris (en utilisant jQuery et un la roulette de la souris plugin):

<div id="example" style="width:300px;height:200px;overflow:hidden">
insert enough text to overflow div here
</div>

<script>
$("#example").bind("mousewheel",function(ev, delta) {
    var scrollTop = $(this).scrollTop();
    $(this).scrollTop(scrollTop-Math.round(delta));
});
</script>

(c'est une maquette rapide, il faudrait ajuster les chiffres car pour moi, cela se déroule un peu lentement.)

code de référence

plugin mousewheel

keydown, keypress @ quirksmode

mise à jour 19/12/2012:

l'emplacement mis à jour du plugin mousewheel est à: https://github.com/brandonaaron/jquery-mousewheel

47
répondu Grace 2012-12-19 19:25:47

Qu'en est-il d'une solution purement CSS? J'ai testé ça et ça marche très bien. Cependant, je recommande Solution 3 car isn't hacky, il est pris en charge par tous les navigateurs avec JS et il est très simple.

Solution 1 (la croix-navigateur, mais plus hacky)

#div {
  position: fixed;
  right: -20px;
  left: 20px;
  background-color: black;
  color: white;
  height: 5em;
  overflow-y: scroll;
  overflow-x: hidden;
}
<html>

<body>
  <div id="div">
    Scrolling div with hidden scrollbars!<br/>
    On overflow, this div will scroll with the mousewheel but scrollbars won't be visible.<br/>
    Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>
  </div>
</body>

</html>

Solution 2 (IE et Chrome seulement)

il suffit d'ajouter le nobars classe de tout élément que vous souhaitez masquer les barres de défilement.

Firefox overflow: -moz-scrollbars-none est, , selon MDN , obsolète. Il fonctionnait mais Cache maintenant le débordement et désactive le défilement s'il est utilisé.

.nobars {
    /* Firefox: https://developer.mozilla.org/en/docs/Web/CSS/overflow */
    /* overflow: -moz-scrollbars-none; (no longer works) */
    /* IE: https://msdn.microsoft.com/en-us/library/hh771902(v=vs.85).aspx */
    -ms-overflow-style: none;
}
.nobars::-webkit-scrollbar {
    /* Chrome: https://css-tricks.com/custom-scrollbars-in-webkit/ */
    display: none;
}

Solution 3 (la croix-navigateur javascript)

Perfect Scrollbar ne nécessite pas de jQuery (bien qu'il puisse utilisez jQuery si installé) et a un démo disponible ici . Les composants peuvent être stylisés avec css comme dans l'exemple suivant:

.ps-scrollbar-y-rail {
  display: none !important;
}

voici un exemple complet incluant la mise en œuvre de Perfect Scrollbar:

<link rel="stylesheet" href="css/perfect-scrollbar.min.css">
<style>
  #container {
    position: relative; /* can be absolute or fixed if required */
    height: 200px; /* any value will do */
    overflow: scroll;
  }
  .ps-scrollbar-y-rail {
    display: none !important;
  }
</style>
<script src='js/perfect-scrollbar.min.js'></script>

<div id="container">
  Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>Scrollable<br>
</div>

<script>
  // on dom ready...
  var container = document.getElementById("container");
  Ps.initialize(container);
  //Ps.update(container);
  //Ps.destroy(container);
</script>
11
répondu Peter Gordon 2018-01-11 16:16:25

je préfère de beaucoup SamGoody de la réponse fournie à une copie de cette question. Il laisse les effets de défilement natifs intacts, au lieu d'essayer de ré-implémenter manuellement pour quelques périphériques d'entrée particuliers:

une meilleure solution est de mettre la div cible à débordement:scroll, et l'envelopper dans un deuxième élément qui est 8px plus étroit, qui est débordement:caché.

Voir la commentaire d'origine pour un étoffé exemple. Vous pouvez utiliser JavaScript pour déterminer la taille réelle des barres de défilement plutôt que de supposer qu'elles sont toujours 8px large comme son exemple le fait.

7
répondu natevw 2017-05-23 11:54:05

Vous n'avez pas à utiliser jquery ou js pour faire ça. Son plus performant avec webkit simple.

il suffit d'ajouter le code ci-dessous à votre fichier css.

::-webkit-scrollbar { 
    display: none; 
}

attention ! Cela va désactiver tous la barre de défilement afin de s'assurer de la mettre dans une classe spécifique d'identification ou si vous voulez juste un être caché.

7
répondu Baldráni 2015-04-28 17:11:33

pour obtenir ce travail pour moi, j'ai utilisé ce CSS:

html { overflow-y: hidden; }

mais j'ai eu des problèmes avec $(this).scrollTop() , donc je me suis attaché à mon #id, mais j'ai ajusté le scrollTop de la fenêtre. En outre, ma souris de défilement lisse tirerait beaucoup de 1 ou -1 deltas, donc je l'ai multiplié par 20.

$("#example").bind("mousewheel", function (ev, delta) {
    var scrollTop = $(window).scrollTop();
    $(window).scrollTop(scrollTop - Math.round(delta * 20));
});
4
répondu Kevin Hakanson 2011-03-05 15:38:33

Comme Baldráni dit ci-dessus

::-webkit-scrollbar { display: none; }
"151920920 Ou vous pouvez le faire

::-webkit-scrollbar{ width: 0px; }



(posté pour d'autres personnes qui trébuchent sur ce de google search!)

0
répondu DardanM 2015-05-27 00:10:11

Eh bien, peut-être pas le plus intuitif à mon avis, Mais je peux imaginer que vous êtes en mesure de faire une expérience décente, donner ceci un essai.

overflow:hidden; 

assurez-vous que l'objet parent a un height et width , et affiche block

-4
répondu JP Silvashy 2009-08-25 07:32:52