JavaScript는 스크롤의 창 X / Y 위치를 얻습니다.


214

현재 볼 수있는 창의 위치를 ​​가져 오는 방법을 찾고 싶습니다 (총 페이지 너비 / 높이 기준).이를 사용하여 한 섹션에서 다른 섹션으로 스크롤을 강제 할 수 있습니다. 그러나 어떤 객체가 브라우저의 실제 X / Y를 보유하는지 추측 할 때 엄청난 옵션이있는 것 같습니다.

이 중 IE 6+, FF 2+ 및 Chrome / Safari가 작동하도록하려면 무엇이 필요합니까?

window.innerWidth
window.innerHeight
window.pageXOffset
window.pageYOffset
document.documentElement.clientWidth
document.documentElement.clientHeight
document.documentElement.scrollLeft
document.documentElement.scrollTop
document.body.clientWidth
document.body.clientHeight
document.body.scrollLeft
document.body.scrollTop

그리고 다른 사람이 있습니까? 창이 어디에 있는지 알면 window.scrollBy(x,y);원하는 지점에 도달 할 때까지 천천히 호출되는 이벤트 체인을 설정할 수 있습니다 .

답변:


282

jQuery (v1.10)가이를 찾는 방법은 다음과 같습니다.

var doc = document.documentElement;
var left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
var top = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

그건:

  • window.pageXOffset먼저 테스트 하고 존재하는 경우 사용합니다.
  • 그렇지 않으면을 사용합니다 document.documentElement.scrollLeft.
  • 그런 다음 document.documentElement.clientLeft존재하면 뺍니다 .

document.documentElement.clientLeft/를 빼면 Top테두리 (패딩 또는 여백이 아니라 실제 테두리)를 루트 요소에 적용한 상황에서 특정 브라우저에서만 적용 할 수 있습니다.


토마스-당신 말이 맞아요. 내 잘못이야. 댓글이 삭제되었습니다. 귀하의 의견을 다시 읽고 귀하의 솔루션이 Jquery 솔루션이 아니라는 것을 깨달았습니다. 사과. 수정했습니다.
Bangkokian

지금 작동합니다. 웹킷에 매우 일시적인 버그가 있었고 이미 수정했습니다. 나는 그 버그 때문에 완전히 고장난 플러그인을 작성했으며 사용자는 이것에 대해 나에게보고했다. 매우 무서운 그런 기본적인 것들이 깨질 수 있습니다
vsync

2
이것은 $ (window) .scrollTop ()의 코드입니까? ? 이 답변에 jQuery 메소드를 포함시키는 것이 유용 할 것입니다.
Phil

1
내가 게시 한 코드는 무엇이 바뀌 었는지에 대한 역설이다 jQuery.fn.offset(). scrollTop()/ scrollLeft()기본적으로 동일하지만 clientTop / clientLeft를 빼지 마십시오.
thomasrutter

방법은 무엇입니까?
Maxrunner

208

아마도 더 간단 할 것입니다.

var top  = window.pageYOffset || document.documentElement.scrollTop,
    left = window.pageXOffset || document.documentElement.scrollLeft;

크레딧 : so.dom.js # L492


1
완벽한 브라우저 안전 크로스! 최고의 솔루션.
Simon Steinberger

1
응답 코드보다 효과가 좋았지 만, 응답 코드는 효과가 없었습니다.
Hydroper

2
document.documentElement.scrollTop어디서나 작동 하는지 궁금 합니다.
vsync

33

순수한 자바 스크립트를 사용하면 Window.scrollXWindow.scrollY를 사용할 수 있습니다

window.addEventListener("scroll", function(event) {
    var top = this.scrollY,
        left =this.scrollX;
}, false);

노트

pageXOffset 속성은 scrollX 속성의 별칭이며 pageYOffset 속성은 scrollY 속성의 별칭입니다.

window.pageXOffset == window.scrollX; // always true
window.pageYOffset == window.scrollY; // always true

여기에 간단한 데모가 있습니다

window.addEventListener("scroll", function(event) {
  
    var top = this.scrollY,
        left = this.scrollX;
  
    var horizontalScroll = document.querySelector(".horizontalScroll"),
        verticalScroll = document.querySelector(".verticalScroll");
    
    horizontalScroll.innerHTML = "Scroll X: " + left + "px";
      verticalScroll.innerHTML = "Scroll Y: " + top + "px";
  
}, false);
*{box-sizing: border-box}
:root{height: 200vh;width: 200vw}
.wrapper{
    position: fixed;
    top:20px;
    left:0px;
    width:320px;
    background: black;
    color: green;
    height: 64px;
}
.wrapper div{
    display: inline;
    width: 50%;
    float: left;
    text-align: center;
    line-height: 64px
}
.horizontalScroll{color: orange}
<div class=wrapper>
    <div class=horizontalScroll>Scroll (x,y) to </div>
    <div class=verticalScroll>see me in action</div>
</div>


6
연결 한 페이지에 "브라우저 간 호환성을 위해 window.scrollY 대신 window.pageYOffset을 사용하십시오."라는 메시지가 표시됩니다.
JeremyWeir 2016 년

IE에서는 작동하지 않습니다. IE는 다음과 같은 것을 요구합니다window.pageYOffset
hipkiss

-1
function FastScrollUp()
{
     window.scroll(0,0)
};

function FastScrollDown()
{
     $i = document.documentElement.scrollHeight ; 
     window.scroll(0,$i)
};
 var step = 20;
 var h,t;
 var y = 0;
function SmoothScrollUp()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, -step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollUp()},20);

};


function SmoothScrollDown()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollDown()},20);

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