web-dev-qa-db-fra.com

Comment puis-je obtenir les tailles de barre de défilement du navigateur?

Comment puis-je déterminer la hauteur d'une barre de défilement horizontale ou la largeur d'une barre verticale en JavaScript?

150
glmxndr

De Alexandre Gomes Blog Je ne l'ai pas essayé. Dites-moi si cela marche pour vous.

function getScrollBarWidth () {
  var inner = document.createElement('p');
  inner.style.width = "100%";
  inner.style.height = "200px";

  var outer = document.createElement('div');
  outer.style.position = "absolute";
  outer.style.top = "0px";
  outer.style.left = "0px";
  outer.style.visibility = "hidden";
  outer.style.width = "200px";
  outer.style.height = "150px";
  outer.style.overflow = "hidden";
  outer.appendChild (inner);

  document.body.appendChild (outer);
  var w1 = inner.offsetWidth;
  outer.style.overflow = 'scroll';
  var w2 = inner.offsetWidth;
  if (w1 == w2) w2 = outer.clientWidth;

  document.body.removeChild (outer);

  return (w1 - w2);
};
129
Matthew Vines

Avec jQuery, vous pouvez raccourcir la réponse de Matthew Vines à:

function getScrollBarWidth () {
    var $outer = $('<div>').css({visibility: 'hidden', width: 100, overflow: 'scroll'}).appendTo('body'),
        widthWithScroll = $('<div>').css({width: '100%'}).appendTo($outer).outerWidth();
    $outer.remove();
    return 100 - widthWithScroll;
};
73
Joshua Bambrick

C'est le seul script que j'ai trouvé, qui fonctionne dans les navigateurs webkit ... :)

$.scrollbarWidth = function() {
  var parent, child, width;

  if(width===undefined) {
    parent = $('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');
    child=parent.children();
    width=child.innerWidth()-child.height(99).innerWidth();
    parent.remove();
  }

 return width;
};

Version minimisée:

$.scrollbarWidth=function(){var a,b,c;if(c===undefined){a=$('<div style="width:50px;height:50px;overflow:auto"><div/></div>').appendTo('body');b=a.children();c=b.innerWidth()-b.height(99).innerWidth();a.remove()}return c};

Et vous devez l'appeler quand le document est prêt ... alors

$(function(){ console.log($.scrollbarWidth()); });

Testé le 28/03/2012 sur Windows 7 dans les derniers fichiers FF, Chrome, IE et Safari et fonctionnant à 100%.

source: http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth

25
Jan Šafránek

si vous recherchez une opération simple, il vous suffit de mélanger Plain Dom JS et JQuery,

var swidth=(window.innerWidth-$(window).width());

renvoie la taille de la barre de défilement de la page en cours. (s'il est visible ou retournera 0)

22
Beep.exe
window.scrollBarWidth = function() {
  document.body.style.overflow = 'hidden'; 
  var width = document.body.clientWidth;
  document.body.style.overflow = 'scroll'; 
  width -= document.body.clientWidth; 
  if(!width) width = document.body.offsetWidth - document.body.clientWidth;
  document.body.style.overflow = ''; 
  return width; 
} 
15
Josh Stodola

J'ai trouvé une solution simple qui fonctionne pour les éléments de la page, à la place de la page elle-même: $('#element')[0].offsetHeight - $('#element')[0].clientHeight

Cela retourne la hauteur de la barre de défilement de l'axe des abscisses.

9
Memet Olsen

Pour moi, le moyen le plus utile était

(window.innerWidth - document.getElementsByTagName('html')[0].clientWidth)

avec JavaScript vanille.

 enter image description here

6
Andrés Moreno

De Le blog de David Walsh :

// Create the measurement node
var scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);

// Get the scrollbar width
var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.info(scrollbarWidth); // Mac:  15

// Delete the DIV 
document.body.removeChild(scrollDiv);
.scrollbar-measure {
	width: 100px;
	height: 100px;
	overflow: scroll;
	position: absolute;
	top: -9999px;
}

Me donne 17 sur mon site Web, 14 ici sur Stackoverflow.

5
mpen

Si vous avez déjà un élément avec des barres de défilement, utilisez:

function getScrollbarHeight(el) {
    return el.getBoundingClientRect().height - el.scrollHeight;
};

S'il n'y a pas d'horzintscrollbar présent, la fonction reprendra 0

4
mons droid

Vous pouvez déterminer la barre de défilement window avec document comme ci-dessous à l'aide de jquery + javascript:

var scrollbarWidth = ($(document).width() - window.innerWidth);
console.info("Window Scroll Bar Width=" + scrollbarWidth );
4
developerbhuwan
detectScrollbarWidthHeight: function() {
    var div = document.createElement("div");
    div.style.overflow = "scroll";
    div.style.visibility = "hidden";
    div.style.position = 'absolute';
    div.style.width = '100px';
    div.style.height = '100px';
    document.body.appendChild(div);

    return {
        width: div.offsetWidth - div.clientWidth,
        height: div.offsetHeight - div.clientHeight
    };
},

Testé dans Chrome, FF, IE8, IE11.

3
Ben

La manière dont Antiscroll.js le fait dans son code est la suivante:

function scrollbarSize () {
  var div = $(
      '<div class="antiscroll-inner" style="width:50px;height:50px;overflow-y:scroll;'
    + 'position:absolute;top:-200px;left:-200px;"><div style="height:100px;width:100%"/>'
    + '</div>'
  );

  $('body').append(div);
  var w1 = $(div).innerWidth();
  var w2 = $('div', div).innerWidth();
  $(div).remove();

  return w1 - w2;
};

Le code est à partir d'ici: https://github.com/LearnBoost/antiscroll/blob/master/antiscroll.js#L447

3
Hengjie
function getWindowScrollBarHeight() {
    let bodyStyle = window.getComputedStyle(document.body);
    let fullHeight = document.body.scrollHeight;
    let contentsHeight = document.body.getBoundingClientRect().height;
    let marginTop = parseInt(bodyStyle.getPropertyValue('margin-top'), 10);
    let marginBottom = parseInt(bodyStyle.getPropertyValue('margin-bottom'), 10);
    return fullHeight - contentHeight - marginTop - marginBottom;
  }
1
allenhwkim

Créez une div vide et assurez-vous qu’elle est présente sur toutes les pages (c’est-à-dire en la plaçant dans le modèle header).

Donnez-lui ce style:

#scrollbar-helper {
    // Hide it beyond the borders of the browser
    position: absolute;
    top: -100%;

    // Make sure the scrollbar is always visible
    overflow: scroll;
}

Ensuite, vérifiez simplement la taille de #scrollbar-helper avec Javascript:

var scrollbarWidth = document.getElementById('scrollbar-helper').offsetWidth;
var scrollbarHeight = document.getElementById('scrollbar-helper').offsetHeight;

Nul besoin de calculer quoi que ce soit, car cette div aura toujours la width et la height de la scrollbar.

Le seul inconvénient est qu'il y aura une div vide dans vos modèles. Mais d'un autre côté, vos fichiers Javascript seront plus propres, car cela ne prend que 1 ou 2 lignes de code.

1
Peter Prakker

Voici la solution la plus concise et facile à lire basée sur la différence de largeur de décalage:

function getScrollbarWidth(): number {

  // 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;

}

Voir le JSFiddle .

0
Slava Fomin II

C'est une excellente réponse: https://stackoverflow.com/a/986977/5914609

Cependant dans mon cas cela n'a pas fonctionné. Et j'ai passé des heures à chercher la solution.
Enfin, je suis revenu au code ci-dessus et j'ai ajouté! Important pour chaque style. Et ça a fonctionné.
Je ne peux pas ajouter de commentaires en dessous de la réponse originale. Alors voici le correctif:

function getScrollBarWidth () {
  var inner = document.createElement('p');
  inner.style.width = "100% !important";
  inner.style.height = "200px !important";

  var outer = document.createElement('div');
  outer.style.position = "absolute !important";
  outer.style.top = "0px !important";
  outer.style.left = "0px !important";
  outer.style.visibility = "hidden !important";
  outer.style.width = "200px !important";
  outer.style.height = "150px !important";
  outer.style.overflow = "hidden !important";
  outer.appendChild (inner);

  document.body.appendChild (outer);
  var w1 = inner.offsetWidth;
  outer.style.overflow = 'scroll !important';
  var w2 = inner.offsetWidth;
  if (w1 == w2) w2 = outer.clientWidth;

  document.body.removeChild (outer);

  return (w1 - w2);
};
0
Max Vetriakov

Cette décision décisive vous donnera l’opportunité de trouver scroll scroll scroll width (JavaScript JavaScript). En utilisant cet exemple, vous pouvez obtenir scrollY width sur n’importe quel élément y compris les éléments qui ne devraient pas avoir à faire défiler en fonction de votre conception actuelle:

getComputedScrollYWidth     (el)  {

  let displayCSSValue  ; // CSS value
  let overflowYCSSValue; // CSS value

  // SAVE current original STYLES values
  {
    displayCSSValue   = el.style.display;
    overflowYCSSValue = el.style.overflowY;
  }

  // SET TEMPORALLY styles values
  {
    el.style.display   = 'block';
    el.style.overflowY = 'scroll';
  }

  // SAVE SCROLL WIDTH of the current browser.
  const scrollWidth = el.offsetWidth - el.clientWidth;

  // REPLACE temporally STYLES values by original
  {
    el.style.display   = displayCSSValue;
    el.style.overflowY = overflowYCSSValue;
  }

  return scrollWidth;
}
0

Avec jquery (seulement testé dans firefox): 

function getScrollBarHeight() {
    var jTest = $('<div style="display:none;width:50px;overflow: scroll"><div style="width:100px;"><br /><br /></div></div>');
    $('body').append(jTest);
    var h = jTest.innerHeight();
    jTest.css({
        overflow: 'auto',
        width: '200px'
    });
    var h2 = jTest.innerHeight();
    return h - h2;
}

function getScrollBarWidth() {
    var jTest = $('<div style="display:none;height:50px;overflow: scroll"><div style="height:100px;"></div></div>');
    $('body').append(jTest);
    var w = jTest.innerWidth();
    jTest.css({
        overflow: 'auto',
        height: '200px'
    });
    var w2 = jTest.innerWidth();
    return w - w2;
}

Mais j'aime mieux la réponse de @ Steve.

0
ling

Cela devrait faire l'affaire, non?

function getScrollbarWidth() {
  return (window.innerWidth - document.documentElement.clientWidth);
}
0
Alexander