2013-08-01 32 views
12

Mam problem z googlowaniem, ponieważ większość rzeczy, które mogę znaleźć, to animacje, które powinny działać szybko, ale działają powoli. Moje pytanie dotyczy animacji, która ma trwać długo, ale nadal jest gładka.Dlaczego powolne animacje jQuery są niestabilne?

Utworzyłem ten jsfiddle do wykazania problem: http://jsfiddle.net/93Bqx/

próbuję uczynić elementem powoli przejść do innej pozycji w czasie. Ale animacja jest bardzo niepewna.

Zasadniczo sprowadza się do mniej więcej tak:

$elem.animate({ 
     left: x, 
     top: y 
}, someLargeNumber); 

Zastanawiam się, czy problem jest to, że animacja jest tak powolny, że każdy krok jest mniejszy niż jeden piksel, a więc jest ich zaokrąglania albo 0 albo 1 sprawiając, że wydaje się, że upuszcza klatki, a następnie przesuwa się wszystkie naraz. Ale nie wiem, jak to sprawdzić lub naprawić.

Czy jest lepszy sposób na robienie powolnych animacji, aby były płynne? Miałem podobną, stworzoną z CSS3 i tłumaczącą (x, y), która była gładka, ale niestety potrzebuję więcej elastyczności, niż sądzę, że mogę uzyskać z CSS.

+2

dobrze przeczytać na temat: http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/ – Yoshi

+0

@ Yoshi, dziękuję!Dokładnie to, co mnie zainteresowało. Czy możesz to opublikować jako odpowiedź, abym mógł ją zaakceptować? –

Odpowiedz

5

To nie jest dużo gładsza nawet przy użyciu przejścia CSS.

Dodałem Transit jQuery plugin, aby przetestować przejście CSS, i wygląda prawie tak samo.

Kod z drobnych poprawek: http://jsfiddle.net/thirtydot/93Bqx/5/

samego kodu, ale z tranzytem dodania: http://jsfiddle.net/thirtydot/93Bqx/6/.

Myślę, że jest to ograniczenie faktu, że (większość?) Przeglądarek nie wykonuje renderowania subpikselowych. Jak wspomniałeś, element x i y jest zaokrąglany po każdym kroku animacji, a to zaokrąglenie powoduje brzydki efekt "poruszenia".

Wersja przejściowa CSS wygląda wyraźnie lepiej w przypadku mniej patologicznych przypadków testowych. Przeczytaj to, aby uzyskać więcej informacji: http://www.paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/

+5

Nigdy o tym nie słyszałem; Będę musiał zajrzeć do tej wtyczki. Dzieki za sugestie! Spojrzałem na dokumenty i zmieniłem je z animowania właściwości górnych i dolnych bezpośrednio na użycie jego natywnego x/y i jest dużo gładsze (ale dziwnie nieco chwiejne) http://jsfiddle.net/XSEd8/ –

+0

Aktualizacja: I działa to teraz w moim prawdziwym kodzie i jest świetne. +1 dla jquery.transit. Jedyny problem, na który natknąłem się, to brak sposobu na zatrzymanie przejścia, ale znalazłem [rozwidlenie kodu] (https://github.com/tblasv/jquery.transit), który dodaje tę funkcję. –

+0

Dobrze wiedzieć. Myślę, że z grubsza, im wolniejszy jest komputer, tym bardziej ulepszenie zapewni wersja przejściowa CSS. Ponadto, nie sądzę, że powinieneś zaakceptować moją odpowiedź (jeśli planowałeś) jeszcze. Daj mu trochę więcej czasu i zobacz, czy pojawi się lepsza odpowiedź. – thirtydot

7

Domyślam się, że jest to nieunikniona okazja przy programowej animacji. Może spróbuj ramy specjalizuje się w animacji jak:

http://www.greensock.com/gsap-js/

ale dostosowanie animacji CSS byłoby najlepsze.

+3

Tak, tutaj jest widelec używający GSAP GreenSocka z transformacjami zamiast top/left: http://jsfiddle.net/2LpgY/1/ W webkicie jest znacznie płynniej, ale Firefox używa innej techniki antyaliasingu, która wydaje się nie pasować renderowanie pod-pikseli. Tak więc trzydzieści dno ma rację, ponieważ jest to w niektórych przypadkach przeglądarka. Twierdzę również, że animacje CSS nie będą lepsze, szczególnie jeśli potrzebna jest ścisła kontrola - patrz http://www.greensock.com/why-gsap/ – Jack

0

Myślę, że ma to coś wspólnego z tym, jak często przesuwasz element. Na przykład, jeśli przesuniesz obiekt raz na sekundę, będzie wydawał się niepewny. Spróbuj zmniejszyć czas między kolejnymi ruchami, a także zmniejszyć odległość między poszczególnymi ruchami. Zobacz przykład http://jsfiddle.net/2K9xP/.

Więc mamy ...

var duration = Math.round(10 * distance); 

zamiast ...

var duration = Math.round(1000 * distance); 
+4

Chodzi o to, że obiekt porusza się powoli. To pudełko przybliża się jak w ekstazie. – thirtydot

+1

Chodzi o to, aby zademonstrować, że może poruszać się płynnie, jeśli ilość porusza się na klatkę jest wystarczająco wysoką wartością. Przesuwanie obiektu o 1 piksel co sekundę będzie wyglądało na wzburzone, ponieważ nasze oczy widzą więcej szczegółów (jak sądzę). –

+0

Również, jeśli mamy wyświetlacze o wyższej rozdzielczości, które mogłyby zaspokajać dokładniejsze pozycje, spowolniłoby to moją myśl. –

Powiązane problemy