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!


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.


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ść.


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 :)


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

+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');
}
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.