CSS ja verkko

CSS-animoidut liukuvärit: taustat tehtynä oikein

Liukuvärejä ei voi animoida suoraan, mutta kaiken niiden ympärillä voi. Neljä tekniikkaa, mitä kukin maksaa selaimelle ja miten liike pidetään rauhallisena ja valinnaisena.

GradientlyVahvistettu Gradiently-tili··4 min lukuaika
Kansi: Pine Afternoon · GR·6MTX·YD

Lyhyesti

  • Selaimet eivät osaa interpoloida kahden liukuväriarvon välillä, joten CSS-animoitu liukuväri liikuttaa, häivyttää tai muuntaa liukuväriä sen suoran animoinnin sijaan.
  • Klassinen tekniikka tekee taustasta elementtiä suuremman ja animoi background-positionia, mikä toimii kaikkialla mutta piirtää uudelleen joka ruudulla.
  • Mukautettujen ominaisuuksien rekisteröinti @propertyllä antaa selaimen animoida yksittäisiä värejä, kulmia ja paikkoja liukuvärin sisällä.
  • Transformin tai opacityn animointi erillisellä liukuvärikerroksella on yleensä halvin vaihtoehto, koska selaimet voivat usein yhdistää sen piirtämättä uudelleen.
  • Jokaisen liukuvärianimaation pitäisi pysähtyä tai muuttua lähes liikkumattomaksi, kun käyttäjä on pyytänyt vähennettyä liikettä.
Tällä sivulla

CSS-animoitu liukuväri on liukuvärillinen tausta, joka muuttaa väriään tai paikkaansa ajan myötä. Siinä on koukku: jos kirjoitat kaksi eri liukuväriä @keyframes-sääntöön, selaimet eivät häivytä niiden välillä, vaan hyppäävät. Siksi jokainen toimiva tekniikka animoi jotain liukuvärin vierestä: sen paikkaa, sen sisällä olevia mukautettuja ominaisuuksia tai kerrosta, jolle se on piirretty. Se, minkä valitset, ratkaisee, kuinka sujuvalta se näyttää ja kuinka paljon työtä selain tekee joka ruudulla.

Kolme hetkeä yhdestä hitaasta animaatiosta. Suunta ja väri liikkuvat, mutta paletti pysyy yhtenä perheenä.

Suunnittelupuolelta, milloin liike auttaa brändiä ja miten sitä rytmitetään, katso animoidut liukuväritaustat. Tämä opas on koodi.

Tekniikka 1: liikuta ylisuurta taustaa

Tee liukuväristä kaksi tai neljä kertaa elementin kokoinen background-size-ominaisuudella ja animoi sitten background-position, jotta sen eri osa näkyy ajan myötä. Se toimii jokaisessa selaimessa eikä tarvitse JavaScriptiä. Käytä arvoa alternate, jotta liike kääntyy sujuvasti eikä hyppää takaisin alkuun.

css
.hero {
  background-color: #1e1b4b;
  background-image: linear-gradient(120deg, #1e1b4b, #7c3aed, #f472b6, #fb923c);
  background-size: 300% 300%;
  animation: pan 18s ease-in-out infinite alternate;
}

@keyframes pan {
  from { background-position: 0% 50%; }
  to   { background-position: 100% 50%; }
}
Klassinen animoitu liukuväri. Hitaat 12 - 30 sekunnin kestot tuntuvat tunnelmallisilta eivätkä vilkkailta.

Hinta: background-position ei ole jotain, mitä selaimet voivat liikuttaa pelkällä näytönohjaimella, joten elementti piirretään uudelleen joka ruudulla. Painikkeessa se on ei mitään. Koko näytön hero-osiossa se on todellista työtä, joka pyörii niin kauan kuin sivu on auki.

Tekniikka 2: animoi värien pysäytyspisteitä @propertyllä

Mukautetut ominaisuudet ovat normaalisti merkkijonoja, joita ei voi interpoloida. Rekisteröinti @propertyllä antaa niille tyypin, kuten <color>, <angle> tai <percentage>, ja tyypitetyt ominaisuudet animoituvat sujuvasti. Käytä niitä liukuvärin sisällä, niin voit animoida värejä, kulmaa tai pysäytyspisteen paikkaa suoraan. @property on tuettu kaikissa nykyisissä suurissa selaimissa. Tarkista caniuse, jos tuet vanhempia.

css
@property --from {
  syntax: "<color>";
  inherits: false;
  initial-value: #7c3aed;
}
@property --to {
  syntax: "<color>";
  inherits: false;
  initial-value: #f472b6;
}
@property --angle {
  syntax: "<angle>";
  inherits: false;
  initial-value: 120deg;
}

.hero {
  background: linear-gradient(var(--angle), var(--from), var(--to));
  animation: shift 16s ease-in-out infinite alternate;
}

@keyframes shift {
  to {
    --from: #0891b2;
    --to: #fb923c;
    --angle: 200deg;
  }
}
Värit ja kulma animoituvat liukuvärin sisällä. Rekisteröimättömät ominaisuudet hyppäisivät häivyttämisen sijaan.
Yllä olevan animaation kaksi päätä. Selain häivyttää jokaisen väliin jäävän ruudun.

Tämäkin tekniikka piirtää uudelleen joka ruudulla, kuten ensimmäinen. Sen etu on hallinta: voit liikuttaa yhtä hehkua mesh-liukuvärissä, pyörittää kartiomaista reunaa tai siirtää brändin liukuväriä kohti toista palettia ilman ylisuuria taustoja.

Tekniikka 3: muunna liukuvärikerrosta

Aseta liukuväri elementtiä paljon suuremmalle pseudoelementille ja animoi sen transform-ominaisuutta, esimerkiksi hidasta pyörimistä tai ajelehtimista. Selaimet voivat yleensä liikuttaa muunnettua kerrosta näytönohjaimella piirtämättä sitä uudelleen, joten tämä on halvin tapa animoida suurta liukuväriä. will-change: transform vihjaa, että kerros pitäisi ylentää etukäteen.

css
.hero {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.hero::before {
  content: "";
  position: absolute;
  inset: -50%;
  z-index: -1;
  background: conic-gradient(from 0deg, #1e1b4b, #7c3aed, #f472b6, #0891b2, #1e1b4b);
  animation: turn 40s linear infinite;
  will-change: transform;
}

@keyframes turn {
  to { transform: rotate(1turn); }
}
Valtava kartiomainen liukuväri pyörii hitaasti sisällön takana. Negatiivinen inset pitää kulmat peitettynä pyörimisen aikana.

Tekniikka 4: häivytä kahden liukuvärin välillä

Aseta kaksi liukuvärikerrosta päällekkäin ja animoi ylemmän opacity-ominaisuutta. Opacity on myös yhdistäjäystävällinen ominaisuus, joten häivytys on sujuva ja halpa. Se sopii hitaisiin tunnelmanmuutoksiin, kuten päiväpaletin häipymiseen yöpaletiksi, ja antaa kahden liukuvärin olla rakenteeltaan täysin erilaisia.

css
.sky {
  position: relative;
  isolation: isolate;
  background: linear-gradient(180deg, #7dd3fc, #fde68a);
}

.sky::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background: linear-gradient(180deg, #0f172a, #7c3aed);
  animation: dusk 20s ease-in-out infinite alternate;
}

@keyframes dusk {
  from { opacity: 0; }
  to   { opacity: 1; }
}
Päivä häipyy yöksi ja takaisin. Vain opacity muuttuu, joten mitään ei piirretä uudelleen.

Tekniikan valinta

TekniikkaSelaimen työ ruutua kohdenSopii parhaiten
background-positionin liikuttaminenUudelleenpiirtoPienet elementit, painikkeet, teksti
@property-värit ja -kulmatUudelleenpiirtoTarkat värimuutokset, pyörivät reunat
transform kerroksellaYleensä vain yhdistäminenSuuret, koko näytön taustat
opacity-ristihäivytysYleensä vain yhdistäminenHitaat tunnelman tai paletin muutokset
Uudelleenpiirrot ovat hyväksyttäviä pienillä alueilla. Suurilla alueilla suosi transformia ja opacityä.

Mittaa arvaamisen sijaan. Chromen DevToolsissa Rendering-paneelin paint flashing korostaa alueet, jotka piirretään uudelleen joka ruudulla, ja Performance-tallenne näyttää, kuinka suuri osa jokaisesta ruudusta menee piirtämiseen. CSS-liukuvärien suorituskyky käy sen läpi.

Vähennetty liike ja hyvät tavat

Jotkut ihmiset huimaantuvat tai hajamielistyvät taustaliikkeestä, ja käyttöjärjestelmät antavat heidän pyytää sitä vähemmän. Kunnioita sitä prefers-reduced-motion-kyselyllä, joka pysäyttää animaation ja jättää paikalleen valmiin, liikkumattoman ruudun. Vähennetty liike -opas selittää, mikä lasketaan poistamisen arvoiseksi liikkeeksi.

css
@media (prefers-reduced-motion: reduce) {
  .hero,
  .hero::before,
  .sky::after {
    animation: none;
  }
}
Yksi sääntö, joka pysäyttää jokaisen yllä olevan tekniikan. Tarkista, että jäljelle jäävä ruutu näyttää yhä oikealta.

Vältä

  • Yli noin 8 sekunnin sykliä nopeammat kierrokset suurilla alueilla
  • Sateenkaarisävyn pyöritys koko sivulla
  • Liike leipätekstin takana, jota ihmisten pitää lukea
  • Animaatiot, jotka jatkavat pyörimistä, kun välilehti on pitkään käyttämättä

Tee näin

  • Hidas, tunnelmallinen liike yhden väriperheen sisällä
  • Liikettä herossa, tyyneyttä sisällössä
  • Rauhallinen liikkumaton ruutu vähennettyä liikettä varten
  • Testaa vaatimattomalla kannettavalla ja puhelimella, ei vain nopealla työpöydällä

Usein kysyttyä

Voiko CSS-liukuvärin animoida?

Ei suoraan: selaimet hyppäävät kahden liukuväriarvon välillä avainkehyksissä. Animoi sen sijaan background-positionia, liukuvärin sisällä käytettyjä rekisteröityjä mukautettuja ominaisuuksia tai liukuvärikerroksen transformia ja opacityä.

Mikä on sujuvin tapa animoida liukuväritausta?

Erillisen liukuvärikerroksen transformin tai opacityn animointi, koska selaimet pystyvät yleensä käsittelemään ne piirtämättä uudelleen.

Miten animoin liukuvärin värit CSS:llä?

Rekisteröi jokainen väri @propertyllä määrityksellä syntax: "<color>", käytä ominaisuuksia liukuvärissä ja muuta niitä @keyframes-säännössä.

Hidastavatko animoidut liukuvärit sivua?

Pienillä ei juuri ole väliä. Suuret animoidut taustat, jotka piirtyvät uudelleen joka ruudulla, voivat maksaa akkua ja sujuvuutta, joten suosi transformia tai opacityä ja mittaa DevToolsilla.

Miten kunnioitan vähennettyä liikettä liukuvärianimaatioissa?

Kääri animation: none -sääntö @media (prefers-reduced-motion: reduce) -lohkoon, jotta käyttäjät, jotka pyytävät vähemmän liikettä, näkevät liikkumattoman ruudun.

Jaa tämä opas

Kirjoittanut GradientlyVahvistettu Gradiently-tili

Gradientlyn tiimi. Gradiently on Markien ympärille rakennettu suunnittelutyökalu: eläviä liukuvärejä, joiden ansiosta kaikki suunnittelemasi näyttää omaltasi.

Katso profiilimme