Xác định khoảng cách từ đỉnh div đến đỉnh cửa sổ bằng javascript


127

Làm cách nào để xác định khoảng cách giữa đỉnh div đến đỉnh màn hình hiện tại? Tôi chỉ muốn khoảng cách pixel đến trên cùng của màn hình hiện tại, không phải trên cùng của tài liệu. Tôi đã thử một vài thứ như .offset().offsetHeight, nhưng tôi không thể bọc bộ não của mình xung quanh nó. Cảm ơn!


2
bạn có thể muốn kiểm tra điều này
Joseph

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

3
@caub Ơ, chỉ là vậy thôi el.getBoundingClientRect().top. Thêm vị trí cuộn thêm vào khoảng cách đến đỉnh của tài liệu. developer.mozilla.org/de/docs/Web/API/Euity/ từ
lynx

vâng đúng, chỉ muốn hủy bỏ
caub

Câu trả lời:


239

Bạn có thể sử dụng .offset()để lấy phần bù so với documentphần tử và sau đó sử dụng thuộc scrollToptính của windowphần tử để tìm xem trang người dùng đã cuộn xuống bao xa:

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

Các distancebiến bây giờ giữ khoảng cách từ phía trên cùng của #my-elementphần tử và các hàng đầu lần.

Đây là bản demo: http://jsfiddle.net/Rxs2m/

Lưu ý rằng các giá trị âm có nghĩa là phần tử nằm trên nếp gấp trên cùng.


Làm thế nào tôi có thể kiểm tra nếu khoảng cách là một con số cụ thể? Tôi muốn làm cho một phần tử dính nếu nó cách đỉnh 120px
Thessa Verbruggen

@ThessaVerbruggen Bạn có thể kiểm tra distancebiến để xem giá trị của nó có 120phải không nhưng tôi khuyên bạn nên kiểm tra phạm vi thay vì số chính xác. Ví dụ, nếu bạn cuộn bằng bánh xe chuột, bạn rất có thể bỏ qua hơn 120. Vì vậy, nếu bạn đang cố gắng áp dụng một số CSS hoặc một cái gì đó khi phần tử nằm trong khoảng 120px của nếp gấp trên cùng, thì có thể sử dụng if (distance < 120) { /* do something */}. Dưới đây là bản demo được cập nhật: jsfiddle.net/na5qL91o
Jasper

Một vấn đề nếu tôi làm điều này: phần dính đang nhấp nháy khi tôi cuộn. Tôi đoán bởi vì nó tính toán lại khi tôi cuộn. Bất kỳ ý tưởng làm thế nào để khắc phục điều này? Mã của tôi: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), Element Offerset = $ ('# junior'). Offset (). Top, distance = (Element Offerset - scrollTop); if (distance <120) {$ ('# junior'). addClass ('stick');} other {$ ('# junior'). removeClass ('stick');}});
Thessa Verbruggen

60

Vanilla:

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

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

   console.log(distanceToTop);
});

Mở bảng điều khiển trình duyệt của bạn và cuộn trang của bạn để xem khoảng cách.


14
Điều này chỉ hoạt động nếu người dùng không cuộn trang. Mặt khác được distanceToToptrả về là tương đối (thậm chí có thể âm nếu người dùng đã cuộn qua). Để tính đến điều này, hãy sử dụngwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.

2
@ty OP đang tìm khoảng cách đến đỉnh màn hình, không phải đến đỉnh của tài liệu - một giá trị âm sẽ có hiệu lực trong trường hợp này
Drenai 25/03/19

16

Điều này có thể đạt được hoàn toàn với JavaScript .

Tôi thấy câu trả lời tôi muốn viết đã được lynx trả lời trong các bình luận cho câu hỏi.

Nhưng dù sao tôi cũng sẽ viết câu trả lời vì giống như tôi, mọi người đôi khi quên đọc các bình luận.

Vì vậy, nếu bạn chỉ muốn lấy khoảng cách của một phần tử (tính bằng Pixels) từ đầu cửa sổ màn hình của mình, đây là những gì bạn cần làm:

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

sử dụng getBoundingClientRect ()

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

Đó là nó!

Hy vọng điều này sẽ giúp được ai đó :)


1
getBoundingClient () không hoạt động, thay vào đó .getBoundingClientRect ()
Elnoor

@Elnoor Cảm ơn bạn đã gợi ý :) Tôi đã thực hiện các thay đổi phù hợp.
Furqan Rahamath

Công việc tuyệt vời @MohammedFurqanRahamathM. Cảm ơn bạn rất nhiều vì câu trả lời của bạn :) Nó hoạt động như một sự quyến rũ !! :)
Merianos Nikos

1
@MerianosNikos Cảm ơn bạn. Tôi rất vui vì nó đã được giúp đỡ :)
Furqan Rahamath

1
Nhưng điều này sẽ chỉ hoạt động nếu bạn chưa tải lại ở giữa trang phải không?
SEO Sagive

7

Tôi đã sử dụng điều này:

                              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

mã:

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

+1 để hiển thị phần tử đó.offsetTop tồn tại. Element.getBoundingClientRect (). top đang cho tôi hành vi lạ. Tôi đang tìm cách để có được khoảng cách từ đầu trang web cho đến đầu phần tử.
alexandre1985

0

Tôi đã sử dụng chức năng này để phát hiện nếu phần tử hiển thị trong cổng xem

Mã số:

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');
}
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.