Przeczytałem to offsetLeft
i offsetTop
nie działa poprawnie we wszystkich przeglądarkach. jQuery.offset()
ma dostarczyć abstrakcji, aby zapewnić poprawną wartość xbrowser.
To, co próbuję zrobić, to uzyskać współrzędne miejsca kliknięcia elementu względem lewego górnego rogu elementu.
Problem polega na tym, że jQuery.offset().top
w FFX 3.6 faktycznie podaje mi wartość dziesiętną (w IE i Chrome te dwie wartości są zgodne).
To skrzypce pokazuje problem. Jeśli klikniesz dolny obraz, jQuery.offset().top
zwraca 327,5, ale offsetTop
zwraca 328.
Chciałbym myśleć, że offset()
zwraca prawidłową wartość i powinienem go użyć, ponieważ będzie działać w różnych przeglądarkach. Jednak ludzie oczywiście nie mogą klikać ułamków dziesiętnych pikseli. Czy właściwy sposób określenia prawdziwego przesunięcia względem Math.round()
przesunięcia, które zwraca jQuery? Powinienem użyć offsetTop
zamiast tego, czy całkowicie innej metody?
źródło
Oto, o czym mówi jQuery API Doc
.offset()
:Oto, o czym mówi MDN Web API
.offsetTop
:Oto, co
.offset()
zasadniczo robi jQuery v.1.11 podczas uzyskiwania coords:var box = { top: 0, left: 0 }; // BlackBerry 5, iOS 3 (original iPhone) if ( typeof elem.getBoundingClientRect !== strundefined ) { box = elem.getBoundingClientRect(); } win = getWindow( doc ); return { top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ), left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 ) };
pageYOffset
intuicyjnie mówi, ile przewinięto stronędocElem.scrollTop
to rozwiązanie zastępcze dla IE <9 (które przy okazji nie są obsługiwane w jQuery 2)docElem.clientTop
jest szerokością górnej granicy elementu (w tym przypadku dokumentu)elem.getBoundingClientRect()
pobiera współrzędne względem widokudokumentu(patrz komentarze). Może zwracać wartości ułamkowe, więc to jest źródło twojego błędu. Może również powodować błąd w IE <8, gdy strona jest powiększana. Aby uniknąć wartości ułamkowych, spróbuj obliczyć pozycję iteracyjnieWniosek
element.offsetTop
. Dodaj,element.scrollTop
jeśli chcesz wziąć pod uwagę przewijanie przez rodzica. (lub użyj jQuery .position () jeśli jesteś fanem tej biblioteki)element.getBoundingClientRect().top
. Dodaj,window.pageYOffset
jeśli chcesz wziąć pod uwagę przewijanie dokumentu. Nie musisz odejmować dokumentów,clientTop
jeśli dokument nie ma obramowania (zwykle nie ma), więc masz pozycję względem dokumentuelement.clientTop
jeśli nie uważasz obramowania elementu za część elementuźródło
Element.getBoundingClientRect()
podaje pozycje względem widoku , a nie dokumentuSpróbuj tego:
parseInt(jQuery.offset().top, 10)
źródło
Możliwe, że
offset
może być liczbą niecałkowitą, używającem
jako jednostki miary, względnejfont-sizes
w%
.Teoretyzuję również, że
offset
może nie być liczbą całkowitą, gdyzoom
nie jest,100%
ale to zależy od tego, jak przeglądarka obsługuje skalowanie.źródło
Możesz użyć,
parseInt(jQuery.offset().top)
aby zawsze używać wartości całkowitej (prymityw -int
) we wszystkich przeglądarkach.źródło