2015-08-02 28 views
6

Wątpliwości dotyczące animacji CSS \ transform. Próbuję zrozumieć, animacje CSS i działa w następującej kwestii:Kierunek obrotu w animacji CSS Transformacja

Prosty div z animacją z nim związane w CSS jak poniżej

<div id="learn">LEARN</div> 

    #learn { 
    width : 100px; 
    height : 100px; 
    background : blue; 
    position : relative; 
    animation: test1 5s ease-in 2s infinite; 
    } 

Przypadek 1:

@keyframes test1 { 
    0% { 
    transform: rotate(179deg); 
    } 
    100% { 
    transform: rotate(357deg); 
    } 
    } 

Przypadek 2 (transformacja 0% podzielona jest na 90 + 89 st. Zamiast 179):

@keyframes test1 { 
0% { 
transform: rotate(90deg) rotate(89deg); 
} 
100% { 
transform: rotate(357deg); 
} 
} 

Dlaczego pierwszy przypadek obraca się zgodnie z ruchem wskazówek zegara, a drugi przypadek obraca się przeciwnie do ruchu wskazówek zegara?

+0

Wierzę, że obraca się w kierunku, który ma najmniejszy kąt między początkową i końcową wartością okręgu (z 357 oczywiście będącymi -3 stopniami) –

+0

Nie jestem pewien, czy rozumiem. Mniejszy kąt w obu przypadkach jest zgodny z ruchem wskazówek zegara. –

+0

Jaka jest używana przeglądarka i jej wersja? Jestem na Chrome v38 (stary, ale nadal) i obie wersje obracają się zgodnie z ruchem wskazówek zegara. – Harry

Odpowiedz

1

Może to być po prostu błąd związany z przekształceniami rotacyjnymi, które opiszę po pewnym czasie.

Tło

Po pierwsze, sposób obroty są rzekomą do pracy jest w stosunku do okręgu. Jeśli określisz liczbę stopni, to umieścisz element w pozycji podyktowanej przez stopień obrotu określony przez stopnie. Gdy nie animujesz obrotu, istnieje wiele sposobów na przedstawienie położenia elementu. Kod Wyjątkowo jest w połowie komentarzem w tym, że umieszczenie 357 stopni i -3 stopni jest takie samo, ale podczas animowania są bardzo różne. Przechodzenie od 0 stopni do -3 stopni to mały obrót w lewo, podczas gdy przechodzenie od 0 stopni do 357 stopni jest dużym ruchem wskazówek zegara.

Ustalenia

Co znalazłeś wydaje się ignorować te obliczenia (zarówno w Firefox i Chrome od tego, co mam przetestowane). Z tego co widzę, łącząc rotate przekształca skutecznie odwraca kierunek że obrót powinny się dzieje w, nawet jeśli połączenie z 0deg obrotów:

transform: rotate(90deg); //rotates clockwise 
transform: rotate(0deg) rotate(90deg); //rotates counter-clockwise 

Wydaje się, że problem ten można rozwiązać poprzez "kombinacja" transformacji rotacji w obu etapach animacji:

// this performs a clockwise rotation 
@keyframes test3 { 
    0% { 
     transform: rotate(0deg) rotate(90deg); 
    }  
    100% { 
     transform: rotate(0deg) rotate(357deg); 
    } 
} 

Wreszcie wydaje się, że liczba "kombinacji" ma znaczenie. Jeśli połączyć 2 obroty w jednym etapie, ale 3 w innym, nieoczekiwane zachowanie występuje:

// rotates counter-clockwise since there are unequal rotation transforms 
@keyframes test4 { 
    0% { 
     transform: rotate(0deg) rotate(0deg) rotate(90deg); 
    } 
    100% { 
     transform: rotate(0deg) rotate(357deg); 
    } 
} 

Wnioski

To prawdopodobnie nie jest najlepsza odpowiedź, ale łącząc obroty tak właśnie robi” t wydaje się być udokumentowane w dowolnym miejscu. Sugerowałbym nie łączyć tych samych transformacji rotate (nadal można łączyć rotateX i rotateY bez tej dziwności) i trzymać się sumą wartości stopni.

Jeśli ktoś znajdujący to wyjaśnienie chce być może dowiedzieć się więcej o tym zachowaniu niż ja, oto fiddle z powyższymi przykładami jako punktem wyjścia.

+0

Właściwie to zaobserwowałem, próbując zrozumieć zachowanie "pływające w wodzie" osiągnięte dzięki wielokrotnym transformacjom. Następująca klatka kluczowa daje bardzo dobre "pływające" odczucie, z bardzo małymi liniami css. Nie mam pojęcia jak !!!. 0% {transform: rotate (0deg) translateX (0) translateY (1px) rotate (0deg)} 100% {transform: rotate (360deg) translateX (0) translateY (1px) rotate (-360deg)} Rozumiem w dół drift .... ale nie wiem, jak to się robi, że ruch od lewej do prawej –

+0

To całkiem fajna sztuczka. "Transformacje" w CSS3 mają interesującą mechanikę zastosowania "obracania" do innego punktu obrotu w zależności od poprzedniego tłumaczenia (tak więc porządek części transformacji odgrywa dużą rolę w tym, jak wygląda końcowa animacja). Sprawdź to [zaktualizowane skrzypce] (http://jsfiddle.net/r8vx5Lw8/1/), aby zobaczyć co mam na myśli. Pierwszy div obraca się na środku, drugi obraca się w oparciu o 'translateX', trzeci oparty jest na' translateX' i 'translateY', a ostatni jest trzecim bez dodatkowego ruchu (testowany w Chrome). –

+0

Miło widzieć to. Ale myślę, że różnica w zachowaniu między div2 i div3 jest taka, że ​​obrót "net" 100% stanu w div2 to 360deg, co daje rotację również na własnej osi. Obrót netto o 100% w dziale 3 wynosi 0 stopni. Więc nie ma rotacji osiowej. Ale dlaczego znowu "cały div" podążał spiralną ścieżką, by osiągnąć stan końcowy? –