185 votes

Comment puis-je obtenir les tailles des barres 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 ?

2 votes

Voici un extrait de l'auteur du plugin JQuery Dimension. github.com/brandonaaron/jquery-getscrollbarwidth/blob/master/ Il est peut-être tard pour donner cette solution, mais elle me semble meilleure, IMO.

0 votes

0 votes

@GibboK -- cette solution échoue -- le offsetWidth == clientWidth donc c'est toujours zéro. Ceci est testé en bordure d'IE && Chrome.

148voto

Matthew Vines Points 14425

Desde Blog d'Alexandre Gomes Je ne l'ai pas essayé. Faites-moi savoir si cela fonctionne 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);
};

2 votes

L'idée est géniale, je vais certainement faire une classe MooTools basée sur cela.

0 votes

Oui, j'ai eu le même résultat sur Google. :) J'essaie de vous tenir au courant.

0 votes

Si vous changez votre thème pour un autre avec des barres de défilement de taille différente, quel est l'écart entre le calcul et la réalité ?

85voto

Josh Bambrick Points 513

En utilisant 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;
};

2 votes

Merci, cette solution est très propre !

4 votes

Cette solution serait-elle vraiment plus propre si l'ensemble du code source de JQuery était copié-collé avant elle ? Parce que c'est à peu près ce que fait cette solution. Cette question ne demandait pas une réponse en JQuery, et il est parfaitement possible et efficace d'effectuer cette tâche sans l'utilisation d'une bibliothèque.

7 votes

Si vous utilisez déjà JQuery, le commentaire de Daemon n'est pas pertinent. Oui, il serait absurde d'ajouter JQuery juste pour faire cela, mais pour ceux qui utilisent déjà JQuery dans leur projet, c'est une solution beaucoup plus "simple" que celle qui a été acceptée.

25voto

Jan Šafránek Points 486

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 réduite :

$.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 ... donc

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

Testé le 2012-03-28 sur Windows 7 avec les dernières versions de FF, Chrome, IE et Safari et 100% de fonctionnement.

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

0 votes

Renvoie des valeurs différentes en fonction du zoom de la page. Win7, Opera, FF.

13 votes

La largeur sera TOUJOURS === indéfinie dans ce code. autant faire if (true) { ... }

3 votes

Correction : width sera toujours \=== indéfini le premièrement chaque fois que la fonction est appelée. Lors des appels ultérieurs de la fonction width est déjà défini, cette vérification permet simplement d'éviter que les calculs soient à nouveau effectués inutilement.

25voto

Beep.exe Points 341

Si vous cherchez une opération simple, mélangez simplement dom js et jquery,

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

renvoie la taille de la barre de défilement de la page actuelle. (si elle est visible, sinon elle retournera 0)

11 votes

Cela échouera dans le cas où la fenêtre n'a pas de barres de défilement (grand écran, ou petite page/application).

1 votes

C'est tout à fait ce que j'attendais

1 votes

Pour ceux d'entre nous qui n'utilisent pas jQuery, que signifie $(element).width() faire ? Comment peut-on écrire cela sans jQuery ?

17voto

Josh Stodola Points 42410
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; 
}

0 votes

J'ai d'abord essayé le réponse acceptée mais j'ai constaté que cela ne fonctionnait plus dans Firefox sous Windows 8. J'ai opté pour cette variante qui fait parfaitement l'affaire.

1 votes

Le code est plus court, mais le navigateur doit redessiner la page entière, ce qui est très lent.

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