Mam element DOM z zastosowanymi niektórymi / wszystkimi następującymi efektami:
#elem {
-webkit-transition: height 0.4s ease;
-moz-transition: height 0.4s ease;
-o-transition: height 0.4s ease;
transition: height 0.4s ease;
}
Piszę wtyczkę jQuery, która zmienia rozmiar tego elementu, muszę tymczasowo wyłączyć te efekty, aby móc płynnie zmieniać rozmiar.
Jaki jest najbardziej elegancki sposób tymczasowego wyłączenia tych efektów (a następnie ich ponownego włączenia), biorąc pod uwagę, że można je zastosować od rodziców lub w ogóle nie można zastosować.
javascript
jquery
css
Sam Saffron
źródło
źródło
.notransition
klasy. Rozsądniej byłoby zrobić to na odwrót, tj. Celować za#elem.yestransition
pomocą css i usunąć tę klasę. To usuwa nieprzyjemne*
s w twoim css.Odpowiedzi:
Krótka odpowiedź
Użyj tego CSS:
Plus ten JS (bez jQuery) ...
Lub ten JS z jQuery ...
... lub równoważny kod przy użyciu dowolnej innej biblioteki lub frameworka, z którym pracujesz.
Wyjaśnienie
To właściwie dość subtelny problem.
Po pierwsze, prawdopodobnie chcesz utworzyć klasę „notransition”, którą możesz zastosować do elementów, aby ustawić ich
*-transition
atrybuty CSSnone
. Na przykład:(Drobny na bok - zauważ brak
-ms-transition
tam. Nie potrzebujesz go. Pierwszą wersją Internet Explorera do obsługi przejść w ogóle była IE 10, która obsługiwała je bez prefiksu).Ale to tylko styl i to jest łatwe. Kiedy spróbujesz skorzystać z tej klasy, wpadniesz w pułapkę. Pułapka polega na tym, że taki kod nie będzie działał w sposób, jakiego można naiwnie oczekiwać:
Naiwnie możesz pomyśleć, że zmiana wysokości nie będzie animowana, ponieważ dzieje się tak, gdy stosowana jest klasa „notransition”. Jednak w rzeczywistości będzie animowany, przynajmniej we wszystkich nowoczesnych przeglądarkach, które wypróbowałem. Problem polega na tym, że przeglądarka buforuje zmiany stylu, które musi wprowadzić, aż JavaScript zakończy wykonywanie, a następnie dokonuje wszystkich zmian w jednym przepływie. W wyniku tego następuje ponowne wlanie, w którym nie ma zmiany siatki określającej, czy przejścia są włączone, ale występuje zmiana wysokości netto. W związku z tym animuje zmianę wysokości.
Można pomyśleć, że rozsądnym i czystym sposobem na obejście tego byłoby ominięcie usunięcia klasy „notransition” w czasie 1 ms, jak poniżej:
ale to też nie działa niezawodnie. Nie udało mi się złamać powyższego kodu w przeglądarkach WebKit, ale w Firefoksie (zarówno na powolnych, jak i szybkich komputerach) czasami (pozornie przypadkowo) dostajesz takie samo zachowanie jak naiwne podejście. Wydaje mi się, że powodem jest to, że wykonanie JavaScript może być na tyle powolne, że funkcja limitu czasu czeka na wykonanie do czasu, gdy przeglądarka jest bezczynna, i w przeciwnym razie pomyślałaby o oportunistycznym przepełnieniu, a jeśli tak się stanie, Firefox wykonuje funkcję w kolejce przed ponownym zalaniem.
Jedynym rozwiązaniem, jakie znalazłem dla tego problemu, jest wymuszenie ponownego wlewania elementu, opróżnienie dokonanych w nim zmian CSS, przed usunięciem klasy „notransition”. Można to zrobić na wiele sposobów - zobacz tutaj . Najbliższą „standardową” metodą jest odczytanie
offsetHeight
właściwości elementu.Jednym z faktycznie działających rozwiązań jest
Oto skrzypce JS, które ilustrują trzy możliwe podejścia, które tu opisałem (zarówno jedno udane, jak i dwa nieudane): http://jsfiddle.net/2uVAA/131/
źródło
Zalecałbym wyłączenie animacji zgodnie z sugestią DaneSoul, ale uczynienie przełącznika globalnym:
.notransition
można następnie zastosować dobody
elementu, skutecznie zastępując dowolną animację przejścia na stronie:źródło
Dodaj dodatkową klasę CSS, która blokuje przejście, a następnie usuń ją, aby powrócić do poprzedniego stanu. Dzięki temu zarówno kod CSS, jak i kod JQuery są krótkie, proste i zrozumiałe.
CSS :
!important
dodano, aby mieć pewność, że ta reguła będzie miała większą „wagę”, ponieważ ID jest zwykle bardziej szczegółowe niż klasa.JQuery :
źródło
Dla czystego roztworu JS (bez klas CSS), po prostu ustawić
transition
się'none'
. Aby przywrócić przejście określone w CSS, ustawtransition
pusty ciąg.Jeśli korzystasz z prefiksów dostawców, musisz je również ustawić.
źródło
Za pomocą tego kodu css możesz wyłączyć animację, przejścia, przekształcanie wszystkich elementów na stronie
źródło
Myślę, że możesz utworzyć osobną klasę css, której możesz użyć w następujących przypadkach:
Następnie w jQuery przełączałbyś klasę tak:
źródło
Jeśli potrzebujesz prostego rozwiązania eliminującego jquery, aby zapobiec wszystkim przejściom:
źródło
Jeśli chcesz usunąć przejścia, transformacje i animacje CSS z bieżącej strony, możesz po prostu wykonać ten mały skrypt, który napisałem (w konsoli przeglądarki):
Do załadowania tego pliku css używa vanillaJS . Oto także repozytorium github na wypadek, gdybyś chciał użyć go w kontekście skrobaka (Ruby-Selenium): remove-CSS-animations-repo
źródło
robi
w twoich js zabij to?
oczywiście powtórz dla każdego.
źródło
Miałbym klasę w twoim CSS w ten sposób:
a następnie w jQuery:
źródło
#elem.no-transition
w CSS, właśnie kierowane.no-transition
. Być może chciałeś napisać#elem.no-transition
w swoim CSS?