CSS ja verkko

CSS-liukuvärin suorituskyky: hidastavatko liukuvärit sivua?

Staattinen CSS-liukuväri on melkein ilmainen. Kustannukset tulevat siitä, mitä liukuväreillä tehdään: valtavista sumennuksista, vierittäessä uudelleen piirtyvistä taustoista ja animaatioista, jotka eivät lopu. Tästä näet eron.

GradientlyVahvistettu Gradiently-tili··4 min lukuaika
Kansi: Burnt Mist · GR·3M7T·BR

Lyhyesti

  • Staattinen CSS-liukuväri ei juuri kuormita latausta, koska se on tekstirivi eikä ladattava ja purettava tiedosto.
  • Liukuvärit maksavat piirtoaikaa, joka kasvaa piirretyn alueen ja kerrosten määrän mukana, mutta staattinen liukuväri piirretään kerran ja käytetään sitten uudelleen.
  • Todelliset suorituskykyriskit ovat suuret sumennussuodattimet, vierittäessä uudelleen piirtyvät taustat ja liukuvärianimaatiot, jotka piirtyvät uudelleen joka ruudulla.
  • Liukuvärikerroksen transform- tai opacity-ominaisuuden animointi on yleensä paljon halvempaa kuin background-position- tai värikohtien animointi.
  • Ainoa luotettava vastaus tietylle sivulle on mitata: selaimen kehittäjätyökalujen paint flashing ja Performance-tallenne kertovat totuuden.
Tällä sivulla

Hyvä CSS-liukuvärin suorituskyky on normaalitilanne: staattinen liukuväri ei hidasta verkkosivua millään huomattavalla tavalla. Se on tekstirivi, joten ei ole mitään ladattavaa, purettavaa tai odotettavaa. Liukuvärit maksavat hieman piirtoaikaa kuten kaikki muutkin sivun värit. Hitaat sivut syntyvät muutamasta liukuvärien päälle rakennetusta tavasta: suurista sumennuksista, vierittäessä tapahtuvasta uudelleenpiirrosta ja animaatioista, jotka piirtyvät uudelleen joka ruudulla. Tämä opas näyttää, mikä on mitäkin ja miten oman sivusi voi tarkistaa.

Lataus: liukuvärit vastaan kuvat

background: linear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6); on 67 merkkiä. Se tulee tyylitiedostosi mukana, ei tarvitse erillistä pyyntöä ja piirtyy terävänä missä tahansa koossa ja pikselitiheydessä. Kuvataustalle tarvitaan oma pyyntö, se pitää purkaa ennen piirtämistä, ja sen täytyy olla riittävän suuri isoille ja tiheille näytöille.

67 merkkiä CSS:äälinear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6)
Tämä koko tausta, missä tahansa koossa, kuormittaa latausta vähemmän kuin yksi tekstilause.
TaustaLatausPurettu muisti koossa 1920×1080
CSS-liukuväriMuutama kymmenen tavua CSS:ssäsiEi säilytettävää bittikarttaa, piirtyy tarvittaessa
Pakattu kuva (AVIF, WebP, JPEG)Erillinen tiedosto, usein kymmeniä tai satoja kilotavujaNoin 8,3 Mt (leveys × korkeus × 4 tavua)
Sama kuva koossa 3840×2160 terävälle 4K:lleVielä suurempiNoin 33 Mt
Puretut kuvat säilytetään kokonaisina bittikarttoina tiedostokoosta riippumatta. Muistiluvut ovat yksinkertaista laskua: pikselit kertaa neljä tavua.

Yksinkertaisissa ja kohtuullisen monikerroksisissa taustoissa CSS voittaa latauksessa aina. Kuvilla on silti paikkansa, kun tausta on aidosti monimutkainen, kuten maalauksellinen mesh-liukuväri, jossa on monta värikohtaa, tai valokuvamainen tekstuuri. Silloin vaihdat tiedostopainoa visuaaliseen rikkauteen, ja se kannattaa usein.

Piirtäminen: mitä liukuväri maksaa ruudulla

Liukuvärin näyttämiseksi selain laskee värin jokaiselle peittämälleen pikselille: sitä kutsutaan piirtämiseksi. Työ kasvaa piirretyn alueen, päällekkäisten liukuvärikerrosten ja niiden päälle lisättyjen tehosteiden mukana. Staattisella taustalla se tapahtuu kerran, ja tulos käytetään uudelleen vierittäessä ja käyttäessä sivua, ellei jokin mitätöi sitä.

Piirtyy kerran

  • Staattinen liukuväri kortissa tai hero-alueella
  • Useita päällekkäisiä säteittäisiä hehkuja, jotka eivät liiku
  • Ruudukkona toistuva kohinatekstuuri liukuvärin päällä
  • Taustoilla piirretty liukuvärireunus

Piirtyy yhä uudelleen

  • background-position- tai värikohtien animointi
  • background-attachment: fixed vierittäessä
  • backdrop-filter-sumennus liikkuvan sisällön päällä
  • Liukuvärillinen elementti, jonka koko muuttuu jatkuvasti

Todelliset riskit: sumennus, kiinteät taustat ja animaatio

Suuret sumennukset. filter: blur() ja backdrop-filter ottavat jokaisen pikselin kohdalla näytteitä monista ympäröivistä pikseleistä, ja työ kasvaa sekä sumennussäteen että alueen mukana. Kerran piirretty sumennettu liukuväri on yleensä kunnossa. backdrop-filter vierivän sisällön päällä pitää laskea uudelleen sisällön liikkuessa, ja siksi glassmorphism-käyttöliittymät tökkivät herkästi vaatimattomilla puhelimilla.

Kiinteät taustat. background-attachment: fixed pitää taustan paikallaan sivun vieriessä, mikä voi pakottaa sen piirtymään uudelleen jokaisella vierityksen askeleella. Jos haluat liukuvärin, joka pysyy paikallaan, sisällön takana oleva position: fixed -elementti on yleensä halvempi, koska selain voi siirtää sitä erillisenä kerroksena.

Animaatio. background-positionin liikuttaminen tai värikohtien animointi @property:n kautta piirtää elementin uudelleen joka ruudulla. Painikkeessa se on vähäpätöistä. Koko ruudun hero-alueella se on jatkuvaa työtä niin kauan kuin sivu on auki, ja se näkyy puhelimissa lämpönä ja akun kulutuksena.

css
/* repaints the whole hero every frame */
.hero--costly {
  background: linear-gradient(120deg, #1e1b4b, #7c3aed, #f472b6);
  background-size: 300% 300%;
  animation: pan 12s ease-in-out infinite alternate;
}

/* the browser can usually just move a finished layer */
.hero--cheap::before {
  content: "";
  position: absolute;
  inset: -50%;
  z-index: -1;
  background: conic-gradient(#1e1b4b, #7c3aed, #f472b6, #1e1b4b);
  animation: turn 40s linear infinite;
}

@keyframes pan { to { background-position: 100% 50%; } }
@keyframes turn { to { transform: rotate(1turn); } }
Kaksi animoitua hero-aluetta. Jälkimmäinen animoi transformia, jota selaimet osaavat yleensä käsitellä kompositointivaiheessa ilman uudelleenpiirtoa.

CSS-animoidun liukuvärin oppaassa on koko tekniikkajoukko halvimmasta joustavimpaan.

Kerrokset ja will-change

Elementin nostaminen omalle kokoonpanokerrokselleen will-change: transform -asetuksella tai käynnissä olevalla transform-animaatiolla tekee halvan animaation mahdolliseksi. Se ei ole ilmaista: jokainen kerros pitää omaa bittikarttaansa grafiikkamuistissa, suunnilleen leveys × korkeus × 4 tavua laitepikseleinä. Yksi ylisuuri kerros hero-taustalle on hyvä. Kymmenet korotetut kortit, joilla kullakin on oma liukuvärikerroksensa, voivat käyttää enemmän muistia kuin säästävät piirtoajassa. Lisää will-change niille elementeille, jotka oikeasti animoituvat, älä yleissääntönä.

TapaSelaimen työHalvempi vaihtoehto
Animoitu background-position hero-alueellaUudelleenpiirto joka ruudullatransform ylisuurella liukuvärikerroksella
background-attachment: fixedUudelleenpiirto vierittäessäposition: fixed -liukuvärikerros sisällön takana
backdrop-filter vierivän sisällön päälläSumennus lasketaan uudelleen sisällön liikkuessaValmiiksi sumennettu staattinen kerros tai pienempi sumennettu alue
Elävä SVG-kohinasuodatin suurella elementilläSuodatin ajetaan jokaiselle uudelleen piirretylle pikselillePieni toistuva kohinakuva
will-change jokaisella kortillaMonta kerrosta grafiikkamuistissawill-change vain sillä, mikä animoituu
Yleisiä liukuväritapoja, mitä ne teettävät selaimella ja kevyempi keino saada sama ilme.

Miten liukuvärin suorituskyky mitataan

  1. 1

    Ota paint flashing käyttöön

    Avaa Chrome DevToolsissa Rendering-paneeli ja ota käyttöön Paint flashing. Kaikki, mikä vilkkuu vihreänä silloin kun mitään ei pitäisi muuttua, piirtyy uudelleen.

  2. 2

    Tallenna Performance-jälki

    Tallenna Performance-paneelissa muutama sekunti vierittämistä tai tyhjäkäyntiä. Katso, kuinka suuri osa kustakin ruudusta kuluu piirtämiseen ja pudotaanko ruuduista.

  3. 3

    Hidasta suoritinta

    Simuloi hitaampaa laitetta Performance-paneelin suorittimen rajoituksella. Nopealla kannettavalla sulava hero-alue voi tökkiä keskihintaisella puhelimella.

  4. 4

    Tarkista Layers-paneeli

    Katso, kuinka monta kokoonpanokerrosta on ja paljonko muistia ne käyttävät. Odottamattoman monta kerrosta tarkoittaa yleensä, että will-changeia on käytetty liikaa.

  5. 5

    Kokeile oikealla laitteella

    Viimeistele oikealla puhelimella. Jatkuvan animaation aiheuttama lämpö ja akun kulutus jäävät helposti huomaamatta työpöydällä.

web.devin renderöintisuorituskykyopas selittää näiden työkalujen taustalla olevan putken: tyylit, asettelu, piirto ja kokoonpano. Kun tiedät, mihin vaiheeseen liukuvärisi vaikuttaa, tiedät myös, onko se halpa.

Suorituskykytarkistuslista liukuväreille

  • Käytä CSS-liukuvärejä yksinkertaisiin ja monikerroksisiin taustoihin, kuvia vain kun ilme aidosti vaatii ne.
  • Pidä sumennussäteet kohtuullisina ja vältä backdrop-filteria suurilla vierivillä alueilla.
  • Korvaa background-attachment: fixed kiinteällä kerroksella.
  • Animoi suurilla alueilla transformia tai opacitya, älä background-positionia.
  • Hitaat, tunnelmaa luovat animaatiot voivat pysähtyä kokonaan vähennettyä liikettä haluaville käyttäjille.
  • Lisää rakeisuus pienenä toistuvana kuvana, älä elävänä SVG-suodattimena suurella elementillä; katso CSS-kohinatekstuuri.
  • Mittaa ennen ja jälkeen paint flashingilla ja Performance-tallenteella.

Usein kysyttyä

Hidastavatko CSS-liukuvärit verkkosivua?

Staattiset CSS-liukuvärit eivät hidasta huomattavasti. Ne eivät tarvitse latausta ja piirtyvät kerran. Suorituskykyä kuluttavat suuret sumennukset, kiinteät taustat ja jatkuva animaatio.

Onko CSS-liukuväri nopeampi kuin taustakuva?

Yleensä on. Liukuväri on muutama kymmenen tavua CSS:ää ilman pyyntöä tai purkamista, kun taas kuva pitää ladata ja se säilytetään muistissa kokonaisena bittikarttana.

Ovatko animoidut liukuvärit huonoja suorituskyvylle?

background-positionin tai värikohtien animointi piirtää uudelleen joka ruudulla, mikä on merkittävää suurilla alueilla. transformin tai opacityn animointi liukuvärikerroksella on yleensä paljon halvempaa.

Miksi sumennettu liukuvärini tausta on hidas?

Sumennus ottaa jokaisen pikselin kohdalla näytteitä monesta viereisestä pikselistä, joten kustannus kasvaa säteen ja alueen mukana. Pahin tilanne on backdrop-filter vierivän tai animoituvan sisällön päällä.

Miten näen, piirtyykö liukuväri uudelleen?

Ota Paint flashing käyttöön Chrome DevToolsin Rendering-paneelissa. Alueet, jotka jatkavat vilkkumista sivun ollessa tyhjäkäynnillä, piirtyvät uudelleen.

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