CSS och webb

CSS-gradient med OKLCH-interpolering för mjukare övergångar

De flesta trista gradienter med grå mitt är inte ett färgproblem utan ett matematikproblem. Två ord, in oklch, ändrar var webbläsaren gör beräkningen.

GradientlyVerifierat Gradiently-konto··5 minuters läsning
Omslag: Marsh of Ink · GR·1EQ7·TN

Kortversionen

  • CSS-gradienter blandas i sRGB som standard när alla färger skrivs som hex, rgb() eller hsl(), vilket ofta gör mitten av en övergång trist eller grå.
  • Om du lägger till in oklch eller in oklab i en gradient blandar webbläsaren i ett perceptuellt färgrum, vilket håller ljusheten jämn och färgerna rena.
  • in oklab tar den rakaste vägen mellan två färger, medan in oklch färdas runt nyanscirkeln och håller mättnaden hög.
  • Nyansnyckelord som shorter hue, longer hue, increasing hue och decreasing hue väljer åt vilket håll en oklch-gradient färdas runt färgcirkeln.
  • Webbläsare ignorerar deklarationer de inte kan tolka, så att skriva en sRGB-gradient först och oklch-versionen efter den är en säker reservlösning.
På den här sidan

OKLCH i CSS-gradienter innebär att du ber webbläsaren räkna ut gradientens mellanfärger i färgrummet OKLCH i stället för i sRGB. Du lägger till två ord efter riktningen: linear-gradient(90deg in oklch, #2563eb, #facc15). Resultatet är en övergång vars ljushet ändras jämnt och vars mitt förblir levande, i stället för att sjunka ned i det grå, sladdriga band som vanliga sRGB-övergångar är kända för.

Blått till gult på tre sätt. sRGB passerar grått, oklab förblir ren och neutral, oklch behåller full färg genom att färdas via turkos och grönt.

Därför blir sRGB-gradienter grå

sRGB utformades för att koda skärmfärger effektivt, inte för att matcha hur människor ser. Att blanda två sRGB-färger innebär att räkna ut medelvärdet av deras röda, gröna och blå tal, och halvvägs mellan ett blått och ett gult finns en uppsättning medelmåttiga tal som ser grå ut. Ljusheten ändras också ojämnt, så vissa övergångar buktar ljusare eller mörkare i mitten. Designsidan av problemet finns i sladdriga gradienter.

Oklab och dess cylindriska form, OKLCH, utformades så att lika steg i deras tal ser ut som ungefär lika steg för ögat. Att blanda i dem håller den upplevda ljusheten i jämn rörelse, vilket är varför gradienter gjorda så ser mjukare och ljusare ut med samma ändpunkter.

Syntaxen: in oklch och in oklab

Interpoleringsmetoden står i det första argumentet, före eller efter riktningen. Den fungerar i linear-gradient(), radial-gradient(), conic-gradient() och deras upprepande former, och även i color-mix(). Dina färgstopp kan förbli i hex, bara matematiken ändras.

css
/* direction first or interpolation first: both are valid */
background: linear-gradient(135deg in oklch, #7c3aed, #f97316);
background: linear-gradient(in oklch 135deg, #7c3aed, #f97316);

/* works in the other gradient functions too */
background: radial-gradient(in oklab circle at 30% 30%, #22d3ee, #1e1b4b);
background: conic-gradient(in oklch from 90deg, #ef4444, #3b82f6, #ef4444);
Bara blandningen ändras, färgstoppen förblir som de skrivits.
FärgrumHur det blandarAnvänd det för
srgbMedelvärde av rött, grönt och blåttAtt matcha äldre designer exakt
srgb-linearMedelvärde av fysiskt ljusLjusblandande effekter, mittpunkterna ser ljusa ut
oklabRak linje genom ett perceptuellt rumDe flesta övergångar och alla toningar mot vitt, svart eller grått
oklchRunt nyanscirkeln med jämn färgmättnadLevande övergångar mellan flera nyanser, regnbågar, solnedgångar
hslRunt nyanscirkeln, inte perceptuelltFärgcirklar, ljusheten är ojämn
De färgrum du oftast använder. MDN:s sida om color-interpolation-method listar alla.

oklab eller oklch: vilket ska du välja

Båda är perceptuella, de skiljer sig i vägen de tar. Oklab drar en rak linje mellan de två färgerna, så mitten kan tappa lite mättnad när ändarna ligger långt ifrån varandra på färgcirkeln, men den vandrar aldrig genom en nyans du inte bad om. OKLCH behåller chroma, färgens intensitet, och går runt nyanscirkeln, så mitten förblir mättad men passerar de nyanser som ligger emellan. Blått till gult i oklch går via grönt. Ibland är det poängen, ibland är det en överraskning.

Oklab håller sig på den direkta vägen, oklch sveper genom nyanserna mellan sina ändar: rosa till turkos passerar violett och blått, violett till orange passerar magenta och rött.

Att välja nyansriktning

Mellan två nyanser finns det två vägar runt färgcirkeln. Som standard tar oklch den shorter hue. Du kan be om longer hue, eller tvinga en riktning med increasing hue eller decreasing hue. Nyckelordet placeras direkt efter färgrummet.

Den korta vägen från rött till blått passerar magenta och violett. Den långa vägen passerar orange, gult, grönt och cyan.

longer hue är det prydligaste sättet att rita ett spektrum: två stopp i stället för sju. Det är också så du gör en hel regnbågsgradient vars färger alla känns lika ljusa, vilket en sRGB-regnbåge aldrig riktigt klarar.

Att skriva färger i oklch()

Du kan också skriva själva stoppen i OKLCH: oklch(L C H), där L är ljushet från 0 % till 100 %, C är chroma från 0 upp till ungefär 0,37 och H är nyansvinkeln. Om du håller L lika över stoppen får du en gradient med lika ljushet, vilket är svårt att göra med ögonmått i hex. oklch.com är en bra väljare för att hitta värden.

css
.band {
  /* same lightness and chroma, only the hue changes */
  background: linear-gradient(
    90deg in oklch,
    oklch(68% 0.17 300),
    oklch(68% 0.17 20),
    oklch(68% 0.17 70)
  );
}
Violett via korall till bärnsten i samma ljushet: inget stopp sticker ut som ljusare än de andra.
Lika ljushet: violett, korall, bärnstenlinear-gradient(90deg in oklch, oklch(68% 0.17 300), oklch(68% 0.17 20), oklch(68% 0.17 70))
Koden ovan, renderad. Färger utanför en skärms omfång mappas till den närmaste färg den kan visa.

Webbläsarstöd och reservlösningar

Interpoleringsmetoder och oklch()-färger stöds i nuvarande Chrome, Edge, Safari och Firefox. Webbläsare hoppar över varje deklaration de inte kan tolka, så reservlösningen är helt enkelt att skriva den vanliga versionen först. Där den förbättrade raden ignoreras blir sRGB-gradienten kvar.

css
.hero {
  background-color: #7c3aed;
  background-image: linear-gradient(135deg, #7c3aed, #f97316);
  background-image: linear-gradient(135deg in oklch, #7c3aed, #f97316);
}
Enfärgad yta, sedan sRGB, sedan oklch. Varje webbläsare behåller den sista raden den förstår.

Om du vill gå längre passar perceptuella övergångar bra ihop med korn för att förhindra gradientbanding, och med stopp- och hint-teknikerna i guiden om CSS linear-gradient.

Vanliga frågor

Vad gör in oklch i en CSS-gradient?

Det får webbläsaren att räkna ut mellanfärgerna i färgrummet OKLCH, vilket håller ljusheten jämn och färgerna mättade i stället för att blanda via grått.

Ska jag använda oklab eller oklch för gradienter?

Använd oklch för levande övergångar mellan olika nyanser och oklab för toningar mot vitt, svart eller grått, eller när du inte vill att övergången ska passera extra nyanser.

Varför går min oklch-gradient via grönt?

OKLCH färdas runt nyanscirkeln, och mellan blått och gult passerar den kortare vägen grönt. Använd in oklab för en direkt väg, eller lägg till ett mittstopp.

Måste jag skriva färger i oklch() för att använda oklch-interpolering?

Nej. Hexfärger fungerar bra med in oklch, bara blandningen ändras. Att skriva stopp i oklch() är användbart när du vill styra ljusheten exakt.

Vad händer i webbläsare som inte stöder in oklch?

De ignorerar hela deklarationen. Lägg en vanlig sRGB-gradient på raden före, så behåller de webbläsarna den.

Dela den här guiden

Skriven av GradientlyVerifierat Gradiently-konto

Teamet bakom Gradiently, ett designverktyg byggt kring Marks: levande gradienter som får allt du gör att kännas som ditt.

Se vår profil