Javascript로 스크롤 막대 위치를 얻는 방법은 무엇입니까?


191

JavaScript를 사용하여 브라우저의 스크롤 막대 위치를 감지하여 페이지에서 현재 뷰의 위치를 ​​결정하려고합니다. 내 생각에 트랙의 엄지 손가락이 어디에 있는지 감지 한 다음 엄지 손가락의 높이를 트랙의 총 높이에 대한 백분율로 감지해야합니다. 과도하게 복잡합니까, 아니면 JavaScript가 그보다 쉬운 솔루션을 제공합니까? 어떤 코드 아이디어가 있습니까?

답변:


210

및를 사용 element.scrollTop하여 element.scrollLeft스크롤 된 수직 및 수평 오프셋을 각각 얻을 수 있습니다 . 전체 페이지에 관심 elementdocument.body있다면 당신은 그것을 비교할 수 element.offsetHeightelement.offsetWidth(다시, element당신이 비율을 필요로하는 경우 몸이 될 수 있음).


2
어떤 브라우저를 사용하고 있습니까? 본문을 얻는 것은 다른 브라우저에서 다르게 수행됩니다 ( element그리고 document.body단지 예제 일뿐입니다). 자세한 내용은 howtocreate.co.uk/tutorials/javascript/browserwindow 를 참조하십시오.
Max Shawabkeh

8
Firefox 3.6에서 올바른 값을 제공 window.pageYOffset하지만 IE7에서 아무것도 작동하지 않습니다. 시도 window.pageYOffset, document.body.scrollTop, document.documentElement.scrollTop,element.scrollTop

1
scrollTop은 대괄호를 추가했을 때만 나를 위해 일했습니다 ... $ ( ". scrollBody"). scrollTop ()
maia

9
'window'요소를 다루는 경우 window.scrollTop 대신 Jan.scrollY를 사용할 수 있습니다
Janis Jansen

6
document.body대부분의 최신 브라우저에서는 스크롤 위치가 설정되어 있지 않습니다 document.documentElement. 일반적으로 현재 설정되어 있습니다. Chrome 전환에 대해서는 bugs.chromium.org/p/chromium/issues/detail?id=157855 를 참조하십시오 .
fzzfzzfzz

134

<div>Chrome 에서이 작업을 수행했습니다 .

element .scrollTop- 스크롤로 인해 맨 위에 숨겨진 픽셀입니다. 스크롤이 없으면 값은 0입니다.

element .scrollHeight- 전체 div의 픽셀입니다.

element .clientHeight- 브라우저에 표시되는 픽셀입니다.

var a = element.scrollTop;

위치가 될 것입니다.

var b = element.scrollHeight - element.clientHeight;

scrollTop최대 값이됩니다 .

var c = a / b;

[0에서 1까지] 스크롤의 백분율이 됩니다.


3
이것은 거의 맞습니다. var b의 경우 element.clientHeight가 아닌 window.innerHeight를 빼야합니다.
Kahless

51
document.getScroll = function() {
    if (window.pageYOffset != undefined) {
        return [pageXOffset, pageYOffset];
    } else {
        var sx, sy, d = document,
            r = d.documentElement,
            b = d.body;
        sx = r.scrollLeft || b.scrollLeft || 0;
        sy = r.scrollTop || b.scrollTop || 0;
        return [sx, sy];
    }
}

정수가 2 개인 배열을 반환합니다.-[scrollLeft, scrollTop]


4
이 함수를 예제와 함께 사용하는 방법을 보여주는 것이 좋을 것입니다.
user18490

1
이 lastscroll = getScroll ();을 사용할 수 있다고 생각합니다. window.scrollTo (lastscroll [0], lastscroll [1]);
Dinesh Rajan

잘 작동하지만 x와 y 키가있는 객체로의 반환을 변경했습니다.
xd6_

@ user18490 님의 댓글에 따라 수정되었습니다.
Davide Cannizzo

ReferenceError : 변수를 찾을 수 없습니다 : element
Jonny

33

그것은 다음과 같습니다 :)

window.addEventListener("scroll", function (event) {
    var scroll = this.scrollY;
    console.log(scroll)
});

11

2018 년 답변 :

이와 같은 작업을 수행하는 가장 좋은 방법은 Intersection Observer API 를 사용하는 것 입니다.

교차 관찰자 API는 대상 요소와 상위 요소 또는 최상위 문서의 뷰포트와의 교차로에서 변경 사항을 비동기 적으로 관찰하는 방법을 제공합니다.

역사적으로, 요소의 가시성 또는 서로에 대한 두 요소의 상대적인 가시성을 감지하는 것은 솔루션을 신뢰할 수없고 브라우저와 사용자가 액세스하는 사이트가 느려지는 경향이있는 어려운 작업이었습니다. 불행히도, 웹이 발전함에 따라 이러한 종류의 정보에 대한 필요성이 커졌습니다. 교차로 정보는 다음과 같은 여러 가지 이유로 필요합니다.

  • 페이지로 이미지 또는 기타 컨텐츠의 지연 로딩이 스크롤됩니다.
  • 스크롤 할 때 점점 더 많은 컨텐츠가로드되고 렌더링되는 "무한 스크롤"웹 사이트를 구현하므로 사용자가 페이지를 넘길 필요가 없습니다.
  • 광고 수익을 계산하기위한 광고 가시성보고.
  • 사용자가 결과를 볼지 여부에 따라 작업 또는 애니메이션 프로세스를 수행할지 여부를 결정합니다.

과거에 교차 감지를 구현하면 영향을받는 모든 요소에 필요한 정보를 빌드하기 위해 Element.getBoundingClientRect ()와 같은 메소드를 호출하는 이벤트 핸들러 및 루프가 포함되었습니다. 이 코드는 모두 메인 스레드에서 실행되므로이 ​​중 하나라도 성능 문제를 일으킬 수 있습니다. 이러한 테스트를 통해 사이트를로드하면 상황이 너무 나빠질 수 있습니다.

다음 코드 예제를 참조하십시오.

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');
observer.observe(target);

대부분의 최신 브라우저 는 IntersectionObserver를 지원 하지만 이전 버전과의 호환성을 위해 polyfill 을 사용해야합니다 .


8

전체 페이지를 관리하는 경우 이것을 사용할 수 있습니다 :

document.body.getBoundingClientRect().top


1
대신 document.body를 사용하십시오
danial dezfouli

3

jQuery를 사용하는 경우 완벽한 기능이 있습니다. .scrollTop ()

doc here-> http://api.jquery.com/scrollTop/

참고 :이 기능을 사용하여 위치를 검색하거나 위치를 설정할 수 있습니다.

참조 : http://api.jquery.com/?s=scroll


25
원시 JS에서 수행하는 것이 가능하고 편리 할 때 JS 라이브러리를 사용하여 JS에 대한 질문에 왜 대답해야합니까? 로드 시간을 추가하고 불필요한 스토리지를 위해 일부 스토리지를 사용하도록 요청하고 있습니다. 또한 언제부터 자바 스크립트가 JQuery를 의미 했습니까?
DaemonOfTheWest

4
개별적으로 묻는다면 jQuery를 좋아하지 않았고이 질문에 대답하지 않았지만 Vanilla JS에는 이미 다른 동료가 제공 한 답변이 있지만 누군가이 스레드에 맛있는 향신료를 추가하면 문제가됩니다. jQuery를 사용하고 있습니다)
Ravinder Payal

@ R01010010 지금은 JQuery가 쓸모없고 역효과를 낳기 때문에 JQuery의 모든 기능은 VanilaJS로 쉽게 구현할 수 있으며, JQuery의 내부 기능에 의존 할 수 있으며, VanillsaJS에서 사용할 수있는 새로운 기능을 사용하면 프로그래머로서 프로그래머로서 업데이트되지 않습니다. , 요즘 VanillaJS에는 fetch라는 새로운 API가 있는데, fetch라는 구식 XHR을 대체했습니다. JQuery를 사용하면 학습을 중단했기 때문입니다. 또한 VanillaJS 빠른 vanilla-js.com입니다
존 Balvin 아리아

@JohnBalvinArias는 페치에 대해 이야기합니다. ie11 또는 Edge에 어떤 일이 있습니까?
Ben

내가 틀렸다면 정정하되, fetch가 "modern"에서 제대로 작동하지 않습니다. 즉, 여전히 널리 사용됩니다. 만약 jquery를 사용하고 있다면, 다음으로
Ben

3

스크롤 위치를 얻는 다른 방법은 다음과 같습니다.

const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

0

다음 함수가 스크롤 좌표 값을 갖는 데 도움이 될 수 있다고 생각합니다.

const getScrollCoordinate = (el = window) => ({
  x: el.pageXOffset || el.scrollLeft,
  y: el.pageYOffset || el.scrollTop,
});

나는 이 대답 에서 약간의 변화 로이 아이디어를 얻었습니다 .

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