Jaki jest właściwy sposób na uzyskanie pozycji elementu na stronie względem widoku (a nie dokumentu). jQuery.offset
funkcja wydawała się obiecująca:
Uzyskaj aktualne współrzędne pierwszego elementu lub ustaw współrzędne każdego elementu w zestawie dopasowanych elementów względem dokumentu.
Ale to odnosi się do dokumentu. Czy istnieje równoważna metoda, która zwraca przesunięcia względem rzutni?
Odpowiedzi:
Zajrzyj do wtyczki Dimensions, w szczególności
scrollTop()
/scrollLeft()
. Informacje można znaleźć pod adresem http://api.jquery.com/scrollTop .źródło
Najłatwiejszym sposobem określenia rozmiaru i położenia elementu jest wywołanie jego metody getBoundingClientRect () . Ta metoda zwraca pozycje elementów we współrzędnych rzutni. Nie oczekuje żadnych argumentów i zwraca obiekt z właściwościami left, right, top i bottom . Właściwości left i top określają współrzędne X i Y lewego górnego rogu elementu, a właściwości prawy i dolny określają współrzędne prawego dolnego rogu.
element.getBoundingClientRect(); // Get position in viewport coordinates
Obsługiwane wszędzie.
źródło
getBoundingClientRect is not a function
$('#myElement')[0].getBoundingClientRect().top
(lub jakakolwiek inna pozycja)Oto dwie funkcje do uzyskania wysokości strony i ilości przewijania (x, y) bez użycia wtyczki wymiarów (nadęty):
źródło
jQuery.offset
musi być połączone zscrollTop
iscrollLeft
jak pokazano na tym schemacie:Próbny:
źródło
Oto funkcja, która oblicza bieżące położenie elementu w rzutni:
Zwracane wartości są obliczane w następujący sposób:
Stosowanie:
Próbny:
źródło
Okazało się, że odpowiedź od cballou nie działa już w Firefoksie od stycznia 2014 r. W szczególności
if (self.pageYOffset)
nie uruchamia się, jeśli klient przewija się w prawo, ale nie w dół - ponieważ0
jest to błędna liczba. Przez jakiś czas pozostawało to niewykryte, ponieważ Firefox obsługiwałdocument.body.scrollLeft
/Top
, ale to już nie działa (w przeglądarce Firefox 26.0).Oto moje zmodyfikowane rozwiązanie:
Przetestowane i działające w FF26, Chrome 31, IE11. Prawie na pewno działa na starszych wersjach wszystkich z nich.
źródło