149 votes

Obtenir la largeur de la barre de défilement en utilisant JavaScript

Le code HTML suivant affichera une barre de défilement sur le bord intérieur droit de div.container.

Est-il possible de déterminer la largeur de cette barre de défilement ?

<div class="container" style="overflow-y:auto; height:40px;">
  <div class="somethingBig"></div>
</div>

1 votes

Cette question se pose dans le cas où la barre de défilement se trouve au mauvais endroit (quelque part au milieu de l'écran). Dans cette situation, vous ne souhaitez probablement pas afficher de barre de défilement. Dans la plupart des cas, j'ai trouvé qu'iScroll était la solution parfaite, neutre du point de vue du design, pour cette situation : iscrolljs.com

289voto

lostsource Points 6182

Cette fonction devrait vous donner la largeur de la barre de défilement.

function getScrollbarWidth() {

  // Creating invisible container
  const outer = document.createElement('div');
  outer.style.visibility = 'hidden';
  outer.style.overflow = 'scroll'; // forcing scrollbar to appear
  outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps
  document.body.appendChild(outer);

  // Creating inner element and placing it in the container
  const inner = document.createElement('div');
  outer.appendChild(inner);

  // Calculating difference between container's full width and the child width
  const scrollbarWidth = (outer.offsetWidth - inner.offsetWidth);

  // Removing temporary elements from the DOM
  outer.parentNode.removeChild(outer);

  return scrollbarWidth;

}

Les étapes de base sont ici :

  1. Créez un div caché (extérieur) et obtenez sa largeur décalée.
  2. Obliger les barres de défilement à apparaître dans le div (extérieur) à l'aide de la propriété CSS overflow
  3. Créez un nouveau div (inner) et ajoutez-le à outer, définissez sa largeur à '100%' et obtenez la largeur du décalage.
  4. Calculer la largeur de la barre de défilement en fonction des décalages rassemblés

Exemple de travail ici : http://jsfiddle.net/slavafomin/tsrmgcu9/

Mise à jour

Si vous l'utilisez sur une application Windows (métro), assurez-vous de définir l'option -ms-overflow-style de la div "externe" à scrollbar sinon la largeur ne sera pas correctement détectée. (code mis à jour)

Mise à jour n°2 Cela ne fonctionnera pas sur Mac OS avec le paramètre par défaut "Only show scrollbars when scrolling" (Yosemite et plus).

0 votes

C'est une solution tellement géniale. Merci.

0 votes

Joli. Vous pouvez l'améliorer encore en utilisant une fermeture attachée à la fonction pour mettre la valeur en cache et la renvoyer, de sorte que la fonction n'ait à créer/détruire les divs et à calculer la valeur qu'une seule fois.

0 votes

Malheureusement, cela n'a pas fonctionné pour moi dans IE7 (que je dois prendre en charge).

53voto

Vasyl Gutnyk Points 2481

// largeur de décalage comprend la largeur de la barre de défilement et largeur du client ne le fait pas. En règle générale, elle est égale à 14-18px. donc :

 var scrollBarWidth = element.offsetWidth - element.clientWidth;

24voto

Je pense que ce sera simple et rapide -

var scrollWidth= window.innerWidth-$(document).width()

15voto

pimvdb Points 66332

Si l'enfant occupe toute la largeur du conteneur sans la barre de défilement (par défaut), vous pouvez alors soustraire les largeurs :

var child = document.querySelector(".somethingBig");
var scrollbarWidth = child.parentNode.offsetWidth - child.offsetWidth;

0 votes

L'enfant ne prend pas toute la largeur du conteneur.

0 votes

J'aurais dû montrer un autre HTML. Le div.somethingBig est en fait une table, pas un div, et il sera étroit et haut. C'est ma faute.

0 votes

Brillant ! Merci !

8voto

Alvego Points 71

Si vous utilisez Jquery. ui essayez ce code :

$.position.scrollbarWidth()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X