Potrzebuję uzyskać wysokość elementu, który jest w div, który jest ukryty. Teraz pokazuję div, zdobywam wysokość i chowam div diva. To wydaje się trochę głupie. Czy jest lepszy sposób?
Używam jQuery 1.4.2:
$select.show();
optionHeight = $firstOption.height(); //we can only get height if its visible
$select.hide();
javascript
jquery
html
css
mkoryak
źródło
źródło
Odpowiedzi:
Możesz zrobić coś takiego, trochę zuchwałego, zapomnij,
position
czy jest to już absolutne:źródło
position:relative
, oczywiście będziesz chciał ustawić go później zamiaststatic
.Natknąłem się na ten sam problem z uzyskaniem szerokości ukrytego elementu, więc napisałem to wywołanie wtyczki jQuery Actual, aby to naprawić. Zamiast używać
posługiwać się
da ci odpowiednią wartość dla ukrytego elementu lub element ma ukrytego rodzica.
Pełna dokumentacja znajduje się tutaj . Na stronie znajduje się również wersja demo.
Mam nadzieję, że to pomoże :)
źródło
Zmieniasz dwa style CSS, styl wyświetlania i styl widoczności .
Jeśli element jest ukryty poprzez ustawienie stylu css widoczności, powinieneś być w stanie uzyskać wysokość niezależnie od tego, czy element jest widoczny, czy nie, ponieważ element nadal zajmuje miejsce na stronie .
Jeśli element jest ukryty przez zmianę stylu wyświetlania css na „none”, element nie zajmuje miejsca na stronie i trzeba będzie nadać mu styl wyświetlania, który spowoduje, że element będzie renderowany w pewnym miejscu, w który punkt, możesz uzyskać wysokość.
źródło
visibility
nahidden
nie rozwiązuje mojego problemu, ale to dało mi pomysł na zestawposition: fixed; top: 100%
i działa jak czar!Czasami skorzystałem z odrobiny sztuczek, aby sobie z tym poradzić. Opracowałem widżet paska przewijania jQuery, w którym napotkałem problem, którego nie wiem z góry, czy zawartość przewijalna jest częścią ukrytego znacznika, czy nie. Oto co zrobiłem:
Działa to w przeważającej części, ale istnieje oczywisty problem, który może potencjalnie się pojawić. Jeśli treść, którą klonujesz, jest stylizowana za pomocą CSS, który zawiera odniesienia do znaczników nadrzędnych w swoich regułach, sklonowana treść nie będzie zawierać odpowiedniego stylu i prawdopodobnie będzie miała nieco inne wymiary. Aby obejść ten problem, możesz upewnić się, że klonowane znaczniki mają zastosowane reguły CSS, które nie zawierają odniesień do znaczników nadrzędnych.
Ponadto nie przyszło mi to z moim widgetem przewijania, ale aby uzyskać odpowiednią wysokość sklonowanego elementu, musisz ustawić szerokość na tę samą szerokość elementu nadrzędnego. W moim przypadku szerokość CSS była zawsze stosowana do rzeczywistego elementu, więc nie musiałem się tym przejmować, jednak jeśli element nie ma zastosowanej szerokości, może być konieczne wykonanie pewnego rodzaju rekurencji przejście przez pochodzenie DOM elementu w celu znalezienia odpowiedniej szerokości elementu nadrzędnego.
źródło
W oparciu o odpowiedź Nicka i wtyczkę użytkownika hitautodestruct na JSBin stworzyłem podobną wtyczkę jQuery, która pobiera zarówno szerokość, jak i wysokość i zwraca obiekt zawierający te wartości.
Można go znaleźć tutaj: http://jsbin.com/ikogez/3/Aktualizacja
Całkowicie przeprojektowałem tę małą, niewielką wtyczkę, ponieważ okazało się, że poprzednia wersja (wspomniana powyżej) nie była tak naprawdę użyteczna w rzeczywistych środowiskach, w których odbywało się wiele manipulacji DOM.
Działa to doskonale:
źródło
sizes = {"width": $wrap.width(), "height": $wrap.height()};
this
$wrap
jest w porządku (przynajmniej w moich testach). Próbowałem zthis
i oczywiście nie złapałby rozmiaru, ponieważthis
wciąż odnosi się do ukrytego elementu.Opierając się na odpowiedzi Nicka:
Odkryłem, że lepiej to zrobić:
Ustawienie atrybutów CSS spowoduje wstawienie ich do tekstu, co spowoduje zastąpienie wszystkich innych atrybutów, które masz w pliku CSS. Po usunięciu atrybutu stylu z elementu HTML wszystko wraca do normy i nadal jest ukryte, ponieważ w pierwszej kolejności zostało ukryte.
źródło
$("#myDiv").css({'position':'absolute','visibility':'hidden', 'display':'block'}); optionHeight = $("#myDiv").height(); $("#myDiv").css({'position':'','visibility':'', 'display':''});
Możesz także umieścić ukryty div poza ekranem z ujemnym marginesem zamiast przy użyciu display: none, bardzo podobny do techniki zastępowania obrazu za pomocą wcięcia tekstu.
na przykład.
W ten sposób wysokość () jest nadal dostępna.
źródło
Próbuję znaleźć działającą funkcję dla ukrytego elementu, ale zdaję sobie sprawę, że CSS jest o wiele bardziej skomplikowany niż wszyscy myślą. Istnieje wiele nowych technik układu w CSS3, które mogą nie działać w przypadku wszystkich poprzednich odpowiedzi, takich jak elastyczne pole, siatka, kolumna lub nawet element wewnątrz złożonego elementu nadrzędnego.
przykład Flexibox
Myślę, że jedynym trwałym i prostym rozwiązaniem jest rendering w czasie rzeczywistym . W tym momencie przeglądarka powinna podać ten prawidłowy rozmiar elementu .
Niestety, JavaScript nie zapewnia żadnego bezpośredniego zdarzenia powiadamiającego o wyświetleniu lub ukryciu elementu. Jednak tworzę jakąś funkcję na podstawie interfejsu API zmodyfikowanego atrybutu DOM, który wykona funkcję zwrotną po zmianie widoczności elementu.
Aby uzyskać więcej informacji, odwiedź mój projekt GitHub.
https://github.com/Soul-Master/visible.event.js
demo: http://jsbin.com/ETiGIre/7
źródło
style
atrybutów (patrz wiersz 59 tutaj ), podczas gdy zmiany widoczności mogą być również spowodowane zmianamiclass
atrybutu.Zgodnie z rozwiązaniem Nicka Cravera ustawienie widoczności elementu pozwala uzyskać dokładne wymiary. Bardzo często korzystałem z tego rozwiązania. Jednak po ręcznym resetowaniu stylów znalazłem to uciążliwe, biorąc pod uwagę, że modyfikując początkowe pozycjonowanie / wyświetlanie elementu w moim css poprzez programowanie, często zapominam aktualizować powiązany kod javascript. Poniższy kod nie resetuje stylów dla każdego powiedzenia, ale usuwa style wbudowane dodane przez javascript:
Jedynym założeniem jest to, że nie mogą istnieć inne style wbudowane, w przeciwnym razie zostaną one również usunięte. Korzyścią tutaj jest to, że style elementu są zwracane do tego, co były w arkuszu stylów css. W związku z tym możesz zapisać to jako funkcję, przez którą przechodzi element i zwracana jest wysokość lub szerokość.
Innym problemem, jaki znalazłem przy ustawianiu stylów za pomocą js, jest to, że podczas radzenia sobie z przejściami przez css3, jesteś zmuszony dostosować wagi reguł stylu, aby były silniejsze niż styl wbudowany, co może czasami być frustrujące.
źródło
Z definicji element ma wysokość tylko wtedy, gdy jest widoczny.
Ciekawe: dlaczego potrzebujesz wysokości ukrytego elementu?
Jedną z możliwości jest skuteczne ukrycie elementu przez umieszczenie go (za pomocą indeksu Z) jakiejś nakładki).
źródło
W moich okolicznościach miałem również ukryty element, który powstrzymywał mnie przed uzyskaniem wartości wysokości, ale nie był to sam element, ale raczej jeden z jego rodziców ... więc po prostu sprawdziłem, czy jedna z moich wtyczek się sprawdza, czy to jest ukryty, w przeciwnym razie znajdź najbliższy ukryty element. Oto przykład:
W rzeczywistości jest to połączenie odpowiedzi Nicka, Gregory'ego i Eyelidlessnessa, aby dać ci zastosowanie ulepszonej metody Gregory'ego, ale wykorzystuje obie metody w przypadku, gdy ma być coś w atrybucie stylu, który chcesz odłożyć, i szuka element nadrzędny.
Moje jedyne zastrzeżenie związane z moim rozwiązaniem polega na tym, że pętla prowadząca przez rodziców nie jest w pełni wydajna.
źródło
Jednym z obejść tego problemu jest utworzenie rodzica div poza elementem, dla którego chcesz uzyskać wysokość, zastosowanie wysokości „0” i ukrycie wszelkiego przepełnienia. Następnie weź wysokość elementu potomnego i usuń właściwość przepełnienia elementu nadrzędnego.
źródło
Oto skrypt, który napisałem, aby obsługiwać wszystkie metody wymiarowania jQuery dla ukrytych elementów, nawet potomków ukrytych rodziców. Zauważ, że z tego powodu jest oczywiście wydajność.
źródło
Jeśli element był już wcześniej wyświetlany na stronie, możesz po prostu pobrać wysokość bezpośrednio z elementu DOM (osiągalnego w jQuery za pomocą .get (0)), ponieważ jest on ustawiany nawet wtedy, gdy element jest ukryty:
to samo dla szerokości:
(podziękowania dla Skeets O'Reilly za korektę)
źródło
undefined
display='none'
, to nie zadziała.