Jestem przyzwyczajony do pracy z jQuery. Jednak w moim obecnym projekcie używam zepto.js. Zepto nie dostarcza position()
metody takiej jak jQuery. Zepto jest dostarczane tylko z offset()
.
Masz pomysł, jak mogę pobrać przesunięcie kontenera względem rodzica z czystym js lub z Zepto?
JavaScript
tagu, jeśli używasz czystego JavaScript. Jeśli używasz frameworka lub biblioteki, nie używaszJavaScript
tagu. Jeśli masz na imię Jeff, nie nazywałbym cię Sally.Odpowiedzi:
Ostrzeżenie: jQuery, niestandardowy JavaScript
element.offsetLeft
ielement.offsetTop
są czystymi właściwościami javascript do znajdowania pozycji elementu względem jegooffsetParent
; będący najbliższym elementem nadrzędnym z pozycjąrelative
lubabsolute
Alternatywnie, zawsze możesz użyć Zepto, aby uzyskać pozycję elementu ORAZ jego rodzica i po prostu odjąć te dwa:
Ma to tę zaletę, że daje ci odliczenie dziecka względem jego rodzica, nawet jeśli rodzic nie jest w pozycji.
źródło
static
nie są przesuniętymi rodzicami.w czystym js po prostu użyj
offsetLeft
ioffsetTop
właściwości.Przykładowe skrzypce: http://jsfiddle.net/WKZ8P/
źródło
p.offsetTop + p.parentNode.offsetTop
Mógłbyś zawrzeć to w wywołaniu funkcji rekurencyjnej, podobnie jak PPK zaproponowane kilka lat temu. Możesz zmienić funkcję tak, aby przekroczyła liczbę poziomów, aby przejść w górę, lub użyć selektora do naśladowania$(selector).parents(parentSelector)
. Wolałbym to rozwiązanie, ponieważ implementacja zepto działa tylko na przeglądarkach obsługującychgetBoundingClientsRect
- czego nie oferują niektóre telefony komórkowe.getBoundingClientsRect
jest szeroko obsługiwany ... jeśli ktoś wie, które telefony komórkowe go nie obsługują, byłbym zainteresowany (nie mogę znaleźć żadnej tabeli wsparcia dla telefonów komórkowych na ten temat).$(this).offset().left
nathis.offsetLeft
.jQuery.position()
zachowanie wewnątrz rodzica przekształconego w 3D, bardzo dziękuję!Zrobiłem to w ten sposób w Internet Explorerze.
=================== możesz to tak nazwać
Skupiam się na IE tylko w moim celu, ale podobne rzeczy można zrobić dla innych przeglądarek.
źródło
Dodaj przesunięcie zdarzenia do przesunięcia elementu nadrzędnego, aby uzyskać bezwzględną pozycję przesunięcia zdarzenia.
Przykład :
Jeśli cel zdarzenia nie jest elementem, w którym zdarzenie zostało zarejestrowane, dodaje przesunięcie elementu nadrzędnego do bieżącego przesunięcia zdarzenia w celu obliczenia wartości przesunięcia „Absolutnego”.
Według Mozilla Web API: „Właściwość HTMLElement.offsetLeft tylko do odczytu zwraca liczbę pikseli, o jaką lewy górny róg bieżącego elementu jest przesunięty w lewo w węźle HTMLElement.offsetParent. ”
Dzieje się tak najczęściej, gdy zarejestrowałeś zdarzenie u rodzica, które zawiera kilka dodatkowych elementów potomnych, na przykład: przycisk z wewnętrzną ikoną lub zakresem tekstu,
li
element z wewnętrznymi rozpiętościami. itp...źródło
Przykład
Tak więc, gdybyśmy mieli element podrzędny o identyfikatorze „element-podrzędny” i chcielibyśmy uzyskać jego lewą / górną pozycję względem elementu nadrzędnego, powiedzmy, że element div ma klasę „element-rodzic”, użyj tego kodu.
Wtyczka Wreszcie, dla właściwej wtyczki (z kilkoma notatkami wyjaśniającymi, co się dzieje):
źródło
Mam inne rozwiązanie. Odejmij wartość właściwości nadrzędnej od wartości właściwości podrzędnej
źródło
Jasne, że jest to łatwe z czystym JS, po prostu zrób to, pracuj również dla stałych i animowanych paneli HTML 5, stworzyłem i wypróbowałem ten kod i działa on dla każdej przeglądarki (w tym IE 8):
źródło