자바 스크립트를 사용하여 div의 상단에서 창 상단까지의 거리를 결정하십시오.


127

div의 맨 위와 현재 화면의 맨 위 사이의 거리를 어떻게 결정합니까? 문서의 상단이 아닌 현재 화면의 상단까지의 픽셀 거리를 원합니다. 내가 좋아하는 몇 가지 시도했습니다 .offset()과를 .offsetHeight,하지만 난 그냥 주위에 내 머리를 래핑 수 없습니다. 감사!



7
el.getBoundingClientRect().top+window.scrollY
caub

3
@caub Eh, 그냥 el.getBoundingClientRect().top. 스크롤 위치를 추가하면 문서 상단까지의 거리까지 추가됩니다. developer.mozilla.org/de/docs/Web/API/Element/…
lynx

맞아요, 그냥 풀고 싶어
caub

답변:


239

당신은 사용할 수 있습니다 .offset()얻을하여 비교 오프셋 document요소 다음 사용 scrollTop의 특성 window은 사용자가 스크롤 한 페이지 아래로 찾는 요소를 :

var scrollTop     = $(window).scrollTop(),
    elementOffset = $('#my-element').offset().top,
    distance      = (elementOffset - scrollTop);

distance변수는 이제 상단으로부터의 거리가 유지 #my-element소자와 상부 배.

데모는 다음과 같습니다. http://jsfiddle.net/Rxs2m/

음수 값은 요소가 상단 폴더 위에 있음을 의미합니다.


거리가 특정 숫자인지 어떻게 확인할 수 있습니까? 이 120 픽셀 떨어진 위에서 경우 내가 요소 끈적을 만들고 싶어
Thessa Verbruggen

@ThessaVerbruggen distance변수가 값인지 확인하기 위해 변수를 확인할 수 120있지만 정확한 숫자 대신 범위를 확인하는 것이 좋습니다. 예를 들어 마우스 휠로 스크롤하는 경우 120 개를 건너 뛰어도됩니다. 따라서 요소가 상단 폴더의 120px 내에있을 때 CSS 또는 무언가를 적용하려는 경우을 사용할 수 있습니다 if (distance < 120) { /* do something */}. 여기에 업데이트 된 데모입니다 jsfiddle.net/na5qL91o
재스퍼

이렇게하면 한 가지 문제가 있습니다. 스크롤 할 때 스티커 부분이 깜박입니다. 스크롤 할 때 다시 계산되기 때문에 추측합니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? 내 코드 : $ (window) .on ( 'scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ( '# secondary'). offset (). top, distance = (elementOffset -scrollTop); if (거리 <120) {$ ( '# secondary'). addClass ( 'sticky');} else {$ ( '# secondary'). removeClass ( 'sticky');}});
Thessa Verbruggen '11

60

바닐라:

window.addEventListener('scroll', function(ev) {

   var someDiv = document.getElementById('someDiv');
   var distanceToTop = someDiv.getBoundingClientRect().top;

   console.log(distanceToTop);
});

브라우저 콘솔을 열고 거리를 보려면 페이지를 스크롤하십시오.


14
사용자가 페이지를 스크롤하지 않은 경우에만 작동합니다. 그렇지 않으면 distanceToTop반환 된 값은 상대적입니다 (사용자가 스크롤 한 경우 음수 일 수도 있음). 이것을 고려하려면window.pageYOffset + someDiv.getBoundingClientRect().top
ty를

2
@ty OP는 문서 상단이 아닌 화면 상단까지의 거리를 찾고 있습니다.이 경우 음의 값이 유효합니다.
Drenai

16

이것은 순수하게 JavaScript 로 달성 할 수 있습니다 .

lynx 가 질문에 대한 답변을 작성하고 싶었습니다 .

그러나 어쨌든 사람들은 때때로 댓글을 읽는 것을 잊어 버리기 때문에 답을 쓸 것입니다.

따라서 화면 창의 상단에서 요소의 거리 (픽셀 단위)를 얻으려면 다음을 수행하십시오.

// Fetch the element
var el = document.getElementById("someElement");  

사용 getBoundingClientRect ()

// Use the 'top' property of 'getBoundingClientRect()' to get the distance from top
var distanceFromTop = el.getBoundingClientRect().top; 

그게 다야!

희망이 누군가에게 도움이되기를 바랍니다 :)


1
getBoundingClient ()가 작동하지 않고 대신 .getBoundingClientRect ()
Elnoor

@Elnoor 제안에 감사드립니다 :) 나는 적절하게 변경했습니다.
Furqan Rahamath

@MohammedFurqanRahamathM의 멋진 작품. 답변 주셔서 감사합니다 :) 그것은 매력처럼 작동합니다! :)
Merianos Nikos

1
@MerianosNikos 감사합니다. 나는 :) 도움이되었다 기뻐요
Furqan Rahamath

1
그러나 이것은 페이지 중간에 다시로드되지 않은 경우에만 작동합니다.
Sagive SEO

7

나는 이것을 사용했다 :

                              myElement = document.getElemenById("xyz");
Get_Offset_From_Start       ( myElement );  // returns positions from website's start position
Get_Offset_From_CurrentView ( myElement );  // returns positions from current scrolled view's TOP and LEFT

암호:

function Get_Offset_From_Start (object, offset) { 
    offset = offset || {x : 0, y : 0};
    offset.x += object.offsetLeft;       offset.y += object.offsetTop;
    if(object.offsetParent) {
        offset = Get_Offset_From_Start (object.offsetParent, offset);
    }
    return offset;
}

function Get_Offset_From_CurrentView (myElement) {
    if (!myElement) return;
    var offset = Get_Offset_From_Start (myElement);
    var scrolled = GetScrolled (myElement.parentNode);
    var posX = offset.x - scrolled.x;   var posY = offset.y - scrolled.y;
    return {lefttt: posX , toppp: posY };
}
//helper
function GetScrolled (object, scrolled) {
    scrolled = scrolled || {x : 0, y : 0};
    scrolled.x += object.scrollLeft;    scrolled.y += object.scrollTop;
    if (object.tagName.toLowerCase () != "html" && object.parentNode) { scrolled=GetScrolled (object.parentNode, scrolled); }
    return scrolled;
}

    /*
    // live monitoring
    window.addEventListener('scroll', function (evt) {
        var Positionsss =  Get_Offset_From_CurrentView(myElement);  
        console.log(Positionsss);
    });
    */

element.offsetTop가 존재 함을 표시하기 위해 +1. element.getBoundingClientRect (). top은 이상한 행동을합니다. 웹 페이지 상단에서 요소 상단까지의 거리를 얻으려고했습니다.
alexandre1985

0

이 기능을 사용하여 요소가 뷰 포트에 보이는지 감지했습니다.

암호:

const vh = Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0);
$(window).scroll(function(){
var scrollTop     = $(window).scrollTop(),
elementOffset = $('.for-scroll').offset().top,
distance      = (elementOffset - scrollTop);
if(distance < vh){
    console.log('in view');
}
else{
    console.log('not in view');
}
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.