25 seje CSS-animationseksempler til genskabelse

eksempel på css-animationsmus
(Billedkredit: Donovan Hutchinson)
Side 1 af 2: CSS animation tutorials

Brugt godt er CSS-animation et utroligt nyttigt og kraftfuldt værktøj. Det kan tilføje interesse eller kreativ spænding, rette brugerens øje, forklare noget hurtigt og kortfattet og forbedre brugervenligheden. Af den grund har de seneste år set mere og mere animation på websteder og i app.

I denne artikel afrunder vi nogle af de sejeste CSS-animationseksempler, vi har set, og viser dig, hvordan du genskaber dem. Læs videre for en række dybdegående tutorials og inspirerende effekter (og links til deres kode) at udforske.

Hvad er CSS-animation?

CSS-animation er en metode til at animere bestemte HTML-elementer uden at skulle bruge processor og hukommelsesstærk JavaScript eller Flash. Der er ingen grænse for antallet eller hyppigheden af ​​CSS-egenskaber, der kan ændres. CSS-animationer initieres ved at angive nøglerammer til animationen: disse nøglerammer indeholder de stilarter, som elementet har.



Mens det kan synes begrænset, når det kommer til animation, er CSS faktisk et virkelig kraftfuldt værktøj og er i stand til at producere smukt glatte 60fps-animationer. 'At levere tankevækkende, flydende animationer, der bidrager med meningsfuld dybde til dit websted, behøver ikke være svært,' siger frontend webudvikler Adam Kuhn. 'Moderne CSS-egenskaber giver dig nu næsten alle de værktøjer, du har brug for for at skabe mindeværdige oplevelser for dine brugere.'

De bedste animationer har stadig deres rødder i Disneys klassiker 12 principper for animation - du vil se flere omtaler af det gennem disse CSS-animationseksempler, så det er værd at tjekke den artikel, før du kommer i gang. Det kan også være en god idé at udforske vores store samling animerede musikvideoer for yderligere eksempler og inspiration.

Den gyldne regel er, at dine CSS-animationer ikke skal overblæses - selv en lille bevægelse kan have stor indflydelse, og for meget kan være distraherende og irriterende for brugerne. Her er vores yndlingseksempler, og hvordan man genskaber dem.

01. Sjov museffekt

Dette er en sjov effekt, der følger musen rundt. Det kan være nyttigt, når du vil henlede opmærksomheden på et element på din side.

Vi har brug for meget lidt HTML til denne effekt:

Først placerer vi demoen og sætter perspektiv for vores 3D-transformation:

.demo { background-color: hsl(207, 9%, 19%); display: flex; align-items: center; justify-content: center; height: 100vh; width: 100%; } .perspective-container { perspective: 800px; }

Stil derefter den div, vi vil animere:

.card { background-image: url(https://media.giphy.com/media/sIIhZliB2McAo/giphy.gif); background-size: cover; box-shadow: 0 0 140px 10px rgba(0,0,0,.5); position: relative; height: 300px; width: 500px; overflow: hidden; /* Try removing this to see how the sheen works! */ --sheenX: 0; /* Set these with JavaScript */ --sheenY: 0; }

Her sætter vi en baggrund, så sætter vi flyde over til skjult så vi kan tilføje en glans senere. Vi sætter også css-variabler , sheenX og glans .

Disse glansvariabler hjælper med at placere glanseffekten. Vi bruger dem i vores kort efter pseudo-element:

.card::after { content: ''; position: absolute; top: -400px; right: -400px; bottom: -400px; left: -400px; background: linear-gradient(217deg, rgba(255,255,255,0), rgba(255,255,255,0) 35%, rgba(255,255,255,0.25) 45%, rgba(255,255,255,.25) 50%, rgba(255,255,255,0) 60%, rgba(255,255,255,0) 100%); transform: translateX(var(--sheenX)) translateY(var(--sheenY)); }

Her sørger vi for, at pseudo-elementet er større end containeren. Dette vil give os noget at glide rundt oven på kort ved brug af transformere .

Det transformere egenskab gør brug af de CSS-variabler, vi har indstillet tidligere. Vi indstiller dem med JavaScript. Lad os indstille JavaScript til først at lytte efter musebegivenheder:

document.onmousemove = handleMouseMove;

Vi har nu brug for en handleMouseMove funktion til håndtering onmousemove :

function handleMouseMove(event) { const height = window.innerHeight; const width = window.innerWidth; // Creates angles of (-20, -20) (left, bottom) and (20, 20) (right, top) const yAxisDegree = event.pageX / width * 40 - 20; const xAxisDegree = event.pageY / height * -1 * 40 + 20; target.style.transform = `rotateY(${yAxisDegree}deg) rotateX(${xAxisDegree}deg)`; // Set the sheen position setSheenPosition(event.pageX / width, event.pageY / width); }

Vores funktion tager vindueshøjde og bredde og skaber en vinkel på X- og Y-akserne. Vi indstiller disse derefter til transformere stil af vores kort . Dette giver kortet en vinkel baseret på musen!

Vi kalder derefter en funktion for at indstille pseudoelementets position:

function setSheenPosition(xRatio, yRatio) { // This creates a 'distance' up to 400px each direction to offset the sheen const xOffset = 1 - (xRatio - 0.5) * 800; const yOffset = 1 - (yRatio - 0.5) * 800; target.style.setProperty('--sheenX', `${xOffset}px`) target.style.setProperty('--sheenY', `${yOffset}px`) }

Vores pseudo-element ser bedst ud, når det bevæger sig i den modsatte retning af musen. For at opnå dette opretter vi et tal mellem -0,5 og 0,5, der ændres i den modsatte retning ved at beregne forholdet med -1.

Vi gange dette tal med 800, da vi ønsker, at det skaleres op til et maksimum på 400px , hvor langt vi indstiller glans pseudo-element uden for kort .

Endelig indstiller vi disse offsetværdier til vores CSS-variabelejendomme, og browserens renderer gør resten.

Vi har nu et kort, der vender mod vores mus, mens glanseffekten bevæger sig i den modsatte retning ovenpå. Dette skaber en dejlig, iøjnefaldende effekt.

02. Den store afsløring

  • Forfatter: Adam Kuhn

Animeret indhold afslører effekter synes at være ret populære lige nu, og brugt korrekt kan de fange brugerfokus og engagere dit publikum. Du har set dette før: en farveblok vokser fra den ene eller den anden side vandret eller lodret og trækker sig derefter tilbage til den modsatte side, denne gang afslører en eller anden tekst eller et billede nedenunder. Det er et koncept, der kan virke vanskeligt, men som virkelig er afhængig af nogle få ting.

Først konfigurerer vi vores elementpositionering ( download den fulde kode her ) - definer det som relativ (kun statisk mislykkes i dette tilfælde). I tekst tilfælde er det bedst at tillade automatisk højde og bredde, selvom lidt polstring ikke gør ondt. Vi definerer også en transformationsoprindelse i tilfælde af det overordnede element, vi vil bruge startpositionen. Da vi oprindeligt vil have elementet skjult, bruger vi en skalatransformation langs den passende akse til at krympe det.

Dernæst et pseudo-element, der maskerer vores forælder, og indstiller transformationsoprindelsen til den modsatte mulighed. Til sidst strammer du animationerne sammen ved hjælp af enten timingfunktionerne eller forsinkelserne for at udligne hver.

Bemærk, vi har udlignet forælder- og pseudo-elementets animationer med en forsinkelse, der fortæller boksen, der skjuler vores tekst, for kun at afsløre den, når selve elementet er fuldt skaleret til visning. Tjek Codepen nedenfor.

03. Stag videre

  • Forfatter: Adam Kuhn

Når du først er begyndt at samle et anstændigt bibliotek med forskellige lempelige uddrag, er det tid til at se på andre måder at forbedre dybden af ​​dine animationer, og en af ​​de bedste måder er at udligne dine animerede elementer.

Det er alt for almindeligt, at en JavaScript-trigger er indstillet til at starte en masse animationer baseret på rulleposition, kun for at finde alle elementer, der bevæger sig effektivt i tandem. Heldigvis giver CSS i sig selv en simpel egenskab, der kan gøre (eller bryde) din animerede oplevelse: animationsforsinkelse .

Lad os sige, for eksempel, at vi har et gitter med billeder, som vi vil animere i rammen, når brugeren ruller. Der er en række måder, vi kan udløse dette på, sandsynligvis tilføje klasser til elementerne, når de kommer ind i visningen. Dette kan dog være en ganske tung løft i browseren og kan undgås ved blot at tilføje en enkelt klasse til et containerelement og definere animationsforsinkelser på underordnede elementer.

Dette er en særlig god brugssag til forprocessorer som SCSS eller LESS, som giver os mulighed for at bruge en @til løkke for at gentage gennem hvert element.

#parent{ .child{ animation: animationName 1.5s ease-in-out 1 forwards; @for $i from 1 through 20{ &:nth-of-type(#{$i}){ animation-delay:#{$i/10}s; } } } }

Her ser du med SCSS, at vi er i stand til at løbe gennem hver : n-type vælger, og anvend derefter en animationsforsinkelse baseret på hvert underordnede elements numeriske værdi. I dette tilfælde vil du bemærke, at vi deler vores timing for at reducere hvert trin til en brøkdel af et sekund. Mens modregning af dine animerede elementer kan give følelser til din animation, kan for meget forsinkelse få det til at føles adskilt. Tjek denne CodePen nedenfor.

04. Squigglevision

  • Forfatter: Adam Kuhn

SVG-filtre giver en fantastisk måde at opnå en naturlig, håndtegnet følelse og undslippe nogle af de flade følelser, der gengiver begrænsninger af CSS alene. Animering af dem kan yderligere forbedre effekten.

Eksempel: Squigglevision. Ja, dette er ikke et teknisk udtryk, som de fleste animatorer kender, men du har helt sikkert set det bruges i tegnefilm. Ideen er, at kanterne på disse animerede elementer ikke kun er noget hakket og groft hugget, men disse ru kanter varierer hurtigt, ramme for ramme, hvilket får dem til at føles som om de er blevet revet fra siderne i en skitsebog og bragt til liv.

For at opnå denne effekt kan vi inkludere en SVG på vores side med flere filtre og små variationer i turbulensniveauer for hver. Derefter opretter vi vores animationstidslinje og kalder hvert filter i sin egen nøgleramme. Det er vigtigt at lege med timingvarigheden, da vi forventer, at animationen vil føle sig 'hoppende', men ikke vil have den så langsom at føle sig uadskilt eller så hurtig at føle sig skør.

Til det formål er det vigtigt at bemærke, at CSS mangler evnen til glat overgang mellem SVG-filtre, da der ikke er nogen måde at få adgang til egenskaber såsom turbulens og skala, så disse typer animationer bør altid forventes at være urolige.

05. Tumbling bogstaver

CSS-animation: tumlende bogstaver

Googles Game of the Year har en legende CSS-animation på hjemmesiden, hvor titelordene tumler og støder ind i hinanden. Her er hvordan det blev gjort.

Det første trin er at definere websidedokumentet med HTML. Den består af HTML-dokumentbeholderen, der gemmer en hoved- og kropssektion. Mens hovedsektionen bruges til at indlæse de eksterne CSS- og JavaScript-ressourcer, bruges kroppen til at gemme sideindholdet.

Off Kilter Text Animation

The Animated Title

The Animated Title

The Animated Title

Sideindholdet består af tre h1-titeltags, der viser de forskellige variationer af animationseffekten. Mens enhver tekst kan indsættes i disse tags, defineres deres animation af navnene i klasseattributten. Præsentations- og animationsindstillingerne for disse klassenavne vil blive defineret i CSS senere.

Opret derefter en ny fil kaldet ' code.js '. Vi ønsker at finde alle sideelementer med Animeret klasse og oprette en array liste, der repræsenterer hvert ord i den indre tekst. Den indledende animationsforsinkelse defineres også i dette trin. Sideindhold er ikke tilgængeligt, før siden er fuldt indlæst, så denne kode placeres inde i vinduets belastning begivenhedslytter.

Ordindholdet i animationselementerne skal indeholde en spændvidde element. For at gøre dette nulstilles det eksisterende HTML-indhold til tomt, hvorefter en sløjfe bruges til at gøre ordet i den identificerede 'ord' -liste til et span-element. Derudover an animationDelay stil anvendes - beregnet i forhold til den indledende forsinkelse (specificeret nedenfor) og ordets indeksposition.



window.addEventListener('load', function(){ var delay = 2; var nodes = document.querySelectorAll ('.animate'); for(var i=0; i

Opret en ny fil kaldet styles.css . Nu indstiller vi præsentationsreglerne, der vil være en del af hvert ordelement i animationen, styret af deres span-tag. Visning som blok kombineret med centreret tekstjustering vil resultere i, at hvert ord vises på en separat linje vandret justeret til midten af ​​sin container. Relativ positionering vil blive brugt til at animere i forhold til dens tekst-flow position.

.animate span{ display: block; position: relative; text-align: center; }

Animationselementer, der har klassen baglæns og fremad, har en bestemt animation anvendt på dem. Dette trin definerer den animation, der skal anvendes på spændingselementer, hvis overordnede container har begge Animeret og tilbage eller fremad klasse.

Bemærk, hvordan der ikke er noget mellemrum mellem Animeret og tilbage klassereference, hvilket betyder, at det overordnede element skal have begge dele.

.animate.backwards > span{ animation: animateBackwards 1s ease-in-out forwards; } .animate.forwards > span{ animation: animateForwards 1s ease-in-out forwards; }

Den blandede animation defineres ved hjælp af de samme indstillinger, der bruges til fremad og bagudgående animationer. I stedet for at anvende animationerne på hvert barn af forældrene, niende barn vælgeren bruges til at anvende skiftende animationsindstillinger. Den bagudgående animation anvendes på alle også selvom -nummer barn, mens den fremadgående animation anvendes på alle ulige -antal barn.

.animate.mixed > span:nth-child(even){ animation: animateBackwards 1s ease-in-out forwards; } .animate.mixed > span:nth-child(odd){ animation: animateForwards 1s ease-in-out forwards; }

De animationer, vi lige har oprettet, er lavet med en initial ' fra startposition uden lodret position eller rotation. Det ' til 'position er den endelige tilstand af animationen, som sætter elementerne med en justeret lodret position og rotationstilstand. Lidt forskellige slutningsindstillinger bruges til begge animationer for at undgå, at teksten bliver uleselig på grund af overlapning i blandede animationer.

@keyframes animateForwards { from { top: 0; transform: rotate(0deg); } to { top: .9em; transform: rotate(-15deg); } } @keyframes animateBackwards { from { top: 0; transform: rotate(0deg); } to { top: 1em; transform: rotate(25deg); } }

06. Flip book

  • Forfatter: Adam Kuhn

Når man animerer med CSS, er det sommetider nødvendigt med en død enkel tilgang. Og der er få enklere animationsmetoder end flip-bogen. Ved brug af trin () som vores timing-funktion er vi i stand til at replikere denne effekt. Selvom dette måske lyder hakket og direkte modsiger vores mission om at opretholde fluiditet, kan det med den rette tempo føles lige så problemfrit organisk.

Så hvordan fungerer det? Vi definerer vores animationsfunktionsfunktion med blot nogle få yderligere parametre - fortæller vores animation, hvor mange trin der er behov for, og på hvilket tidspunkt i det første trin, vi gerne vil begynde (start, slut) - ser f.eks. Lidt sådan ud trin (10, start) .

Inden for vores nøglerammer kan vi nu udpege et slutpunkt på vores animation: Lad os i dette eksempel antage, at vores animation er 10 sekunder lang, og vi bruger 10 trin. I dette tilfælde vil hvert trin være ét sekund langt og straks flytte til den følgende ramme på et sekund uden overgang imellem.

Igen ser det ud til at flyve over for fluiditet, men her er trinede animationer virkelig kan skinne. Vi kan trinvist gentage gennem et sprite-ark og animere ramme-for-ramme ligesom en flip-bog. Ved at definere rammer af samme størrelse, men kompilere dem på et enkelt vandret (eller lodret) billede, kan vi indstille dette billede som elementbaggrund og definere en pixel eller procent baggrundsposition som et slutpunkt til vores animation, hvilket tillader et enkelt trin for hver ramme. Sprite-arket skifter derefter og udfylder elementet ramme for ramme med et nyt baggrundsbillede baseret på dets position.

Lad os se på et eksempel. I dette tilfælde er nogle sæt animerede ben vedhæftet nogle teksttegn. Først definerer vi vores animationsnavn, varighed, trinoptælling, startposition og iterationstælling:

animation:runner 0.75s steps(32, end) infinite;

Igen skal du bemærke, at varigheden er relativt hurtig på mindre end et helt sekund for 32 rammer i alt. Dernæst definerer vi vores nøglerammer:

@keyframes runner{ from{ background-position:0px 50%;} to{ background-position:- 1280px 50%; }}

Bemærk, at billedets lodrette placering er konsistent overalt, hvilket fortæller os, at sprites er vandret strakt over billedet, hvilket er 1280 px i total bredde. Da vi har defineret 32 ​​rammer i alt for det billede, kan vi udlede, at hver ramme skal være 40 px bred. Tjek dette Codepen nedenfor.

Det er vigtigt at bemærke, at et stort sprite ark potentielt kan være en alvorlig træk på ydeevnen, så sørg for at størrelse og komprimere billeder. Med et godt udformet sprite-ark og en passende animationsvarighed har du nu en jævn animation, der er i stand til at formidle komplekse bevægelser.

07. Blæser bobler

CSS-bobleanimationen, der findes på 7UP, er et smukt eksempel på at gennemføre et mærketema ind på webstedsdesignet. Animationen består af et par elementer: SVG 'tegning' af boblerne og derefter to animationer anvendt på hver boble.

Den første animation ændrer boblens opacitet og flytter den lodret i visningsfeltet; det andet skaber den woblende effekt for ekstra realisme. Forskydningerne håndteres ved at målrette mod hver boble og anvende en anden varighed og forsinkelse af animationen.

For at skabe vores bobler bruger vi SVG . I vores SVG opretter vi to lag bobler: et til de større bobler og et til de mindre bobler. Inde i SVG placerer vi alle vores bobler i bunden af ​​visningsboksen.

... ...

For at anvende to separate animationer på vores SVG'er, begge ved hjælp af transform-egenskaben, er vi nødt til at anvende animationerne på separate elementer. Det element i SVG kan bruges ligesom en div i HTML; vi er nødt til at pakke hver af vores bobler (som allerede er i en gruppe) i et gruppemærke.

CSS har en kraftfuld animationsmotor og virkelig enkel kode for at producere komplekse animationer. Vi starter med at flytte boblerne op på skærmen og ændre deres opacitet for at falme dem ind og ud i begyndelsen og slutningen af ​​animationen.

@keyframes up { 0% { opacity: 0; } 10%, 90% { opacity: 1; } 100% { opacity: 0; transform: translateY(-1024px); } }

For at skabe en wobbling-effekt er vi simpelthen nødt til at flytte (eller oversætte) boblen til højre og lige med den rigtige mængde - for meget får animationen til at se for jævne ud og frakoblet, mens for lidt for det meste går ubemærket hen. Eksperimentering er nøglen til, når du arbejder med animation.

@keyframes wobble { 33% { transform: translateX(-50px); } 66% { transform: translateX(50px); } }

For at anvende animationen på vores bobler bruger vi de grupper, vi brugte tidligere og hjælp fra n-type at identificere hver boblegruppe individuelt. Vi starter med at anvende en opacitetsværdi på boblerne og vil ændre sig ejendom for at udnytte hardwareacceleration.

.bubbles-large > g { opacity: 0; will-change: transform, opacity;} .bubbles-large g:nth-of-type(1) {...} ... .bubbles-small g:nth-of-type(10) {...}

Vi ønsker at holde alle animationstider og forsinkelser inden for et par sekunder fra hinanden og indstille dem til at gentage det uendeligt. Endelig anvender vi let ind-ud timing funktion til vores wobble animation for at få den til at se lidt mere naturlig ud.

.bubbles-large g:nth-of-type(1) { animation: up 6.5s infinite; } .bubbles-large g:nth-of-type(1) circle { animation: wobble 3s infinite ease-in-out; } ... bubbles-small g:nth-of-type(9) circle { animation: wobble 3s 275ms infinite ease-in-out; } .bubbles-small g:nth-of-type(10) { animation: up 6s 900ms infinite;}

08. Rulende mus

En subtil rullende museanimation kan give brugeren retning, når de først lander på et websted. Selvom dette kan opnås ved hjælp af HTML-elementer og egenskaber, skal vi bruge SVG, da dette er mere egnet til at tegne.

Inde i vores SVG har vi brug for et rektangel med afrundede hjørner og en cirkel til det element, vi skal animere. Ved at bruge SVG kan vi skalere ikonet til den størrelse, vi har brug for.

Nu har vi oprettet vores SVG, vi er nødt til at anvende nogle enkle stilarter for at kontrollere ikonets størrelse og placering i vores container. Vi har pakket et link omkring SVG'en til musen og placeret det nederst på skærmen.

.scroll-link { position: absolute; bottom: 1rem; left: 50%; transform: translateX(-50%); } .mouse { max-width: 2.5rem; width: 100%; height: auto; }

Derefter opretter vi vores animation. Ved 0 og 20 procent af vejen gennem vores animation ønsker vi at indstille tilstanden for vores element, når det begynder. Ved at indstille den til 20% af vejen igennem forbliver den stille en del af tiden, når den gentages uendeligt.

@keyframes scroll { 0%, 20% { transform: translateY(0) scaleY(1); } }

Vi er nødt til at tilføje uigennemsigtigt startpunkt og derefter transformere både Y-positionen og den lodrette skala ved 100% -mærket, slutningen af ​​vores animation. Den sidste ting, vi skal gøre, er at droppe uigennemsigtigheden for at falme vores cirkel ud.

@keyframes scroll { ... 10% { opacity: 1; } 100% { transform: translateY(36px) scaleY(2); opacity: 0.01; } }

Endelig anvender vi animationen på cirklen sammen med egenskaben 'transform-origin' og vil ændre sig egenskab for at tillade hardwareacceleration. Animationsegenskaberne er ret selvforklarende. Det kubisk-bezier timing-funktion bruges til først at trække cirklen tilbage, før den falder til bunden af ​​vores museform; dette tilføjer en legende fornemmelse til animationen.

.scroll { animation-name: scroll; animation-duration: 1.5s; animation-timing-function: cubic-bezier(0.650, -0.550, 0.250, 1.500); animation-iteration-count: infinite; transform-origin: 50% 20.5px; will-change: transform; }

09. Animeret skrivning

CSS-animationer: skrivning

Klik for at se animationen i aktion

Garden Eight-webstedet bruger en almindelig animationsteknik, hvorved tekst ser ud til at blive skrevet ud. For at opnå effekten vender vi os til SVG. Til at begynde med opretter vi SVG. Der er to tilgange her: konverter teksten til stier for at animere dem eller brug SVG-tekst. Begge tilgange har deres fordele og ulemper.

Start med at oprette vores keyframe-animation. Den eneste funktion, vi har brug for for at udføre, er at ændre slagtilfælde-dashoffset . Nu har vi oprettet vores animation, og vi skal anvende de værdier, vi vil animere fra. Vi indstiller slagtilfælde-dasharray , som vil skabe huller i slagtilfælde. Vi ønsker at indstille vores slagtilfælde til at være en stor nok værdi til at dække hele elementet og endelig udligne bindestreg med længden af ​​slaglængden.

Magien sker, når vi anvender vores animation. Ved at animere forskydningen bringer vi streget til syne - hvilket skaber en tegningseffekt. Vi ønsker, at elementerne tegner et ad gangen, med en vis overlapning mellem slutningen af ​​at tegne det ene element og begynder at tegne det næste. For at opnå dette henvender vi os til Sass / SCSS og n-type at forsinke hvert bogstav med halv længden af ​​animationen ganget med placeringen af ​​det pågældende bogstav.

10. Flyvende fugle

Vi starter med helt lige vektorlinjer, der tegner hver enkelt ramme i vores animation og skildrer fuglen i en anden flyvetilstand. Vi manipulerer derefter vektorpunkterne og afrunder linjerne og kanterne. Endelig lægger vi hver ramme i en lige stor boks og placerer dem side om side. Eksporter filen som en SVG.

HTML-opsætningen er virkelig enkel. Vi er bare nødt til at pakke hver fugl i en container for at anvende flere animationer - en for at få fuglen til at flyve og den anden for at flytte den hen over skærmen.

Vi anvender vores fugles SVG som baggrund for vores fuglediv og vælger den størrelse, vi vil have hver ramme. Vi bruger bredden til groft at beregne den nye baggrundsposition. SVG har 10 celler, så vi gange vores bredde med 10 og ændrer derefter antallet let, indtil det ser korrekt ud.

.bird { background-image: url('bird.svg'); background-size: auto 100%; width: 88px; height: 125px; will-change: background-position; } @keyframes fly-cycle { 100% { background-position: -900px 0; } }

CSS-animation har et par tricks, som du måske ikke er opmærksom på. Vi kan bruge animation-timing-funktion at vise billedet i trin - ligesom at bladre gennem sider i en notesbog for at hentyde til animation.

animation-name: fly-cycle; animation-timing-function: steps(10); animation-iteration-count: infinite; animation-duration: 1s; animation-delay: -0.5s;

Nu har vi oprettet vores flyve-cyklus, vores fugl klapper i øjeblikket med sine vinger, men går ingen steder. For at flytte hende hen over skærmen opretter vi en ny keyframe-animation. Denne animation vil flytte fuglen tværs over skærmen vandret, mens den også ændrer den lodrette position og skalaen, så fuglen kan bugtes mere realistisk.

Når vi har oprettet vores animationer, skal vi blot anvende dem. Vi kan oprette flere kopier af vores fugl og anvende forskellige animationstider og forsinkelser.

.bird--one { animation-duration: 1s; animation-delay: -0.5s; } .bird--two { animation-duration: 0.9s; animation-delay: -0.75s; }

11. Kryds min hamburger

Denne animation bruges overalt på nettet og omdanner tre linjer til et kryds- eller lukkeikon. Indtil for nylig er størstedelen af ​​implementeringerne opnået ved hjælp af HTML-elementer, men SVG er faktisk meget mere egnet til denne form for animation - der er ikke længere behov for at blæse din knappekode med flere spænd.

På grund af den animerede natur og SVG og dens navigerbare DOM ændres koden til at udføre animationen eller overgangen meget lidt - teknikken er den samme.

Vi starter med at oprette fire elementer, hvad enten det strækker sig inde i en div eller stier inde i en SVG. Hvis vi bruger spændvidder, skal vi bruge CSS til at placere dem inde i div. hvis vi bruger SVG, er dette allerede taget hånd om. Vi ønsker at placere linie 2 og 3 i midten - den ene oven på den anden - mens linjerne 1 og 4 placeres jævnt over og under, og sørg for at centrere transformationsoprindelsen.

Vi vil stole på at overføre to egenskaber: opacitet og rotation. Først og fremmest ønsker vi at fade linier 1 og 4 ud, som vi kan målrette mod ved hjælp af : niende barn vælger.

.menu-icon.is-active {element-type}:nth-child(1), .menu-icon.is-active {element-type}:nth-child(4) { opacity: 0; }

Det eneste, der er tilbage, er at målrette mod de to midterste linjer og dreje dem 45 grader i modsatte retninger.

.menu-icon.is-active {element-type}:nth-child(2) { transform: rotate(45deg); } .menu-icon.is-active {element-type}:nth-child(3) { transform: rotate(-45deg); }

12. Jager cirkler

Det animerede indlæsningsikon består af fire cirkler. Cirklerne har ingen udfyldning, men har skiftende stregfarver.

I vores CSS kan vi indstille nogle grundlæggende egenskaber til alle vores cirkler og derefter bruge : n-type vælger til at anvende en anden slagtilfælde-dasharray til hver cirkel.

circle:nth-of-type(1) { stroke-dasharray: 550; } circle:nth-of-type(2) { stroke-dasharray: 500; } circle:nth-of-type(3) { stroke-dasharray: 450;} circle:nth-of-type(4) { stroke-dasharray: 300; }

Derefter skal vi oprette vores keyframe-animation. Vores animation er virkelig enkel: alt hvad vi skal gøre er at rotere cirklen 360 grader. Ved at placere vores transformation på 50% af animationen, vil cirklen også rotere tilbage til sin oprindelige position.

@keyframes preloader { 50% { transform: rotate(360deg); } }

Med vores animation oprettet, skal vi nu bare anvende den i vores cirkler. Vi indstiller animationsnavnet; varighed; iterationstælling og timingfunktion. 'Let-i-ud' vil give animationen en mere legende fornemmelse.

animation-name: preloader; animation-duration: 3s; animation-iteration-count: infinite; animation-timing-function: ease-in-out;

I øjeblikket har vi vores læsser, men alle elementerne roterer sammen på samme tid. For at løse dette, anvender vi nogle forsinkelser. Vi opretter vores forsinkelser ved hjælp af en Sass for loop.

@for $i from 1 through 4 { &:nth-of-type(#{$i}) { animation-delay: #{$i * 0.15}s; } }

På grund af forsinkelserne animerer vores cirkel nu igen og skaber illusionen om, at cirklerne jagter hinanden. Det eneste problem med dette er, at når siden først indlæses, er cirklerne statiske, så de begynder at bevæge sig, en ad gangen. Vi kan opnå den samme forskydningseffekt, men stoppe den uønskede pause i vores animation ved blot at sætte forsinkelserne til en negativ værdi.

animation-delay: -#{$i * 0.15}s;

Næste side: Flere CSS-animationseksempler at udforske

Nuværende side: CSS animation tutorials

Næste side CSS animationseffekter