Javascript ile bir div'in üstünden pencerenin üstüne kadar olan mesafeyi belirleyin


127

Bir div'in en üstünden geçerli ekranın en üstüne kadar olan mesafeyi nasıl belirleyebilirim? Ben sadece piksel mesafesinin geçerli ekranın üst kısmına kadar olmasını istiyorum, belgenin üstüne değil. Ben gibi bir kaç şey denedim .offset()ve .offsetHeight, ama sadece onun etrafında beynimi sarmalayamazsınız. Teşekkürler!



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

3
@caub Eh, bu sadece el.getBoundingClientRect().top. Kaydırma konumu eklemek, belgenin üst kısmına olan mesafeyi artırır. developer.mozilla.org/de/docs/Web/API/Element/…
lynx

evet doğru, sadece sorguyu kaldırmak istedim
caub

Yanıtlar:


239

Sen kullanabilirsiniz .offset()almak için karşılaştırıldığında ofset documenteleman ve sonra kullanmak scrollTopözelliği windowkullanıcı kaydırılan ne kadar ileri Sayfanın altındaki bulmak için eleman:

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

distanceDeğişken hemen üstüne olan mesafeyi tutan #my-elementeleman ve üst kat.

İşte bir demo: http://jsfiddle.net/Rxs2m/

Negatif değerlerin, öğenin üst katın üstünde olduğu anlamına geldiğini unutmayın.


Mesafenin belirli bir sayı olup olmadığını nasıl kontrol edebilirim? Üstten 120 piksel
uzaktaysa

@ThessaVerbruggen distanceDeğişkenin değerinin olup olmadığını kontrol edebilirsiniz , 120ancak tam sayı yerine bir aralığı kontrol etmenizi öneririm. Örneğin bir fare tekerleği ile kaydırırsanız, 120'den fazla atlayabilirsiniz. Öyleyse, öğe üst katın 120 piksel yakınındayken biraz CSS veya başka bir şey uygulamaya çalışıyorsanız, o zaman kullanabilirsiniz if (distance < 120) { /* do something */}. İşte güncellenmiş bir demo: jsfiddle.net/na5qL91o
Jasper

Bunu yaparsam bir sorun var: kaydırdığımda yapışkan kısım yanıp sönüyor. Sanırım, çünkü kaydırdığımda yeniden hesaplıyor. Bunu nasıl düzelteceğine dair bir fikrin var mı? Kodum: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# ikincil'). Offset (). Top, mesafe = (elementOffset - scrollTop); if (mesafe <120) {$ ('# ikincil'). addClass ('yapışkan');} else {$ ('# ikincil'). removeClass ('yapışkan');}});
Thessa Verbruggen

60

Vanilya:

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

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

   console.log(distanceToTop);
});

Tarayıcı konsolunuzu açın ve mesafeyi görmek için sayfanızı kaydırın.


14
Bu, yalnızca kullanıcı sayfayı kaydırmadıysa çalışır. Aksi takdirde distanceToTopdöndürülen görecelidir (kullanıcı geçmişe kaydırmışsa bile negatif olabilir). Bunu hesaba katmak için şunu kullanınwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.

2
@ty OP, belgenin tepesine değil, ekranın üst kısmına olan mesafeyi arıyor - bu durumda negatif bir değer geçerli olacaktır
Drenai

16

Bu tamamen JavaScript ile gerçekleştirilebilir .

Soruya yapılan yorumlarda yazmak istediğim cevabın vaşak tarafından cevaplandığını görüyorum .

Ama yine de cevap yazacağım çünkü tıpkı benim gibi insanlar bazen yorumları okumayı unutuyor.

Öyleyse, ekran pencerenizin üst kısmından bir öğenin mesafesini (Piksel cinsinden) öğrenmek istiyorsanız, yapmanız gerekenler:

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

getBoundingClientRect () kullanın

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

Bu kadar!

Umarım bu birine yardımcı olur :)


1
getBoundingClient () çalışmıyor, bunun yerine .getBoundingClientRect ()
Elnoor

@Elnoor Öneriniz için teşekkürler :) Uygun değişiklikleri yaptım.
Furqan Rahamath

Harika iş @MohammedFurqanRahamathM. Cevabınız için çok teşekkür ederim :) Bir çekicilik gibi çalışıyor !! :)
Merianos Nikos

1
@MerianosNikos Teşekkürler.
Yardımcı

1
ama bu yalnızca sayfanın ortasında yeniden yüklemediyseniz işe yarar değil mi?
Sagive SEO

7

Bunu kullandım:

                              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

kod:

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'ın var olduğunu göstermek için +1. element.getBoundingClientRect (). top bana tuhaf davranışlar veriyor. Web sayfasının üstünden öğenin en üstüne kadar olan mesafeyi öğrenmek istiyordum.
alexandre1985

0

Öğenin görünüm bağlantı noktasında görünür olup olmadığını tespit etmek için bu işlevi kullandım

Kod:

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');
}
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.