CSS en web

SVG-gradients: lineair, radiaal, lijnen, tekst en maskers

SVG heeft een eigen systeem voor kleurverlopen, ouder dan CSS-gradients en in staat tot dingen die daar niet kunnen: een lijn kleuren, een woord vullen, één verloop delen over veel vormen en alles laten vervagen met een masker.

GradientlyGeverifieerd Gradiently-account··5 min lezen
Cover: Cold Salon · GR·4AB2·SW

De korte versie

  • Een SVG-gradient definieer je één keer als linearGradient- of radialGradient-element met stop-kinderen, je geeft het een id en past het toe door fill of stroke op url(#id) te zetten.
  • Standaard gebruiken de coördinaten van een SVG-gradient objectBoundingBox-eenheden, waarbij 0 en 1 de randen zijn van de vorm die wordt ingekleurd.
  • gradientUnits="userSpaceOnUse" plaatst het verloop in de eigen coördinaten van de tekening, waardoor één verloop meerdere vormen kan overspannen en verlopen op perfect rechte lijnen wel werken.
  • spreadMethod bepaalt wat er voorbij de uiteinden van het verloop gebeurt: pad houdt de eindkleuren vast, reflect spiegelt de overgang en repeat begint opnieuw.
  • Een SVG-masker werkt met helderheid, dus een verloop van wit naar zwart in een masker laat alles vervagen waarop het wordt toegepast.
Op deze pagina

Een SVG gradient is een verf die je één keer definieert en toepast op elke vorm, lijn of tekst in een SVG. Je schrijft een <linearGradient>- of <radialGradient>-element in <defs>, geeft het <stop>-kinderen voor de kleuren en een id, en zet daarna de fill of stroke van een vorm op url(#id). Anders dan een CSS-achtergrond kan het een lijn of één enkel woord kleuren, en het schaalt mee met de tekening.

html
<svg viewBox="0 0 200 120" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <linearGradient id="dusk" x1="0" y1="0" x2="1" y2="1">
      <stop offset="0" stop-color="#1e1b4b" />
      <stop offset="0.55" stop-color="#7c3aed" />
      <stop offset="1" stop-color="#f472b6" />
    </linearGradient>
  </defs>
  <rect width="200" height="120" rx="16" fill="url(#dusk)" />
</svg>
Een diagonaal verloop op een afgeronde rechthoek. x1, y1, x2 en y2 trekken de lijn van het verloop van linksboven naar rechtsonder.
Dezelfde overgang, als CSSlinear-gradient(135deg, #1e1b4b 0%, #7c3aed 55%, #f472b6 100%)
De SVG hierboven en dit CSS-kleurverloop komen overeen op een vierkant. Op een rechthoek rekt de SVG-versie mee met de vorm; zie gradientUnits hieronder.

linearGradient en zijn stops

x1, y1, x2 en y2 bepalen het begin en einde van de lijn van het verloop. Elke <stop> krijgt een offset van 0 tot 1 (of 0% tot 100%), een stop-color en een optionele stop-opacity. stop-color is ook een CSS-eigenschap, dus je kunt verlopen een thema geven vanuit een stylesheet, bijvoorbeeld stop { stop-color: var(--accent); }.

AttribuutStandaardWat het doet
x1 y1 x2 y20 0 1 0, van links naar rechtsBegin- en eindpunt van de lijn van het verloop
gradientUnitsobjectBoundingBoxOf coördinaten relatief zijn aan de vorm of aan de tekening
spreadMethodpadWat er voorbij de uiteinden gebeurt: pad, reflect of repeat
gradientTransformgeenHet verloop draaien, schalen of scheeftrekken, bijv. rotate(30)
hrefgeenStops en instellingen overnemen van een ander verloop
De belangrijkste attributen van linearGradient. radialGradient deelt ze allemaal, behalve de eerste rij.

href bespaart herhaling. Definieer je stops één keer in een basisverloop en maak dan varianten die ernaar verwijzen en alleen de richting of de eenheden veranderen. De MDN-referentie voor linearGradient behandelt elk attribuut.

radialGradient: middelpunt, straal en brandpunt

Een radiaal verloop krijgt een middelpunt (cx, cy) en een straal (r), allemaal standaard 0.5, zodat het de vorm vanuit het midden vult. Het heeft ook iets wat CSS mist: een apart brandpunt (fx, fy) waar de eerste kleur begint. Verschuif je het brandpunt uit het midden, dan lijkt een bol van één kant belicht.

html
<radialGradient id="orb" cx="0.5" cy="0.5" r="0.5" fx="0.32" fy="0.28">
  <stop offset="0" stop-color="#e0f2fe" />
  <stop offset="0.45" stop-color="#0ea5e9" />
  <stop offset="1" stop-color="#082f49" />
</radialGradient>

<circle cx="60" cy="60" r="50" fill="url(#orb)" />
Een brandpunt linksboven maakt van een platte cirkel een glanzende bol.
Belichte bol, benaderd in CSSradial-gradient(circle at 32% 28%, #e0f2fe, #0ea5e9 35%, #082f49 80%)
CSS kan het middelpunt verplaatsen, maar middelpunt en brandpunt niet splitsen, dus dit is slechts een benadering van de SVG-bol. Vergelijk radiale kleurverlopen in CSS.

gradientUnits: objectBoundingBox of userSpaceOnUse

Met de standaard objectBoundingBox betekenen 0 en 1 de randen van de vorm die wordt ingekleurd, dus elke vorm krijgt het hele verloop, passend uitgerekt. Met userSpaceOnUse staan de coördinaten in de eigen eenheden van de SVG, dus het verloop blijft op zijn plek en vormen tonen het deel dat ze bedekken. Zo kan een rij staven één doorlopend verloop delen.

objectBoundingBox

  • Coördinaten van 0 tot 1 over elke vorm
  • Elke vorm toont het volledige verloop
  • Het verloop rekt mee met de verhoudingen van de vorm
  • Werkt niet op een perfect horizontale of verticale lijn

userSpaceOnUse

  • Coördinaten in de eigen eenheden van de tekening
  • Vormen tonen hun deel van één verloop
  • Hoeken blijven kloppen, welke vorm het ook is
  • Werkt op rechte lijnen en dunne lijnen

Kleurverlopen op lijnen en tekst

stroke="url(#id)" kleurt contouren, en zo worden iconen met verloop, voortgangsringen en grafieklijnen getekend. Op <text> kleurt fill="url(#id)" de letters, en de woorden blijven selecteerbaar en doorzoekbaar. Zet een egale kleur achter de URL, zoals fill="url(#dusk) #7c3aed", en die wordt gebruikt als het verloop niet wordt gevonden.

html
<svg viewBox="0 0 320 120" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <linearGradient id="line" gradientUnits="userSpaceOnUse" x1="20" y1="0" x2="300" y2="0">
      <stop offset="0" stop-color="#22d3ee" />
      <stop offset="1" stop-color="#a855f7" />
    </linearGradient>
  </defs>
  <path d="M20 90 C 90 20, 160 110, 300 30" fill="none" stroke="url(#line)" stroke-width="6" stroke-linecap="round" />
  <text x="20" y="115" font-size="20" font-weight="700" fill="url(#line) #7c3aed">Growth</text>
</svg>
Eén verloop in tekeneenheden, gedeeld door een curve en een woord. Beide lopen van cyaan naar paars over dezelfde horizontale breedte.

Voor letters met verloop in HTML in plaats van SVG is gradient-tekst in CSS meestal eenvoudiger. Kies voor SVG-tekst als de woorden deel zijn van een illustratie of logo, of een pad moeten volgen.

spreadMethod: pad, reflect en repeat

Als de lijn van het verloop korter is dan de vorm, bepaalt spreadMethod wat de rest vult. pad houdt de eindkleuren vast, reflect spiegelt de overgang heen en weer, en repeat begint opnieuw met een harde rand. Hier loopt elk verloop van 30% tot 70% van de breedte.

Van teal naar zand met de drie spreidmethoden, nagebouwd in CSS zodat je ze naast elkaar kunt vergelijken.

Vervagen met SVG-maskers

Een masker werkt met helderheid: witte delen tonen wat wordt gemaskeerd, zwarte delen verbergen het, en grijstinten zitten ertussenin. Een verloop van wit naar zwart in een <mask> laat dus elke vorm of afbeelding vloeiend tot niets vervagen. Zo verzacht je de rand van een foto of laat je een grafieklijn aan het begin uitfaden.

html
<defs>
  <linearGradient id="fade" x1="0" y1="0" x2="0" y2="1">
    <stop offset="0.4" stop-color="#fff" />
    <stop offset="1" stop-color="#000" />
  </linearGradient>
  <mask id="soft-bottom">
    <rect width="100%" height="100%" fill="url(#fade)" />
  </mask>
</defs>

<image href="photo.jpg" width="100%" height="100%" mask="url(#soft-bottom)" />
De foto is bovenaan volledig zichtbaar en vervaagt over de onderste 60%.

Voor HTML-elementen doet CSS mask-image: linear-gradient(#000 40%, transparent) hetzelfde, met alfa in plaats van helderheid. De maskertechniek zit ook achter transparante CSS-randen met kleurverloop.

Vermijd

  • Hetzelfde id voor een verloop hergebruiken in twee inline SVG’s op één pagina
  • Een sprite met verloopdefinities verbergen met display: none
  • Standaardeenheden op rechte lijnen
  • Heel lange, gladde, donkere verlopen zonder textuur

Doe

  • Unieke id’s, of één gedeelde sprite met definities
  • Verberg sprites in plaats daarvan met breedte en hoogte nul
  • userSpaceOnUse voor lijnen en gedeelde verlopen
  • Voeg korrel toe aan grote overgangen, zie CSS-ruistextuur

Vragen die mensen stellen

Hoe voeg ik een kleurverloop toe aan een SVG?

Definieer een <linearGradient> of <radialGradient> met <stop>-kinderen en een id in <defs>, en zet daarna de fill of stroke van een vorm op url(#id).

Waarom is mijn SVG-verloop niet zichtbaar op een lijn?

Een rechte horizontale of verticale lijn heeft een begrenzingskader met grootte nul, dus de standaardeenheden objectBoundingBox werken niet. Gebruik gradientUnits="userSpaceOnUse" met echte coördinaten.

Hoe draai ik een SVG-gradient?

Verander x1, y1, x2 en y2, of voeg gradientTransform="rotate(45 0.5 0.5)" toe om rond het midden van het begrenzingskader te draaien.

Kan ik de kleuren van een SVG-gradient met CSS veranderen?

Ja. stop-color en stop-opacity zijn CSS-eigenschappen, dus regels zoals stop { stop-color: var(--accent); } werken op inline SVG.

Waarom verdween mijn SVG-gradient toen ik de SVG verborg?

Definities in een SVG met display: none worden mogelijk niet getekend. Verberg de sprite in plaats daarvan met breedte en hoogte nul, of met absolute positionering.

Deel deze gids

Geschreven door GradientlyGeverifieerd Gradiently-account

Het team achter Gradiently, een ontwerptool rond Marks: levende kleurverlopen die alles wat je ontwerpt op jou laten lijken.

Bekijk ons profiel