브라우저의 스크롤바 크기를 어떻게 알 수 있습니까?


164

JavaScript에서 가로 스크롤 막대의 높이 또는 세로 스크롤 막대의 너비를 어떻게 확인할 수 있습니까?


2
다음은 JQuery Dimension 플러그인 작성자의 스 니펫입니다. github.com/brandonaaron/jquery-getscrollbarwidth/blob/master/… 이 솔루션을 제공하는 데 늦었을 수도 있지만, IMO에게는 나에게 더 좋은 방법 인 것 같습니다.
Yanick Rochon

이 솔루션을 살펴보십시오 : davidwalsh.name/detect-scrollbar-width
GibboK

@GibboK-그 해결책이 실패합니다-offsetWidth == clientWidth이므로 항상 0입니다. 이것은 Edge IE && Chrome에서 테스트되었습니다.
beauXjames

1
@beauXjames 이상한 그것은 FF에 나를 위해 작동
GibboK

이 질문은 스크롤바가 잘못된 위치 (화면 중앙 어딘가)에있는 상황에서 발생합니다. 이 상황에서는 스크롤 막대를 표시하고 싶지 않을 것입니다. 대부분의 경우 iScroll은 상황에 맞는 완벽한 디자인 중립 솔루션 인 것으로 나타났습니다. iscrolljs.com
JoostS

답변:


139

에서 알렉상드르 고메즈 블로그 나는 그것을 시도하지 않았습니다. 그것이 당신을 위해 작동하는지 알려주세요.

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
아이디어는 천재입니다. 저는 이것을 기반으로 MooTools 클래스를 만들고 있습니다.
Ryan Florence

그래, 같은 구글 결과를 얻었다. :) 노력하고 당신에게 정보를 유지합니다.
glmxndr 2016 년

테마를 다른 크기의 스크롤 막대가있는 테마로 변경하면 실제 차이는 어떻게 계산됩니까?
Matthew Vines

1
상호 참조 여기를 참조하십시오 stackoverflow.com/questions/3417139/...
Yanick Rochon

6
다른 페이지 확대 / 축소로 다른 값을 반환합니다. Win7, Opera, FF.
Kolyunya

79

jQuery를 사용하면 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
감사합니다.이 솔루션은 매우 깨끗합니다 !!
jherax

4
JQuery의 전체 소스 코드를 복사하여 붙여 넣은 경우이 솔루션이 실제로 더 깨끗하다고 ​​느끼겠습니까? 이 솔루션이 수행하는 작업과 거의 비슷합니다. 이 질문은 JQuery에서 답변을 요구하지 않았으므로 라이브러리를 사용하지 않고이 작업을 수행하는 것이 완벽하고 가능합니다.
DaemonOfTheWest 2012 년

5
이미 JQuery를 사용하고 있다면 데몬의 설명은 관련이 없습니다. 그렇습니다 .JQuery를 추가하기 위해 이것을 추가하는 것은 말도 안되지만 프로젝트에서 이미 JQuery를 사용하는 사람들에게는 이것이 허용되는 것보다 훨씬 더 간단한 솔루션입니다.
Tyler Dahle

25

이것은 내가 찾은 스크립트이며, 웹킷 브라우저에서 작동합니다 ... :)

$.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;
};

최소화 된 버전 :

$.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};

문서가 준비되면 전화해야합니다 ... 그래서

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

최신 FF, Chrome, IE 및 Safari 및 Windows 100에서 100 % 작동하는 Windows 7에서 2012-03-28에서 테스트되었습니다.

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


13
너비는 해당 코드에서 항상 === 정의되지 않습니다. if (true) {...}
sstur

3
수정 : 함수가 처음 호출 width될 때 항상 === 정의되지 않습니다 . 함수에 대한 후속 호출 이 이미 설정되어 있으면 검사를 통해 계산이 불필요하게 다시 실행되지 않습니다. width
MartinAnsty

17
@MartinAnsty 그러나 [width] 변수는 함수 에서 선언 되므로 함수를 호출 할 때마다 다시 작성됩니다.
MadSkunk

4
@MartinAnsty, 소스 를 보면 외부 클로저에 선언됩니다.
TheCloudlessSky

3
다만, 위의 코드입니다 @sstur 및 @TheCloudlessSky에 의해 만들어진 점을 강화하기 위해 하지 , 벤 독일어의 플러그인에있는 것과 같은 그것은에 결과를 캐시하지 않습니다 width, 오히려 그것을 하나 하나 시간을 다시 계산합니다. 작동하지만 굉장히 비효율적입니다. Alman의 플러그인에서 세계를 선호하고 올바른 버전 을 대신 사용하십시오.
hashchange

24

간단한 작업을 찾고 있다면 일반 dom js와 jquery를 혼합하십시오.

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

현재 페이지 스크롤 막대의 크기를 반환합니다. (보이거나 그렇지 않으면 0을 반환합니다)


10
창에 스크롤바 (큰 모니터 또는 작은 페이지 / 앱)가없는 경우에는 실패합니다.
Farid Nouri Neshat

1
이것은 내가 원했던 것입니다
azerafati

16
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; 
} 

먼저 허용 된 답변을 시도했지만 Windows 8의 Firefox에서는 더 이상 작동하지 않는 것으로 나타났습니다.이 작업을 아름답게 수행하는이 변형으로 전환되었습니다.
Matijs

1
코드는 짧지 만 브라우저는 전체 페이지를 다시 그려야하므로 속도가 매우 느립니다.
Adrian Maire

11

나에게 가장 유용한 방법은

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

바닐라 JavaScript로.

여기에 이미지 설명을 입력하십시오


감사합니다 @ stephen-kendy. 인사.
Andrés Moreno

3
내가 필요한 것만 한 가지 제안 : 두 번째 용어는로 대체 할 수 있습니다 document.documentElement.clientWidth. 요소 documentElement를 얻는 의도를보다 명확하고 깨끗하게 표현합니다 <html>.
Jan Miksovsky

9

페이지 자체 대신 페이지 내부의 요소에 작동하는 간단한 솔루션을 찾았습니다. $('#element')[0].offsetHeight - $('#element')[0].clientHeight

x 축 스크롤 막대의 높이를 반환합니다.


대단해 !! 당신은 내 하루를 :) 그것은 y 축 스크롤 막대에 대한 ".offsetWidth"및 ".clientWidth"와 함께 작동합니다.
Polosson

1
불행히도 적어도 너비에 대해 완전히 신뢰할 수있는 것처럼 보이지는 않습니다. .clientWidth는 Linux에서 FireFox와 Chrome 모두에 스크롤 막대 너비의 절반을 포함하는 것으로 보입니다.
Michael Scheper

6

에서 데이비드 월시의 블로그 :

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

내 웹 사이트에서 17 개, 여기에서 14 개를 제공합니다.


4

이미 스크롤 막대가있는 요소가있는 경우 다음을 사용하십시오.

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

horzintscrollbar가 없으면 함수는 0을 다시 조정합니다.


이것이 가장 좋은 대답입니다. 키스 규칙 모두
MarcD

4

jquery + javascript를 사용하여 아래와 같이 window스크롤 막대를 결정할 수 있습니다 document.

var scrollbarWidth = ($(document).width() - window.innerWidth);
console.info("Window Scroll Bar Width=" + scrollbarWidth );

innerWidth는 IE9 + 용입니다. 그렇지 않으면 훌륭한 솔루션입니다.
Pål Thingbø

3

Antiscroll.js코드에서 방법 은 다음과 같습니다.

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

코드는 다음과 같습니다. https://github.com/LearnBoost/antiscroll/blob/master/antiscroll.js#L447


3
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
    };
},

Chrome, FF, IE8, IE11에서 테스트되었습니다.


2

이 트릭을해야합니까?

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

2

빈 페이지 div를 만들어서 모든 페이지에 존재하는지 확인하십시오 (예 : header템플릿 에 넣음 ).

이 스타일을 지정하십시오.

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

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

그런 다음 #scrollbar-helperJavascript로 크기를 확인하십시오 .

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

div항상 widthheight의를 가지므로 계산할 필요가 없습니다 scrollbar.

유일한 단점은 div템플릿에 빈 파일 이 있다는 것입니다 . 그러나 Javascript 파일은 한 줄 또는 두 줄의 코드 만 필요하므로 더 깨끗합니다.


1
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
function getScrollBarWidth() {
    return window.innerWidth - document.documentElement.clientWidth;
}

대부분의 브라우저는 스크롤 막대 너비로 15px를 사용합니다.


0

jquery 사용시 (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;
}

그러나 실제로 @Steve의 답변이 더 좋습니다.


0

이것은 좋은 대답입니다 : https : //.com/a/986977/5914609

그러나 제 경우에는 효과가 없었습니다. 그리고 솔루션을 검색하는 데 몇 시간을 보냈습니다.
마지막으로 위의 코드로 돌아가서 각 스타일에 중요를 추가했습니다. 그리고 효과가있었습니다.
원래 답변 아래에 의견을 추가 할 수 없습니다. 수정 사항은 다음과 같습니다.

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

이 구명 결정은 브라우저 scrollY 너비 (바닐라 JavaScript) 를 찾을 수있는 기회를 제공합니다 . 이 예제를 사용하면 현재 디자인 개념에 따라 스크롤 할 필요가없는 요소를 포함하여 모든 요소에서 scrollY 너비 얻을 수 있습니다.

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

오프셋 너비 차이를 기반으로보다 간결하고 읽기 쉬운 솔루션은 다음과 같습니다.

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;

}

JSFiddle을 참조하십시오 .


0

내 라이브러리에 이미 코딩되어 있으므로 다음과 같습니다.

var vScrollWidth = window.screen.width - window.document.documentElement.clientWidth;

$(window).width()대신 jQuery를 사용할 수도 있습니다 window.document.documentElement.clientWidth.

오른쪽에 firefox에서 개발자 도구를 열면 작동하지 않지만 devs 창이 열리면 극복합니다!

window.screenquirksmode.org 지원 됩니다 !

즐기세요!


0

작동하는 것 같지만 모든 브라우저에서 작동하는 더 간단한 솔루션이 있습니까?

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.