Tentukan jarak dari atas div ke atas jendela dengan javascript

127

Bagaimana cara menentukan jarak antara bagian paling atas dari div ke bagian atas layar saat ini? Saya hanya ingin jarak piksel ke atas layar saat ini, bukan bagian atas dokumen. Saya sudah mencoba beberapa hal seperti .offset()dan .offsetHeight, tetapi saya tidak bisa membungkus otak saya dengannya. Terima kasih!

Joel Eckroth
sumber
2
Anda mungkin ingin memeriksanya
Joseph
7
el.getBoundingClientRect().top+window.scrollY
gabungkan
3
@caub Eh, hanya saja el.getBoundingClientRect().top. Menambahkan posisi gulir menambah jarak ke bagian atas dokumen. developer.mozilla.org/de/docs/Web/API/Element/…
lynx
ya benar, hanya ingin tidak melakukan kesalahan
gabungkan

Jawaban:

239

Anda dapat menggunakan .offset()untuk mendapatkan offset dibandingkan dengan documentelemen dan kemudian menggunakan scrollTopproperti windowelemen untuk menemukan seberapa jauh ke bawah halaman yang telah digulir pengguna:

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

The distancevariabel sekarang memegang jarak dari puncak #my-elementelemen dan bagian atas kali lipat.

Berikut ini adalah demo: http://jsfiddle.net/Rxs2m/

Perhatikan bahwa nilai negatif berarti elemen berada di atas lipatan atas.

Jasper
sumber
Bagaimana saya bisa mengecek apakah jarak itu nomor tertentu? Saya ingin membuat elemen lengket jika jaraknya
120px
@ThessaVerbruggen Anda dapat memeriksa distancevariabel untuk melihat apakah nilainya 120tetapi saya akan merekomendasikan memeriksa rentang, bukan angka yang tepat. Jika misalnya Anda menggulir dengan roda mouse, Anda mungkin melewatkan lebih dari 120. Jadi jika Anda mencoba menerapkan beberapa CSS atau sesuatu ketika elemen berada dalam 120px dari flip-top, maka mungkin gunakan if (distance < 120) { /* do something */}. Berikut ini adalah demo terbaru: jsfiddle.net/na5qL91o
Jasper
Satu masalah jika saya melakukan ini: bagian lengket berkedip ketika saya gulir. Saya kira karena itu menghitung ulang ketika saya menggulir. Adakah cara untuk memperbaikinya? Kode saya: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secondary'). Offset (). Top, distance = (elementOffset - scrollTop); if (distance <120) {$ ('# secondary'). addClass ('sticky');} else {$ ('# secondary'). removeClass ('sticky');}});
Thessa Verbruggen
60

Vanila:

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

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

   console.log(distanceToTop);
});

Buka konsol browser Anda dan gulir halaman Anda untuk melihat jaraknya.

horahore
sumber
14
Ini hanya berfungsi jika pengguna belum menggulir halaman. Kalau tidak distanceToTopdikembalikan adalah relatif (bahkan dapat menjadi negatif jika pengguna telah menggulir masa lalu). Untuk memperhitungkan ini, gunakanwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.
2
@ty OP sedang mencari jarak ke atas layar, bukan ke atas dokumen - nilai negatif akan berlaku dalam kasus ini
Drenai
16

Ini dapat dicapai murni dengan JavaScript .

Saya melihat jawaban yang ingin saya tulis telah dijawab oleh lynx dalam komentar untuk pertanyaan itu.

Tetapi saya tetap akan menulis jawaban karena sama seperti saya, orang kadang-kadang lupa membaca komentar.

Jadi, jika Anda hanya ingin mendapatkan jarak elemen (dalam Piksel) dari bagian atas jendela layar Anda, inilah yang perlu Anda lakukan:

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

gunakan getBoundingClientRect ()

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

Itu dia!

Semoga ini bisa membantu seseorang :)

Furqan Rahamath
sumber
1
getBoundingClient () tidak berfungsi, sebagai gantinya .getBoundingClientRect ()
Elnoor
@ Elnoor Terima kasih atas sarannya :) Saya telah membuat perubahan yang sesuai.
Furqan Rahamath
Kerja yang luar biasa @MohammedFurqanRahamathM. Terima kasih banyak atas jawaban Anda :) Ini bekerja seperti pesona !! :)
Merianos Nikos
1
@MerianosNikos Terima kasih. Saya senang itu membantu :)
Furqan Rahamath
1
tetapi ini hanya akan berfungsi jika Anda belum memuat ulang di tengah halaman, kan?
Sagive SEO
7

Saya menggunakan ini:

                              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

kode:

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);
    });
    */
T.Todua
sumber
+1 untuk menunjukkan bahwa element.offsetTop ada. element.getBoundingClientRect (). top memberi saya perilaku aneh. Saya mencari untuk mendapatkan jarak dari bagian atas halaman web sampai bagian atas elemen.
alexandre1985
0

Saya menggunakan fungsi ini untuk mendeteksi jika elemen terlihat di port tampilan

Kode:

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');
}
});
moutasim ahmad
sumber