페이지에 세로 스크롤바가 있는지 감지 하시겠습니까?


121

현재 페이지 / 창 (특정 요소가 아님)에 세로 스크롤 막대가 있는지 확인하는 간단한 JQ / JS가 필요합니다.

인터넷 검색은이 기본 기능에 대해 지나치게 복잡해 보이는 것을 제공합니다.

어떻게 할 수 있습니까?

답변:


97
$(document).ready(function() {
    // Check if body height is higher than window height :)
    if ($("body").height() > $(window).height()) {
        alert("Vertical Scrollbar! D:");
    }

    // Check if body width is higher than window width :)
    if ($("body").width() > $(window).width()) {
        alert("Horizontal Scrollbar! D:<");
    }
});

14
+1하지만 정확성을 위해 콘텐츠가 뷰포트보다 더 확장되는지 여부 만 확인합니다. 의 overflow속성이 선을 따라 어딘가 body로 설정되어 있으면 hidden작동하지 않습니다. 그러나 신체에 숨겨진 설정은 극히 드뭅니다.
Pekka

4
본문 높이가 창 높이와 일치하면 작동하지 않습니다. 문서 높이가 뷰포트와 정확히 일치하면 가로 스크롤바가 추가됩니다 . 그것은 vert를 강제 할 것입니다. 스크롤바이지만 문서 / 본문 / 창 높이는 동일합니다. "수직 스크롤바"가있는 경우에도 경고하지 않습니다.
비방 모니카 첼리 오 중지

2
내가 $(document)대신 사용해야 $("body")한다고 말하고 싶었을 뿐인데, 이것은 신체가 그렇지 않은 경우에 효과적이었습니다. (폭 / 높이에 종횡비가있는 절대 위치 컨테이너가 있습니다)
am_

1
Chrome 브라우저에 보고서 페이지가 있는데 처음에는 스크롤 막대를 표시하고 프로그래밍하지 않았기 때문에 브라우저 동작처럼 보이는 밀리 초 만에 사라집니다. 그래서이 함수는 제 경우 항상 참을 반환합니다.
Dush

@TiuTalk for me $ ( "body"). height () & $ (window) .height ()는 동일한 값을 제공하지만 대신 $ (document) .height ()> $ (window) .height () 사용합니다. 나를.
사랑 K

77

이 시도:

var hasVScroll = document.body.scrollHeight > document.body.clientHeight;

그러나 이것은 수직 scrollHeight가 볼 수있는 콘텐츠의 높이보다 큰 경우에만 알려줍니다. hasVScroll변수에는 true 또는 false가 포함됩니다.

보다 철저한 확인이 필요한 경우 위 코드에 다음을 추가하십시오.

// Get the computed style of the body element
var cStyle = document.body.currentStyle||window.getComputedStyle(document.body, "");

// Check the overflow and overflowY properties for "auto" and "visible" values
hasVScroll = cStyle.overflow == "visible" 
             || cStyle.overflowY == "visible"
             || (hasVScroll && cStyle.overflow == "auto")
             || (hasVScroll && cStyle.overflowY == "auto");

1
+1 좋아요! 그리고 필요한 계산 된 스타일 (내가이 질문에 관여하지 않기로 결정한 시점이었습니다.)
Pekka

lol yeah 많은 경우에 필요하지 않기 때문에 쓰기 위해 추가 노력을 기울 일지 여부에 대해 토론했습니다.
Andy E

1
이로 인해 scrollHeight가 clientHeight보다 큰지 여부에 관계없이 overflowY가 '표시'될 때마다 hasVScroll이 true가됩니다. 어쩌면 당신은 의미 cStyle.overflow === 'scroll'합니까?
BT

5
위의 코드는 작동하지 않습니다. 브라우저 : 크롬 56 URL : news.greylock.com/...
세바스티앙 Lorber

1
@BT cStyle.overflow == "visible" 는 요소가 document.body. 그러나 (hasVScroll && cStyle.overflow == "visible"&& element.nodeName == "BODY")이어야합니다. 또한 cStyle.overflow === 'scroll'지적한대로 확인해야합니다 .
mseifert

44

나는 이전 답변을 시도했지만 $ ( "body"). height ()가 반드시 전체 html 높이를 나타내는 것은 아닙니다.

다음과 같이 솔루션을 수정했습니다.

// Check if body height is higher than window height :) 
if ($(document).height() > $(window).height()) { 
    alert("Vertical Scrollbar! D:"); 
} 

// Check if body width is higher than window width :) 
if ($(document).width() > $(window).width()) { 
    alert("Horizontal Scrollbar! D:<"); 
} 

18

이 질문을 죽음에서 되돌려 보겠습니다.;) Google이 간단한 해결책을 제공하지 않는 데에는 이유가 있습니다. 특수한 경우와 브라우저의 단점이 계산에 영향을 미치며 보이는 것만 큼 사소하지 않습니다.

불행히도 지금까지 여기에 설명 된 솔루션에 문제가 있습니다. 나는 그것들을 전혀 폄하하려는 것이 아닙니다. 그들은 훌륭한 출발점이며보다 강력한 접근 방식에 필요한 모든 주요 속성을 다루고 있습니다. 그러나 다른 답변에서 코드를 복사하여 붙여 넣는 것은 권장하지 않습니다.

  • 신뢰할 수있는 크로스 브라우저 방식으로 배치 된 콘텐츠의 효과를 포착하지 못합니다. 본문 크기를 기반으로 한 답변은이를 완전히 놓칩니다 (본문은 자체 위치가 지정되지 않는 한 이러한 콘텐츠의 오프셋 부모가 아닙니다). 그리고 그 대답은 확인 $( document ).width()하고 .height()희생양 문서 크기의 jQuery의 버그가 감지 .
  • window.innerWidth브라우저에서 지원하는 경우을 사용하면 코드가 모바일 브라우저에서 스크롤 막대를 감지하지 못합니다. 여기서 스크롤 막대의 너비는 일반적으로 0입니다. 일시적으로 오버레이로 표시되며 문서에서 공간을 차지하지 않습니다. . 모바일에서 확대하는 것도 문제가됩니다 (긴 이야기).
  • 사람들이 htmlbody요소 의 오버플 로를 기본값이 아닌 값 으로 명시 적으로 설정하면 탐지가 중단 될 수 있습니다 (그러면 발생하는 일이 약간 관련됩니다- 이 설명 참조 ).
  • 대부분의 답변에서 본문 패딩, 테두리 또는 여백이 감지되지 않고 결과가 왜곡됩니다.

나는 "그냥 효과가있는"(기침) 해결책을 찾는 데 내가 생각했던 것보다 더 많은 시간을 보냈다. 내가 생각 해낸 알고리즘은 이제 메소드 를 노출 하는 .hasScrollbarjQuery.isInView 플러그인의 일부입니다 . 원하는 경우 소스를 살펴보십시오 .

페이지를 완전히 제어하고 알려지지 않은 CSS를 다룰 필요가없는 시나리오에서는 플러그인을 사용하는 것이 과도 할 수 있습니다. 결국 어떤 경우가 적용되는지, 그렇지 않은지 알 수 있습니다. 그러나 알려지지 않은 환경에서 신뢰할 수있는 결과가 필요한 경우 여기에 설명 된 솔루션으로는 충분하지 않을 것입니다. 잘 테스트 된 플러그인을 사용하는 것이 좋습니다.


감사. 꽤 복잡합니다! 이전 버전과의 호환성을 원하지 않거나 필요하지 않은 경우 html5 브라우저를위한 더 쉬운 솔루션이 있습니까? 내 말은 브라우저 코더 / w3c가 스크롤바가 있는지 여부를 알려주기에 충분했음을 의미합니까? ;-)
레오

1
@Leo 내가 아는 것은 아닙니다. 음, 하나의 속성을 가진 window.scrollbars객체 가 있습니다 visible. 유망하게 들리지만 그렇지 않습니다. IE11을 포함한 IE에서는 지원되지 않습니다. 그리고 그것은 단지이 있음을 알려줍니다 하지만 한 - 스크롤 바. 여기 에서 테스트 페이지를 참조하십시오 .
hashchange apr

감사합니다 @hashchange. 스크롤바가 있는지 알려주는 것은 어리석은 것처럼 들리므로 아직 일종의 테스트라고 생각합니다. 그래도 약간 유망합니다. ;-)
Leo

1
@BT 좋습니다. 이제 토끼 구멍의 입구로 안내하겠습니다.;) 여기 에 내용이 창을 채우기에 충분하지 않은 데모 가 있습니다. 감지는 FF에서 작동하지만 Chrome에서는 실패합니다. 여기 에 배치 된 요소가 페이지 아래에 배치되는 또 다른 데모 가 있습니다. 감지는 Chrome에서 작동하지만 FF에서는 실패합니다.
hashchange

1
@BT 그리고 오버플로 설정으로 플레이를 시작하면 동작이 약간 이상 하기 때문에 여러 가지 이상한 실패 모드에 들어갈 수 있다고 생각합니다 .
hashchange

15

이것은 나를 위해 작동했습니다.

function hasVerticalScroll(node){
    if(node == undefined){
        if(window.innerHeight){
            return document.body.offsetHeight> window.innerHeight;
        }
        else {
            return  document.documentElement.scrollHeight > 
                document.documentElement.offsetHeight ||
                document.body.scrollHeight>document.body.offsetHeight;
        }
    }
    else {
        return node.scrollHeight> node.offsetHeight;
    }
}

본문에는 hasVerticalScroll().


이것은 내 크롬에서 작동이 글의 유일한 해답이다
Nertan 루시

clientHeightoffsetHeight여기 가 바람직 합니다. 그렇지 않으면 두꺼운 테두리를 가질 수 있으며 스크롤바가 없을 때 반환됩니다.
theicfire 19


3

이상하게도 이러한 솔루션 중 어느 것도 페이지에 세로 스크롤 막대가 있는지 알려주지 않습니다.

window.innerWidth - document.body.clientWidth스크롤바의 너비를 알려줍니다. 이것은 IE9 +에서 작동합니다 (더 적은 브라우저에서는 테스트되지 않음). (또는 질문에 엄격하게 대답하려면!!(window.innerWidth - document.body.clientWidth)

왜? 콘텐츠가 창 높이보다 크고 사용자가 위 / 아래로 스크롤 할 수있는 페이지가 있다고 가정 해 보겠습니다. 마우스가 연결되지 않은 Mac에서 Chrome을 사용하는 경우 사용자에게 스크롤바가 표시되지 않습니다. 마우스를 연결하면 스크롤바가 나타납니다. (이 동작은 재정의 될 수 있지만 기본 AFAIK입니다).


Chrome-Mouse 동작에 대한 설명은 일관성없는 동작이라고 생각하는 것을 파악하는 데 도움이되었습니다. 감사!
theisof

2

바닐라 솔루션을 찾았습니다

var hasScrollbar = function() {
  // The Modern solution
  if (typeof window.innerWidth === 'number')
    return window.innerWidth > document.documentElement.clientWidth

  // rootElem for quirksmode
  var rootElem = document.documentElement || document.body

  // Check overflow style property on body for fauxscrollbars
  var overflowStyle

  if (typeof rootElem.currentStyle !== 'undefined')
    overflowStyle = rootElem.currentStyle.overflow

  overflowStyle = overflowStyle || window.getComputedStyle(rootElem, '').overflow

    // Also need to check the Y axis overflow
  var overflowYStyle

  if (typeof rootElem.currentStyle !== 'undefined')
    overflowYStyle = rootElem.currentStyle.overflowY

  overflowYStyle = overflowYStyle || window.getComputedStyle(rootElem, '').overflowY

  var contentOverflows = rootElem.scrollHeight > rootElem.clientHeight
  var overflowShown    = /^(visible|auto)$/.test(overflowStyle) || /^(visible|auto)$/.test(overflowYStyle)
  var alwaysShowScroll = overflowStyle === 'scroll' || overflowYStyle === 'scroll'

  return (contentOverflows && overflowShown) || (alwaysShowScroll)
}


1
IE 11에서 작동하지 않습니다. window.innerWidth 및 document.documentElement.clientWidth는 항상 동일합니다.
NLV

고쳤다. 이 기능은 IE 11에서도 작동합니다. 문제는 있었다이 - stackoverflow.com/questions/17045132/...
NLV

나는 이것을 Chrome 65에서 테스트했으며 작동합니다. 그러나 가로 스크롤바에 맞게 조정하면 결과가 이상합니다. 가로 및 세로 스크롤바가 모두 표시되면 window.innerWidth > document.documentElement.clientWidth참이지만 window.innerHeight > document.documentElement.clientHeight그렇지 않습니다. 이 경우에는 그 반대 인 것처럼 보입니다. 저는 JS 개발자가 아니며 Selenium 테스트에만 필요합니다. 힌트를 주셔서 감사합니다.
kriegaex

2
    <script>
    var scrollHeight = document.body.scrollHeight;
    var clientHeight = document.documentElement.clientHeight;
    var hasVerticalScrollbar = scrollHeight > clientHeight;

    alert(scrollHeight + " and " + clientHeight); //for checking / debugging.
    alert("hasVerticalScrollbar is " + hasVerticalScrollbar + "."); //for checking / debugging.
    </script>

이것은 스크롤바가 있는지 여부를 알려줍니다. JavaScript 경고로 표시되는 디버깅에 도움이 될 수있는 몇 가지 정보를 포함했습니다.

닫는 body 태그 뒤에 스크립트 태그에 넣으십시오.


1

Kees C. Bakker의 답변 업데이트 버전을 작성했습니다.

const hasVerticalScroll = (node) => {
  if (!node) {
    if (window.innerHeight) {
      return document.body.offsetHeight > window.innerHeight
    }
    return (document.documentElement.scrollHeight > document.documentElement.offsetHeight)
      || (document.body.scrollHeight > document.body.offsetHeight)
  }
  return node.scrollHeight > node.offsetHeight
}

if (hasVerticalScroll(document.querySelector('body'))) {
  this.props.handleDisableDownScrollerButton()
}

이 함수는 페이지에 세로 스크롤 막대가 있는지 여부에 따라 true 또는 false를 반환합니다.

예를 들면 :

const hasVScroll = hasVerticalScroll(document.querySelector('body'))

if (hasVScroll) {
  console.log('HAS SCROLL', hasVScroll)
}

1

나는 사용한다

public windowHasScroll()
{
    return document.body.clientHeight > document.documentElement.clientHeight;
}

1

문서 루트 요소 (예 : html 요소)의 너비를 창의 내부 부분과 비교하기 만하면됩니다.

if ((window.innerWidth - document.documentElement.clientWidth) >0) console.log('V-scrollbar active')

스크롤바 너비도 알아야하는 경우 :

vScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;

0

다른 솔루션이 내 프로젝트 중 하나에서 작동하지 않았고 결국 오버플로 CSS 속성을 확인했습니다.

function haveScrollbar() {
    var style = window.getComputedStyle(document.body);
    return style["overflow-y"] != "hidden";
}

그러나 소품을 변경하여 스크롤바가 사라지는 경우에만 작동합니다. 내용이 창보다 작거나 같으면 작동하지 않습니다.

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