Marknaden
Priser
Logga inKom igång
FältguidenCSS och webb
CSS och webb

Gradient i HTML canvas: createLinearGradient, radiell och konisk

Gradienter i canvas tar koordinater där CSS tar vinklar, och just den skillnaden orsakar det mesta av förvirringen. Här är varje gradientmetod med kod som fungerar, och en hjälpfunktion som gör om en CSS-vinkel till punkter i canvas.

GradientlyVerifierat Gradiently-konto·1 oktober 2026·5 minuters läsning
Omslag: Citron Valley · GR·XXAV·HJ

Kortversionen

  • En gradient i HTML canvas är ett CanvasGradient-objekt som skapas med createLinearGradient, createRadialGradient eller createConicGradient, får färgstopp med addColorStop och tilldelas fillStyle eller strokeStyle.
  • Gradienter i canvas använder koordinater i canvasrymden, inte vinklar eller procent, så en linjär gradient behöver en startpunkt och en slutpunkt.
  • Färgstoppens förskjutningar går från 0 till 1, och vilken CSS-färgsträng som helst accepteras, inklusive hex, rgb(), hsl() och oklch() i aktuella webbläsare.
  • createConicGradient startar sin svepning från en linje som pekar åt höger och mäter vinkeln i radianer, till skillnad från CSS conic-gradient, som startar högst upp och räknar i grader.
  • På skärmar med hög täthet bör du storleksanpassa canvasbufferten med devicePixelRatio, annars ser gradienter och text mjuka ut.
På den här sidan
De tre gradientmetodernacreateLinearGradient och CSS-vinklarcreateRadialGradientcreateConicGradientGradienttext, konturer och animationAtt spara canvasen som bildVanliga problem med gradienter i canvas

En gradient i HTML canvas tar tre steg: skapa ett gradientobjekt med ctx.createLinearGradient(), createRadialGradient() eller createConicGradient(), lägg till färger med addColorStop(offset, colour) och tilldela det sedan till ctx.fillStyle och rita. Till skillnad från CSS definieras en gradient i canvas av punkter i pixlar, så du talar om exakt var färgen börjar och slutar. Allt du målar med den fyllningen får den del av gradienten som ligger under.

js
const canvas = document.querySelector('canvas')
const ctx = canvas.getContext('2d')

const g = ctx.createLinearGradient(0, 0, canvas.width, canvas.height)
g.addColorStop(0, '#1e1b4b')
g.addColorStop(0.55, '#7c3aed')
g.addColorStop(1, '#f472b6')

ctx.fillStyle = g
ctx.fillRect(0, 0, canvas.width, canvas.height)
Den minsta fungerande gradienten i canvas: en diagonal från det övre vänstra hörnet till det nedre högra.

De tre gradientmetoderna

createLinearGradient

Argument

x0, y0, x1, y1

CSS-motsvarighet

linear-gradient()
createRadialGradient

Argument

x0, y0, r0, x1, y1, r1

CSS-motsvarighet

radial-gradient()
createConicGradient

Argument

startAngle, x, y

CSS-motsvarighet

conic-gradient()
addColorStop

Argument

offset 0 till 1, colour

CSS-motsvarighet

Ett färgstopp med procent
MetodArgumentCSS-motsvarighet
createLinearGradientx0, y0, x1, y1linear-gradient()
createRadialGradientx0, y0, r0, x1, y1, r1radial-gradient()
createConicGradientstartAngle, x, yconic-gradient()
addColorStopoffset 0 till 1, colourEtt färgstopp med procent
Varje metod returnerar ett CanvasGradient. Du kan spara det i en variabel och återanvända det för hur många former du vill.

Gradienten är fäst vid canvasen, inte vid formen. Om du skapar en gradient från 0 till 400 och sedan fyller en liten kvadrat vid x 300 visar kvadraten bara den rosa änden. Det överraskar den som kommer från CSS, där en gradient alltid sträcker sig över elementet. Skapa gradienten med formens egna koordinater när du vill att den ska passa.

createLinearGradient och CSS-vinklar

I CSS kan du skriva 135deg. Canvas vill ha två punkter. Den här hjälpfunktionen omvandlar en CSS-vinkel till samma start- och slutpunkter som CSS använder, så en design skriven som en linjär gradient i CSS återges identiskt i canvas.

js
// Match CSS linear-gradient(angle) on a w by h rectangle
function cssAngleGradient(ctx, angleDeg, x, y, w, h) {
  const a = (angleDeg * Math.PI) / 180
  const len = Math.abs(w * Math.sin(a)) + Math.abs(h * Math.cos(a))
  const cx = x + w / 2
  const cy = y + h / 2
  const dx = (Math.sin(a) * len) / 2
  const dy = (-Math.cos(a) * len) / 2
  return ctx.createLinearGradient(cx - dx, cy - dy, cx + dx, cy + dy)
}

const g = cssAngleGradient(ctx, 135, 0, 0, 1200, 630)
g.addColorStop(0, '#0f172a')
g.addColorStop(1, '#0d9488')
ctx.fillStyle = g
ctx.fillRect(0, 0, 1200, 630)
I CSS pekar 0deg uppåt och vinklar vrids medurs. Längdformeln gör att hörnen landar exakt på första och sista färgen, som i CSS.
Samma gradient i CSSlinear-gradient(135deg, #0f172a 0%, #0d9488 100%)
Vad hjälpfunktionen ovan ritar på en canvas på 1200×630, storleken på en Open Graph-bild. Om dina vinklar ser fel ut förklarar gradientvinkel hur CSS mäter dem.

createRadialGradient

En radiell gradient i canvas definieras av två cirklar: en startcirkel och en slutcirkel. Färgstopp 0 ligger på den första cirkeln och stopp 1 på den andra. För det mesta vill du att den första cirkeln ska vara en punkt, så dess radie är 0.

js
const w = canvas.width
const h = canvas.height

// A soft light in the top right corner of a dark ground
ctx.fillStyle = '#0c0a1d'
ctx.fillRect(0, 0, w, h)

const glow = ctx.createRadialGradient(w * 0.75, h * 0.2, 0, w * 0.75, h * 0.2, w * 0.6)
glow.addColorStop(0, 'rgb(124 58 237 / 0.9)')
glow.addColorStop(0.5, 'rgb(46 16 101 / 0.5)')
glow.addColorStop(1, 'rgb(12 10 29 / 0)')

ctx.fillStyle = glow
ctx.fillRect(0, 0, w, h)
Om du låter sista stoppet tona till genomskinligt kan du stapla flera ljus på en botten, så byggs lagrade bakgrunder.

Flytta mitten på den första cirkeln bort från den andra så lutar ljuset, som en strålkastare som träffar en vägg i vinkel. CSS har ingen direkt motsvarighet till den förskjutningen. För CSS-sidan, se radiella gradienter i CSS.

createConicGradient

createConicGradient(startAngle, x, y) sveper färg runt en mittpunkt. Två detaljer skiljer sig från CSS: vinkeln anges i radianer, och 0 pekar åt höger (klockan tre), inte uppåt. För att matcha en CSS-gradient conic-gradient(from 0deg, ...) startar du vid -Math.PI / 2.

js
const cx = canvas.width / 2
const cy = canvas.height / 2

const ring = ctx.createConicGradient(-Math.PI / 2, cx, cy)
ring.addColorStop(0, '#22d3ee')
ring.addColorStop(0.33, '#7c3aed')
ring.addColorStop(0.66, '#f472b6')
ring.addColorStop(1, '#22d3ee')

ctx.fillStyle = ring
ctx.beginPath()
ctx.arc(cx, cy, 160, 0, Math.PI * 2)
ctx.fill()
Om du upprepar första färgen vid offset 1 döljs skarven. createConicGradient fungerar i aktuella Chrome, Edge, Safari och Firefox.
De tre exemplen från den här artikeln, visade som sina CSS-tvillingar. Koniska gradienter i CSS går djupare in på den koniska varianten.

Gradienttext, konturer och animation

fillStyle och strokeStyle accepterar båda en gradient, så text och konturer fungerar på samma sätt. Sätt gradienten över textens egen ruta, mätt med measureText(), så att hela färgspannet syns inuti bokstäverna.

js
ctx.font = '700 96px Inter, system-ui, sans-serif'
const text = 'Open late'
const width = ctx.measureText(text).width

const tg = ctx.createLinearGradient(80, 0, 80 + width, 0)
tg.addColorStop(0, '#fde68a')
tg.addColorStop(1, '#fb7185')
ctx.fillStyle = tg
ctx.fillText(text, 80, 200)

// Animation: rebuild the gradient each frame, it is cheap
function frame(t) {
  const shift = (Math.sin(t / 2000) + 1) / 2
  const g = ctx.createLinearGradient(0, 0, canvas.width, 0)
  g.addColorStop(0, '#1e1b4b')
  g.addColorStop(0.2 + shift * 0.6, '#7c3aed')
  g.addColorStop(1, '#0f172a')
  ctx.fillStyle = g
  ctx.fillRect(0, 0, canvas.width, canvas.height)
  requestAnimationFrame(frame)
}
requestAnimationFrame(frame)
Du kan inte flytta eller ta bort ett stopp när det är tillagt, så animera genom att skapa en ny gradient varje bildruta. Pausa loopen för användare som föredrar minskad rörelse.

Att spara canvasen som bild

En vanlig anledning att rita gradienter i canvas är att skapa en bild: ett delningskort, ett certifikat, ett omslag. Anropa canvas.toBlob() med image/png för gradienter och text, eftersom PNG bevarar mjuka övergångar intakta, och använd JPEG bara när bilden mest är ett fotografi. PNG mot JPG förklarar avvägningen. Rita i den verkliga utdatastorleken, som 1200×630 för en länkförhandsvisning, i stället för att skala upp en liten canvas.

js
canvas.toBlob((blob) => {
  const a = document.createElement('a')
  a.href = URL.createObjectURL(blob)
  a.download = 'card.png'
  a.click()
  setTimeout(() => URL.revokeObjectURL(a.href), 1000)
}, 'image/png')
Ladda ner den färdiga canvasen som PNG. På en server körs samma ritkod med ett canvasbibliotek för Node.

Vanliga problem med gradienter i canvas

Symptom

  • Gradienten ser suddig ut på en telefon
  • Bara en färg syns i en form
  • Synliga ränder i en mörk gradient
  • IndexSizeError från addColorStop
  • Den koniska gradienten startar på fel ställe

Lösning

  • Multiplicera canvasens bredd och höjd med devicePixelRatio och skala sedan tillbaka med ctx.scale()
  • Skapa gradienten med formens koordinater, inte canvasens
  • Lägg lite brus ovanpå, se gradientbandning
  • Håll förskjutningarna mellan 0 och 1
  • Starta vid -Math.PI / 2 för att matcha CSS

Bredare färg på kapabla skärmar

Chrome och Safari accepterar canvas.getContext('2d', { colorSpace: 'display-p3' }), vilket låter klara gradienter använda det bredare P3-området. Webbläsare som inte stöder det faller tillbaka på sRGB.

När du behöver gradienter som rör sig med verklig belysning snarare än platta övergångar når canvas sin gräns och WebGL tar över, vilket beskrivs i shadergradienter. Och när canvasen bara är ett medel för att få en bild, som ett socialt kort eller en affisch, renderar Gradiently en Mark i vilken storlek som helst från 200 till 8 000 px med orden utlagda åt dig, så det finns ingen ritkod att underhålla.

Designa med en levande gradient

Inlägg, stories, presentationer och banners i alla storlekar, med text som alltid går att läsa.

Börja designa, gratis

Vanliga frågor

Hur gör jag en gradient i en HTML canvas?

Anropa ctx.createLinearGradient(x0, y0, x1, y1), lägg till färger med addColorStop(offset, colour), sätt ctx.fillStyle till gradienten och rita en form som fillRect.

Vad är skillnaden mellan createLinearGradient och CSS linear-gradient?

Canvas använder en startpunkt och en slutpunkt i pixlar, medan CSS använder en vinkel och sträcker gradienten över elementet. En liten hjälpfunktion kan omvandla en CSS-vinkel till punkter i canvas.

Kan jag använda oklch- eller hsl-färger i addColorStop?

Ja. addColorStop accepterar vilken CSS-färgsträng som helst som webbläsaren förstår, inklusive hex, rgb(), hsl() och, i aktuella webbläsare, oklch().

Varför visar min gradient i canvas bara en färg?

Gradienten är placerad i canvaskoordinater, så en form som ritas utanför dess start- och slutpunkter får bara närmaste ändfärg. Skapa gradienten utifrån formens position och storlek.

Hur animerar jag en gradient i canvas?

Skapa en ny gradient i varje animationsruta med uppdaterade stopp eller koordinater och rita om. Stoppen i en gradient kan inte flyttas eller tas bort när de är tillagda.

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

På den här sidan

De tre gradientmetodernacreateLinearGradient och CSS-vinklarcreateRadialGradientcreateConicGradientGradienttext, konturer och animationAtt spara canvasen som bildVanliga problem med gradienter i canvas

Dela den här guiden

Nästa i CSS och webb

SVG feTurbulence: brus-, korn- och texturfilter

Läs vidare

Alla guider om CSS och webb
CSS och webb

CSS linear-gradient: den kompletta guiden till linear-gradient()

6 minuters läsning

Varje del av linear-gradient() förklarad med ett levande exempel bredvid koden, från standardriktningen till hårda stopp, lagerlagd glans och mjukare OKLCH-övergångar.

CSS och webb

CSS konisk gradient: cirklar, cirkeldiagram och glans

4 minuters läsning

conic-gradient() sveper färg runt en punkt som visaren på en klocka. Den enda idén ritar färgcirklar, cirkeldiagram, ringdiagram, metallglans och strålkransar.

Gradienter

Därför har din gradient ränder, och så åtgärdar du bandning

5 minuters läsning

Du gjorde en jämn gradient och den blev randig. Det är bandning, och den har en enkel orsak och en handfull pålitliga lösningar. Här är räkneexemplet, sedan botemedlen.

Hitta looken som bara är din.

Varje Mark är en levande bakgrund med en enda ägare. Prova en ledig Mark och säkra din när det känns rätt.

Börja designa

Kontrollera ett certifikat

Skriv ett certifikatnummer eller en Marks kod för att se vem som äger den.

Fungerar med ChatGPT och Claude

Be din AI om en design. Den skapar den i din Mark, redo att redigera.

ChatGPTClaude
Så ansluter du

Produkt

  • Marknaden
  • Utforska
  • Priser
  • Certifikat

Lär dig

  • Fältguiden
  • Hjälpcenter
  • Nyheter

Utvecklare

  • Översikt
  • ChatGPT och Claude
  • API-referens
  • API-nycklar

Företaget

  • Om oss
  • Kontakta oss
  • Logga in

Juridik

  • Villkor
  • Integritet
  • Återbetalningar
  • Mark-skydd
  • Cookies
  • Alla policyer
Rör dig över bokstäverna. Var och en bär en riktig Mark.Tryck på en bokstav för att se dess Mark.Ett namn. Tio Marks inuti.
© 2026 Gradiently