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 :
- Créez un div caché (extérieur) et obtenez sa largeur décalée.
- Obliger les barres de défilement à apparaître dans le div (extérieur) à l'aide de la propriété CSS overflow
- Créez un nouveau div (inner) et ajoutez-le à outer, définissez sa largeur à '100%' et obtenez la largeur du décalage.
- 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).
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