**{{ :krouzek:animace_priklady.zip | Příklady kódu v archivu ZIP}}** Cíl: Ukázat dva způsoby jak animovat Před Vánoci jsme si ukázali pozicování - vnější kontejner(div) má position: relative a rozměry (width, height) a vnitřní div (reprezentující třeba autíčko) má position: absolute (a menší rozměry a třeba background-color). Vnitřní div potom pozicujeme pomocí ''%%top%%'' a ''%%left%%'' css vlastností - pozor, určuje pozici levého horního rohu, nikoliv středu. * Ukázat ten pozicovací příklad a jak změny top a left (v css) ovlivňují pozici autíčka. Jak jde autíčko rozpohybovat? === Možnost 1 - CSS animace === @keyframes nazev_animace { _cas_ { _deklarace_vlastnosti_ } _cas_ { _deklarace_vlastnosti_ } } #auticko { animation: _nazev_animace_ _cas_trvani_ _casova_funkce_prubehu_ _zpozdeni_ _pocet_opakovani_ _smer_prubehu_ _fill_mode_ (,_dalsi_animace_); } * https://www.vzhurudolu.cz/prirucka/css3-animations * reference: https://www.w3schools.com/css/css3_animations.asp * Příklad: pozicovani_css_anim.htm Vyzkoušet: * Ruzne timing funkce (průběhy): ease, linear, ease-in, ease-out, cubic-bezier(.07,.85,.92,.37) * generátor: https://cubic-bezier.com/#.07,.85,.92,.37 * více keyframes (používají se 0%, 5%, ... 100% v _cas_ (v příkladu mám from(=0%), to(=100%) * animace dalších atributů: opacity, background-color, textové atributy (font-size atp - na jiném příkladu) * změna počtu opakování, zpoždění === Možnost 2 - Javascript === (to už jsme v nějaké formě dělali) Javascript a 'simulační smyčka' = v intervalech aktualizujeme atributy přímo. Využijeme k tomu setTimeout v rekurzi, nebo setInterval let x = 0; let y = 0; setInterval( function(){ // Pohyb - může být i v závislosti na stiknutých klávesách, zprávě od serveru, atp. x += 1 y += 2 // Aktualizace vzhledu document.getElementById('objekt1').style.left = x+'px' document.getElementById('objekt1').style.top = y+'px' }, 1000/60 ) Možné nahradit funkcí requestAnimationFrame (v rekurzi) - browser sám si volí vhodný fps v závislosti na výkonnosti zařízení, atp. let x = 0; let y = 0; function vykresli(){ // Pohyb - může být i v závislosti na stiknutých klávesách, zprávě od serveru, atp. x += 1 y += 2 // Aktualizace vzhledu document.getElementById('objekt1').style.left = x+'px' document.getElementById('objekt1').style.top = y+'px' // Zavolani nasledujiciho vykresleni requestAnimationFrame(vykresli) } // prvni zavolani requestAnimationFrame(vykresli) Pozor - všechny tyhle volání délku intervalu negarantují. Pokud chci animaci přesnou (například hra aby byla pro všechny spravedlivá), musím při počítání pohybu zohlednit čas (Date() - previous_date) Diskuse: výhody a nevýhody obou přístupů? Možnosti kombinace?