CSS ja verkko

CSS-kohinatekstuuri: rakeisuutta liukuväreihin SVG:llä

Himmeä kohinakerros piilottaa juovittumisen ja saa tasaisen näytön värin tuntumaan painetulta tai filmiltä. Tässä sen takana oleva SVG-suodatin säädettynä ja liitettäväksi valmiina.

GradientlyVahvistettu Gradiently-tili··4 min lukuaika
Kansi: Muslin Anvil · GR·W4AX·4M

Lyhyesti

  • CSS-kohinatekstuuri tehdään yleensä SVG:n feTurbulence-suodattimella, joka upotetaan pienenä data-URI-kuvana ja toistetaan liukuvärin päälle.
  • feTurbulencen baseFrequency määrää rakeen koon: suuremmat arvot antavat hienomman rakeen, pienemmät karkean, pilvisen kohinan.
  • Kohina toimii parhaiten liukuvärin päälle pseudoelementille asetettuna sekoitustilalla, kuten soft-light tai overlay, ja matalalla peittävyydellä.
  • Rakeisuus piilottaa liukuvärin juovittumisen, koska se rikkoo vierekkäisten sävyjen näkyvät reunat hienoksi, satunnaiseksi vaihteluksi.
  • Toistuva kohinakuva on kevyt renderöidä, kun taas elävän SVG-suodattimen käyttäminen suurella elementillä tai sen animointi maksaa paljon enemmän.
Tällä sivulla

CSS-kohinatekstuuri on hieno, satunnainen pilkutus värin tai liukuvärin päällä, joka antaa sille rakeisuutta. CSS:ssä ei ole kohinafunktiota, joten vakiolähde on SVG: feTurbulence-suodatin tuottaa kohinan, kääri sen pieneen SVG:hen, upota se data-URI:na ja toista se liukuvärisi päälle matalalla voimakkuudella. Tulos näyttää filmirakeelta tai painetulta paperilta, ja se korjaa hiljaa juovittumisen (banding), eli suurissa, pehmeissä liukuväreissä näkyvät portaat.

Miksi rakeisuus saa värin näyttämään arvokkaammalta, kerrotaan oppaassa rakeiset liukuvärit. Tämä opas on toteutus.

SVG-kohinasuodatin

html
<svg xmlns="http://www.w3.org/2000/svg" width="240" height="240">
  <filter id="n">
    <feTurbulence type="fractalNoise" baseFrequency="0.8" numOctaves="3" stitchTiles="stitch" />
    <feColorMatrix type="saturate" values="0" />
  </filter>
  <rect width="100%" height="100%" filter="url(#n)" />
</svg>
240 pikselin ruutu harmaata kohinaa. Tallenna se nimellä noise.svg tai upota alla näytetyllä tavalla.
AttribuuttiArvo tässäMitä se ohjaa
typefractalNoisePehmeä, tasainen rae. turbulence antaa raidallisemman, aaltoilevan kohinan.
baseFrequency0.8Rakeen koko. Noin 0,6 ja 0,9 välillä on hienoa rakeisuutta, 0,1 ja 0,3 välillä pilvistä.
numOctaves3Yksityiskohtien kerrokset. Noin neljän jälkeen eroa on vaikea nähdä.
stitchTilesstitchSaa ruudun reunat täsmäämään, joten toistoissa ei ole saumoja.
feColorMatrix saturate 00Poistaa satunnaisen värin ja jättää harmaan rakeen.
Tärkeimmät asetukset. MDN:n feTurbulence-viite dokumentoi loput.

Kohinan upottaminen data-URI:na

Erillinen tiedosto toimii, mutta upottaminen säästää pyynnön ja pitää tehosteen yhdessä paikassa. Data-URI:ssa URL-osoitteissa merkitystä omaavat merkit täytyy koodata: < muuttuu muotoon %3C, > muotoon %3E, # muotoon %23 ja % muotoon %25. Käytä SVG:n sisällä yksinkertaisia lainausmerkkejä, jotta ne eivät ole ristiriidassa URL:n ympärillä olevien kaksinkertaisten kanssa.

css
:root {
  --noise: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='240' height='240'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
Sama ruutu mukautettuna ominaisuutena, jota voi käyttää missä tahansa. #:n koodaamatta jättäminen muotoon %23 on yleinen syy siihen, ettei mitään näy Firefoxissa.

Kohinan kerrostaminen liukuvärin päälle

Aseta kohina pseudoelementille liukuvärin päälle ja säädä sitä kahdella säätimellä: sekoitustilalla, joka päättää, miten harmaa rae sekoittuu alla olevaan väriin, ja peittävyydellä, joka päättää sen voimakkuuden. soft-light pitää värit puhtaina ja on lempein, overlay lisää kontrastia. pointer-events: none estää kerrosta estämästä napsautuksia.

css
.grain {
  position: relative;
  isolation: isolate;
  background: linear-gradient(135deg, #1e1b4b, #7c3aed 55%, #f472b6);
}

.grain::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background-image: var(--noise);
  mix-blend-mode: soft-light;
  opacity: 0.45;
  pointer-events: none;
}
Rae liukuvärin ja sisällön välissä: .grainin sisällä oleva teksti pysyy terävänä.
Kolme liukuväriä, jotka hyötyvät rakeisuudesta eniten. Tummat, vähäkontrastiset häivytykset, kuten keskimmäinen, ovat paikkoja, joissa juovittuminen näkyy ensin.

Jos haluat yhden elementin ilman pseudoelementtiä, listaa kohina ensin background-imagessa ja aseta background-blend-mode: soft-light, normal. Menetät erillisen peittävyyssäätimen, joten paista voimakkuus SVG:hen, esimerkiksi opacity='0.5' rect-elementille.

Kuinka paljon rakeisuutta riittää

  1. 1

    Aloita himmeästä

    Aloita arvolla opacity: 0.3 ja soft-light. Sen pitäisi tuskin erottua käsivarren mitan päästä.

  2. 2

    Tarkista tummin alue

    Juovittuminen asuu tummissa, hitaissa häivytyksissä. Nosta peittävyyttä, kunnes portaat siellä sulavat, ja lopeta sitten.

  3. 3

    Sovita rae kokoon

    Koko ruudun hero-alueet sietävät hieman karkeampaa rakeisuutta, noin 0,6. Kortit ja painikkeet haluavat hienoa rakeisuutta, noin 0,9.

  4. 4

    Tarkista puhelimella ja suurella näytöllä

    Rae, joka näyttää oikealta yhdellä näytöllä, voi näyttää pölyltä toisella. Tavoittele tekstuuria, jonka tunnet mieluummin kuin näet.

  5. 5

    Tarkista päällä oleva teksti

    Rae ei saa heikentää luettavuutta. Jos pieni teksti on tekstuurin päällä, pienennä voimakkuutta tai pidä teksti rauhallisemmalla alueella.

Liikaa

  • Rae näkyy huoneen toiselle puolelle
  • Värit muuttuvat harmaiksi ja likaisiksi
  • Karkeaa, pilvistä kohinaa pienillä komponenteilla
  • Tekstin reunat näyttävät sumeilta pilkutuksen edessä

Sopivasti

  • Rae huomataan vain läheltä
  • Värit pysyvät puhtaina soft-lightilla
  • Hieno rae mitoitettu elementin mukaan
  • Juovittuminen poissa, teksti terävää

CSS-kohinan suorituskyky

Toistuva data-URI on kevyt: selain renderöi pienen ruudun kerran ja toistaa sen, ja staattinen kerros piirretään kerran. Kallis versio on suodattimen käyttäminen elävänä suurella elementillä filter: url(#noise), joka ajaa suodattimen jokaiselle pikselille aina kun alue piirtyy uudelleen. Jos animoit rakeen vilkkuvaa filmiä varten, siirrä toistuvaa kerrosta transformilla muutamassa nykivässä vaiheessa kohinan uudelleen luomisen sijaan ja kytke se pois vähennetylle liikkeelle.

css
.grain {
  overflow: hidden;
}

.grain::after {
  inset: -50%;
  animation: flicker 0.6s steps(3) infinite;
}

@keyframes flicker {
  0%   { transform: translate(0, 0); }
  33%  { transform: translate(-3%, 2%); }
  66%  { transform: translate(2%, -3%); }
}

@media (prefers-reduced-motion: reduce) {
  .grain::after { animation: none; }
}
Animoitu rae liikuttamalla ylisuurta ruutua. Negatiivinen inset pitää reunat peitettyinä sen siirtyessä.

Valmiiksi renderöity PNG- tai WebP-kohinaruutu, jonka koko on noin 128 ja 256 pikselin välillä, on yhtä hyvä lähde, jos sellainen on jo olemassa. Rakeisuus on myös yksi ainesosa laajemmassa pintojen perheessä paperista lasiin, joita käsitellään oppaassa taustatekstuuri. Se on viimeistelykerros myös CSS mesh -liukuvärissä.

Rakeisuus on rakennettu jokaiseen Gradientlyn Markiin materiaaliasetuksena valon ja liikkeen rinnalle, joten sillä tehdyt suunnitelmat kantavat tekstuuria ilman koodia.

Muslin Anvil

GR·W4AX·4M

Muslin Anvil

Katso tämä Mark
Mark, jossa rakeisuus kuuluu materiaaliin ja piirtyy elävästi eikä kerrostu jälkikäteen.

Usein kysyttyä

Miten lisään kohinatekstuurin CSS:llä?

Upota SVG, jossa on feTurbulence-suodatin, data-URI:na, toista se pseudoelementillä liukuvärin päällä ja aseta sekoitustila, kuten soft-light, matalalla peittävyydellä.

Miksi SVG-kohinan data-URI ei näy?

Yleensä koodaamaton merkki. Koodaa data-URI:ssa # muotoon %23, % muotoon %25 ja kulmasulkeet muotoon %3C ja %3E, ja käytä SVG:n sisällä yksinkertaisia lainausmerkkejä.

Korjaako rakeisuus liukuvärin juovittumisen?

Kyllä, useimmissa tapauksissa. Satunnainen hieno vaihtelu rikkoo vierekkäisten sävyjen väliset kovat reunat, joten silmä ei enää näe portaita.

Mitä baseFrequency-arvoa rakeisuuteen kannattaa käyttää?

Noin 0,6 ja 0,9 välillä saat hienon, filmimäisen rakeen. Pienemmät arvot, kuten 0,2, antavat suurta, pilvistä kohinaa.

Onko CSS-kohina huono suorituskyvylle?

Pieni toistuva kohinakuva on kevyt. Eniten maksavat elävät SVG-suodattimet suurilla elementeillä ja jatkuvasti uudelleen luotu kohina.

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