Slik bruker du CSS-variabler for animasjon

Når vi nevner CSS i diskusjoner, snakker vi ofte om det som et dumbed down språk. Et deklarativt språk, mangler logikk og innsikt; men det er ikke den sanne virkeligheten. I årevis har utviklere vært etterspørselsvariabler i standard CSS, etter å ha blitt bortskjemt av forprosessorer som LESS og Sass for så lenge. Ikke bare er CSS-variabler et reelt og materielt alternativ for utviklere, de kan også brukes i animasjonsscenarier. Fortsatt skeptisk? Følg med for å finne ut mer!

Variabel grunnleggende

CSS-variabler er lagrede verdier som er beregnet for gjenbruk i et stilark. De er tilgjengelige ved bruk av egendefinert var () funksjon og sett med bruk av egendefinert eiendom notasjon.

: root --main-color: goldenrod;  div bakgrunnsfarge: var (- hovedfarge);  

Variabler definert i :rot er globale, mens variabler definert i en velger er spesifikke for den väljeren.

div --module-farge: goldenrod; bakgrunnsfarge: var (- modul-farge); 

I eksemplet over noen div Vil akseptere variabelen, men vi kan bli mer spesifikke med navngivning ved hjelp av målrettingsmetoder som klasse og id for eksempel.

De var () funksjonen kan også akseptere tilbakeslagsverdier også.

.nav bakgrunn: var (- navbg, blå); 

Dette kan være nyttig i situasjoner der en variabel ikke er definert eller når du arbeider med egendefinerte elementer og Shadow DOM.

CSS-variablene er ikke helt klare for prime-tid, men utsiktene for fremtiden er veldig lyse med mange ledende nettlesere som allerede implementerer spesifikasjonen. Det er bare et spørsmål om tid til de kan brukes uten noen bekymringer, og den tiden nærmer seg raskt.

Variabler for animasjon

Det er mange alternativer for å kombinere CSS-variabler med animasjon. Tenk på sammenhenger som lydvisualiseringer, JavaScript-hendelsesdrevne scenarier, og til og med CSS-drevne hendelser som sveve, fokus og mål. I teorien kan en Apple Watch være koblet til en API mens du bruker en CSS-variabelbasert animasjon av et slående hjerte. Deretter har vi akselerometre, API-tilkoblinger for API og til og med gamepad-APIer, men hvorfor bør vi vurdere å animere med CSS-variabler i det hele tatt? Her er noen grunner:

  • Lett debuggable.
  • Ingen overdreven DOM-manipulasjon.
  • DOM node uavhengig.
  • theming
  • Fungerer med SVG.

Operasjoner i CSS er virkelig nøkkelen til hele puslespillet med animasjoner. CSS funksjoner som calc kan akseptere en verdi ved kjøretid og utføre operatører som multiplikasjon, divisjon, tillegg, subtraksjon, muterende verdier til en ny. Dette bidrar til å gjøre CSS-variablene dynamiske.

CSS Variabler i JavaScript

Nå som vi vet hvilke CSS-variabler som ser ut og hva de kan gjøre, er det på tide å få en forståelse for hvordan JavaScript passer inn i alt dette.

document.documentElement.style.getPropertyValue ( '- bgfarge'); document.documentElement.style.setProperty ('- bgcolor', 'rød'); document.documentElement.style.removeProperty ( '- bgfarge');

Fremgangsmåtene som vises ovenfor, brukes til å angi, få og fjerne eiendomsverdier. De kan brukes til våre typiske CSS egenskaper (bakgrunnsfarge, skriftstørrelse etc), men de kan også brukes til CSS variabler også. Disse alternativene angir en ny verdi for den globalt definerte eiendommen ellers kjent som :rot i CSS. 

De er også den virkelige hemmeligheten å animere med CSS-variabler fordi våre JS-metoder kan få, sette eller fjerne en variabel i kjøretid dynamisk!

var element = document.querySelector ('div'); element.style.getPropertyValue ( '- bgfarge'); element.style.setProperty ('- bgcolor', 'rød'); element.style.removeProperty ( '- bgfarge');

Du kan også angi en ny verdi for et bestemt element hvis ønskelig. I eksempelbiten ovenfor manipulerer vi en variabel som er knyttet til en div velger versus å bli festet globalt.

Demoer i naturen

Det er mange fantastiske og ekstremt talentfulle utviklere som bygger og eksperimenterer med disse konseptene av reaktive og temabaserte animasjoner ved hjelp av CSS-variabler. Her er bare noen få penner for å dykke inn og oppdage hva som skjer under hetten.

Solnedgang soloppgang 

Av David Khourshid.

Dette eksemplet viser effekten av CSS variable animasjoner som brukes på en temabasert måte. Det ville vanligvis være dobbelt så mye kode å utføre denne demoen uten CSS-variabler og mange ganger mer hvis du ønsket å overskride to temaer.

CSS Variabler Animasjon

Av GRAY GHOST.

Her er et annet eksempel ved å bruke museventilhendelser i JavaScript som kjører plasseringen av en sirkel.

Hver gang du beveger musen, oppdaterer JavaScript våre deklarerte variabler, slik at sirkelen kan bevege posisjon i forhold til markøren. 

Alex CSS Husky

Av David Khourshid.

Her er det samme prinsippet som vist ovenfor, men brukt i en annen sammenheng.

Legg merke til hva som skjer når du beveger musa rundt? Ganske kul hei?

Animasjon med CSS-variabler

Av Wes Bos.

Hva med å oppdatere verdiene av variabler på andre måter? La oss ta en titt på følgende demonstrasjon av Wes Bos ved hjelp av glidebrytere for å oppdatere posisjonene til et bilde.

Flytt glidebryterne rundt når du er på ferie. Legg merke til kulheten som følger med? Enkelt, men bare magisk, og alt det gjør er å oppdatere variablene for transformasjonsposisjon hver gang skyvekontrollene justeres. Suuuuhhhweeet!

Single Div Accordion (animert med CSS variabler)

Av Dan Wilson.

Hva med noe litt annerledes for musikerne der ute? Sjekk ut denne hip-trekkspillet av Dan Wilson.

Jøss! Se på disse nøklene flytte! Dette kan virke litt skremmende å gå gjennom, men i kjernen er det bare JavaScript-oppdatering av CSS-variabler. Intet mer, intet mindre.

CSS-variabler + Transform = Individuelle egenskaper (med innganger)

Av Dan Wilson.

I denne demoen bruker du inngangsområder for å endre hver transformasjonsegenskap og vitne om hvor glatt de er, selv om du endrer en eiendom midt overgang.

Bivirkninger av CSS-variabler

Ettersom CSS-variabler alltid er arvelige egenskaper, kan de føre til en omregning av stil på barn, som har negativ effekt på ytelsen i prosessen. Dette vil være noe du må måle, i motsetning til å gjette avhengig av konteksten din.

Huh, det virker som å endre CSS-variabler på et element som utløser en stilberegning for _all_ av sine barn. Au. pic.twitter.com/jvpDT5UB2h

- Joni Korpi (@jonikorpi) 18. mai 2017

Her er en demo Shaw som er lagt ut på animasjonen på jobb Slack-gruppen som ble brukt til testing: CSS Variables Recalc Style Performance Test

Under testene (Chrome 58. Mac 10.12) ble det oppdaget at når Sett CSS Var knappen utløses til det tidspunktet nettleseren maler bakgrunnen, er det 52,84 ms tilbakekalkingstid og 51,8 ms gjengivelse. Bytte gir til CSS Property test et svært forskjellig resultat oppdages. Fra den tiden den Angi CSS Property knappen utløses til bakgrunnen maler det er omtrent 0,43ms av recalc og 0.9ms rendering.

Hvis du bytter bakgrunn ut for farge Du får tilsvarende målinger siden current kanskje eller kanskje ikke eksisterer hos barna (rop ut til David Khourshid). Enhver eiendom som er inheritable vil alltid føre til en stil recalc for alle barn. Eiendommen bakgrunnsfarge er ikke arvelig, dermed den enorme forskjellen med CSS variabler som er alltid arvelig. Vanligvis CSS egenskaper som standard til arve vil i de fleste tilfeller føre til en stor omkalkning av stiler. Det er fortsatt viktig å merke seg at endring av CSS-variabler kontinuerlig kan være en ytelseavledning. En god praksis for å unngå dette er å animere CSS-variabler på det mest spesifikke nivået (eller det dypeste nivået), for å forhindre at flere barn påvirkes. Du kan lese mer om å redusere omfanget og kompleksiteten til stilberegninger via Googles nettsider.

Konklusjon

Jeg oppfordrer dere alle til å dykke inn og teste denne demonstrasjonen for dere selv og lage din egen konklusjon / endringer / tilpassede tester og dele resultatene dine i kommentarene. Hovedopptaket i alt dette er at CSS-variablene gir stor fleksibilitet, men det vil være prestasjonsimplikasjoner for å sette CSS-variabler på en forelder med en stor mengde barn.

Spesiell takk til gjengen i animasjonene på jobben Slakk kanal for den pågående testingen, tilbakemeldinger og diskusjoner (David Khourshid, Joni Korpi, Dan Wilson og Shaw).

ressurser

  • CSS Egendefinerte egenskaper for Cascading Variables Modul Nivå 1 på W3C
  • Å lage egendefinerte egenskaper (CSS-variabler) Mer dynamisk på CSS-triks
  • Individualisering av CSS Properties med CSS Variables av Dan Wilson
  • Reaktive animasjoner CSS Variabler slides av David Khourshid
  • Reaktive animasjoner med CSS-variabler - JSConf Island 2016 David Khourshid
  • Få variabel fra inline stil av Lea Verou