Określ odległość od góry elementu div do góry okna za pomocą JavaScript

131

Jak określić odległość między samą górą elementu div a górą bieżącego ekranu? Chcę tylko odległość w pikselach do góry bieżącego ekranu, a nie do góry dokumentu. Próbowałem kilku rzeczy, takich jak .offset()i .offsetHeight, ale po prostu nie potrafię się tym zająć. Dzięki!

Joel Eckroth
źródło
2
możesz to sprawdzić
Joseph
8
el.getBoundingClientRect().top+window.scrollY
kuba
3
@caub Ech, to po prostu el.getBoundingClientRect().top. Dodanie pozycji przewijania sumuje odległość do góry dokumentu. developer.mozilla.org/de/docs/Web/API/Element/ ...
lynx
tak, po prostu chciałem się zdjąć
zatańczyć

Odpowiedzi:

243

Możesz użyć, .offset()aby uzyskać przesunięcie w porównaniu z documentelementem, a następnie użyć scrollTopwłaściwości windowelementu, aby sprawdzić, jak daleko w dół strony przewinął użytkownik:

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

distanceZmienna posiada obecnie odległości od góry #my-elementelementem a górnym-krotnie.

Oto demo: http://jsfiddle.net/Rxs2m/

Zwróć uwagę, że wartości ujemne oznaczają, że element znajduje się powyżej górnej części strony widocznej na ekranie.

Jaspis
źródło
Jak mogę sprawdzić, czy odległość to konkretna liczba? Chcę, aby element był lepki, jeśli znajduje się 120 pikseli od góry
Thessa Verbruggen
1
@ThessaVerbruggen Możesz sprawdzić distancezmienną, aby zobaczyć, czy jej wartość jest, 120ale polecam sprawdzenie zakresu zamiast dokładnej liczby. Jeśli na przykład przewijasz kółkiem myszy, możesz bardzo dobrze przeskoczyć ponad 120. Więc jeśli próbujesz zastosować jakiś CSS lub coś innego, gdy element znajduje się w odległości 120 pikseli od górnej części ekranu, może użyj if (distance < 120) { /* do something */}. Oto zaktualizowane demo: jsfiddle.net/na5qL91o
Jasper
Jeden problem, jeśli to zrobię: lepka część miga podczas przewijania. Chyba dlatego, że przelicza się ponownie, kiedy przewijam. Jakiś pomysł jak to naprawić? Mój kod: $ (window) .on ('scroll', function () {var scrollTop = $ (window) .scrollTop (), elementOffset = $ ('# secondary'). Offset (). Top, distance = (elementOffset - scrollTop); if (odległość <120) {$ ('# secondary'). addClass ('sticky');} else {$ ('# secondary'). removeClass ('sticky');}});
Thessa Verbruggen
67

Wanilia:

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

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

   console.log(distanceToTop);
});

Otwórz konsolę przeglądarki i przewiń stronę, aby zobaczyć odległość.

Horahore
źródło
17
Działa to tylko wtedy, gdy użytkownik nie przewinął strony. W przeciwnym razie distanceToTopzwracana jest wartość względna (może być nawet ujemna, jeśli użytkownik przewinął listę). Aby to uwzględnić, użyjwindow.pageYOffset + someDiv.getBoundingClientRect().top
ty.
2
@ty OP szuka odległości do góry ekranu, a nie do góry dokumentu - w tym przypadku ważna byłaby wartość ujemna
Drenai
19

Można to osiągnąć wyłącznie za pomocą JavaScript .

Widzę, że odpowiedź, którą chciałem napisać, została udzielona przez lynx w komentarzach do pytania.

Ale i tak napiszę odpowiedź, ponieważ tak jak ja ludzie czasami zapominają o przeczytaniu komentarzy.

Tak więc, jeśli chcesz po prostu uzyskać odległość elementu (w pikselach) od góry okna ekranu, oto co musisz zrobić:

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

użyj getBoundingClientRect ()

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

Otóż ​​to!

Mam nadzieję, że to komuś pomoże :)

Furqan Rahamath
źródło
1
getBoundingClient () nie działa, zamiast tego .getBoundingClientRect ()
Elnoor
@Elnoor Dziękuję za sugestię :) Wprowadziłem odpowiednie zmiany.
Furqan Rahamath
Po prostu niesamowita praca @MohammedFurqanRahamathM. Dziękuję bardzo za odpowiedź :) To działa jak urok !! :)
KodeFor.Me
1
@MerianosNikos Dziękuję. Cieszę się, że to pomogło :)
Furqan Rahamath
1
ale to zadziała tylko wtedy, gdy nie zostaniesz ponownie załadowany na środku strony, prawda?
Sagive SEO,
7

Użyłem tego:

                              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);
    });
    */
T.Todua
źródło
+1 za pokazanie tego elementu.offsetTop istnieje. element.getBoundingClientRect (). top powoduje dziwne zachowanie. Szukałem odległości od góry strony do górnej części elementu.
alexandre1985,
0

Użyłem tej funkcji do wykrycia, czy element jest widoczny w porcie widoku

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');
}
});
moutasim ahmad
źródło