CSS og web

CSS-støjtekstur: tilføj korn til gradienter med SVG

Et svagt lag støj skjuler banding og får flad skærmfarve til at føles som tryk eller film. Her er SVG-filteret bag, tunet og klar til at indsætte.

GradientlyVerificeret Gradiently-konto··4 min. læsning
Forside: Muslin Anvil · GR·W4AX·4M

Kort fortalt

  • En CSS-støjtekstur laves som regel med et SVG-feTurbulence-filter, indlejret som et lille data-URI-billede og lagt i fliser over en gradient.
  • feTurbulence-værdien baseFrequency sætter kornstørrelsen: højere værdier giver finere korn, lavere værdier giver groft, skyet støj.
  • Støj virker bedst lagt over gradienten på et pseudoelement med en blandingstilstand som soft-light eller overlay og lav opacity.
  • Korn skjuler gradientbanding, fordi det bryder de synlige kanter mellem nabonuancer op i fin, tilfældig variation.
  • Et flisebelagt støjbillede er billigt at gengive, mens et levende SVG-filter på et stort element, eller en animation af det, koster langt mere.
På denne side

En CSS-støjtekstur er en fin, tilfældig spraglethed lagt over en farve eller gradient for at give den korn. CSS har ingen støjfunktion, så den almindelige kilde er SVG: filteret feTurbulence genererer støj, du pakker det ind i en lille SVG, indlejrer den som en data-URI og lægger den i fliser over din gradient med lav styrke. Resultatet ligner filmkorn eller trykt papir og retter i det stille banding, de synlige trin, der opstår i store, bløde gradienter.

Hvorfor korn får farve til at se mere eksklusiv ud, dækkes i kornede gradienter. Denne guide er implementeringen.

SVG-støjfilteret

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>
En flise på 240 pixel med grå støj. Gem den som noise.svg, eller indlejr den som vist nedenfor.
AttributVærdi herHvad den styrer
typefractalNoiseBlødt, jævnt korn. turbulence giver mere stribet, krusende støj.
baseFrequency0.8Kornstørrelse. Omkring 0,6 til 0,9 er fint korn, 0,1 til 0,3 er skyet.
numOctaves3Lag af detaljer. Ud over omkring 4 er forskellen svær at se.
stitchTilesstitchFår flisens kanter til at passe sammen, så gentagelser ikke har sømme.
feColorMatrix saturate 00Fjerner den tilfældige farve og efterlader gråt korn.
De indstillinger, der betyder noget. MDN’s reference for feTurbulence dokumenterer resten.

Indlejr støj som data-URI

En separat fil virker, men indlejring sparer en forespørgsel og holder effekten ét sted. I en data-URI skal tegn, der betyder noget i URL’er, kodes: < bliver til %3C, > bliver til %3E, # bliver til %23, og % bliver til %25. Brug enkelte anførselstegn inde i SVG’en, så de ikke støder sammen med de dobbelte omkring URL’en.

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");
}
Den samme flise som en brugerdefineret egenskab, du kan genbruge overalt. At glemme at kode # som %23 er den sædvanlige grund til, at den ikke viser noget i Firefox.

Læg støj over en gradient

Læg støjen på et pseudoelement over gradienten, og styr den med to knapper: en blandingstilstand, der afgør, hvordan det grå korn blandes med farven under, og opacity, der afgør, hvor stærk den er. soft-light holder farverne rene og er den blideste. overlay tilføjer mere kontrast. pointer-events: none forhindrer laget i at blokere klik.

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;
}
Korn mellem gradienten og indholdet: teksten inde i .grain forbliver skarp.
Tre gradienter, der får mest ud af korn. Mørke fades med lav kontrast som den i midten er der, hvor banding viser sig først.

Foretrækker du ét enkelt element uden pseudoelement, så list støjen først i background-image, og sæt background-blend-mode: soft-light, normal. Du mister den separate opacity-knap, så bag styrken ind i SVG’en i stedet, for eksempel med opacity='0.5' på rect.

Hvor meget korn er nok

  1. 1

    Start svagt

    Begynd ved opacity: 0.3 med soft-light. Du bør næsten ikke lægge mærke til det i en armslængdes afstand.

  2. 2

    Tjek det mørkeste område

    Banding bor i mørke, langsomme fades. Hæv opacity, til trinene dér opløses, og stop så.

  3. 3

    Tilpas kornet til størrelsen

    Helskærmsheroer kan tåle lidt grovere korn, omkring 0,6. Kort og knapper vil have fint korn, omkring 0,9.

  4. 4

    Tjek på en telefon og en stor skærm

    Korn, der ser rigtigt ud på én skærm, kan ligne støv på en anden. Sigt efter tekstur, du mærker, frem for ser.

  5. 5

    Tjek teksten ovenpå

    Korn må ikke forringe læsbarheden. Ligger lille tekst på teksturen, så sænk styrken, eller hold teksten på et roligere område.

For meget

  • Korn synligt fra den anden side af rummet
  • Farverne bliver grå og snavsede
  • Groft, skyet støj på små komponenter
  • Tekstkanter ser slørede ud mod spragletheden

Omtrent rigtigt

  • Korn, der kun opdages på tæt hold
  • Farverne forbliver rene med soft-light
  • Fint korn tilpasset elementets størrelse
  • Banding væk, tekst skarp

Ydeevne for CSS-støj

En flisebelagt data-URI er billig: browseren gengiver den lille flise én gang og gentager den, og et statisk lag tegnes én gang. Den dyre version er at anvende filteret live på et stort element med filter: url(#noise), som kører filteret over hver pixel, hver gang området gentegnes. Animerer du korn, til et flimrende filmudtryk, så flyt det flisebelagte lag med transform i nogle få hakkende trin i stedet for at generere støj igen, og slå det fra ved reduceret bevægelse.

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; }
}
Animeret korn ved at flytte en overstor flise. Den negative inset holder kanterne dækket, mens den flytter sig.

En forrenderet PNG- eller WebP-støjflise på omkring 128 til 256 pixel er en lige så god kilde, hvis du allerede har en. Korn er også én ingrediens i en bredere familie af overflader, fra papir til glas, dækket i baggrundstekstur. Det er også det afsluttende lag på en CSS mesh gradient.

Korn er indbygget i hvert Gradiently-Mark som en materialeindstilling ved siden af lys og bevægelse, så designs lavet med ét bærer tekstur uden nogen kode.

Muslin Anvil

GR·W4AX·4M

Muslin Anvil

Se denne Mark
Et Mark med korn som en del af sit materiale, gengivet live og ikke lagt på bagefter.

Spørgsmål, folk stiller

Hvordan tilføjer jeg en støjtekstur i CSS?

Indlejr en SVG med et feTurbulence-filter som data-URI, læg den i fliser på et pseudoelement over din gradient, og sæt en blandingstilstand som soft-light med lav opacity.

Hvorfor vises min SVG-støj-data-URI ikke?

Som regel et ukodet tegn. Kod # som %23, % som %25 og vinkelparenteserne som %3C og %3E i data-URI’en, og brug enkelte anførselstegn inde i SVG’en.

Retter korn gradientbanding?

Ja, i de fleste tilfælde. Tilfældig fin variation bryder de hårde kanter mellem nabonuancer op, så øjet ikke længere ser trin.

Hvilken baseFrequency skal jeg bruge til korn?

Omkring 0,6 til 0,9 giver fint, filmagtigt korn. Lavere værdier som 0,2 giver stor, skyet støj.

Er CSS-støj dårlig for ydeevnen?

Et lille flisebelagt støjbillede er billigt. Levende SVG-filtre på store elementer og konstant genereret støj er det, der koster mest.

Del denne guide

Skrevet af GradientlyVerificeret Gradiently-konto

Holdet bag Gradiently, et designværktøj bygget om Marks: levende gradienter, der får alt, du designer, til at ligne dig.

Se vores profil