CSS und Web

SVG-Farbverläufe: linear, radial, Konturen, Text und Masken

SVG hat ein eigenes Verlaufssystem, älter als CSS-Farbverläufe und fähig zu Dingen, die diese nicht können: eine Kontur färben, ein Wort füllen, einen Verlauf über viele Formen teilen und alles mit einer Maske ausblenden.

GradientlyVerifiziertes Gradiently-Konto··5 Min. Lesezeit
Cover: Cold Salon · GR·4AB2·SW

Die Kurzfassung

  • Ein SVG-Farbverlauf wird einmal als linearGradient- oder radialGradient-Element mit stop-Kindern definiert, bekommt eine id und wird mit fill oder stroke auf url(#id) angewendet.
  • Standardmäßig nutzen die Koordinaten eines SVG-Farbverlaufs objectBoundingBox-Einheiten, bei denen 0 und 1 die Ränder der gefüllten Form sind.
  • gradientUnits="userSpaceOnUse" setzt den Verlauf in die eigenen Koordinaten der Zeichnung, sodass ein Verlauf mehrere Formen überspannen kann und Verläufe auf exakt geraden Linien funktionieren.
  • spreadMethod entscheidet, was jenseits der Enden des Verlaufs passiert: pad hält die Endfarben, reflect spiegelt den Übergang und repeat startet ihn neu.
  • Eine SVG-Maske arbeitet mit Helligkeit, also blendet ein Verlauf von Weiß zu Schwarz in einer Maske alles aus, worauf sie angewendet wird.
Auf dieser Seite

Ein SVG-Farbverlauf ist eine Füllung, die du einmal definierst und auf jede Form, Linie oder jedes Textstück in einem SVG anwendest. Du schreibst ein Element <linearGradient> oder <radialGradient> in <defs>, gibst ihm <stop>-Kinder für seine Farben und eine id und setzt dann fill oder stroke einer Form auf url(#id). Anders als ein CSS-Hintergrund kann er eine Kontur oder ein einzelnes Wort färben, und er skaliert mit der Zeichnung.

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>
Ein diagonaler Farbverlauf auf einem abgerundeten Rechteck. x1, y1, x2 und y2 ziehen die Linie des Verlaufs von oben links nach unten rechts.
Derselbe Übergang als CSSlinear-gradient(135deg, #1e1b4b 0%, #7c3aed 55%, #f472b6 100%)
Das SVG oben und dieser CSS-Farbverlauf stimmen auf einem Quadrat überein. Auf einem Rechteck dehnt sich die SVG-Version mit der Form, siehe gradientUnits weiter unten.

linearGradient und seine Stopps

x1, y1, x2 und y2 legen Anfang und Ende der Verlaufslinie fest. Jeder <stop> nimmt einen offset von 0 bis 1 (oder 0 % bis 100 %), eine stop-color und optional eine stop-opacity. stop-color ist auch eine CSS-Eigenschaft, also kannst du Verläufe aus einem Stylesheet heraus gestalten, zum Beispiel mit stop { stop-color: var(--accent); }.

AttributStandardWas es macht
x1 y1 x2 y20 0 1 0, von links nach rechtsAnfangs- und Endpunkt der Verlaufslinie
gradientUnitsobjectBoundingBoxOb sich die Koordinaten auf die Form oder die Zeichnung beziehen
spreadMethodpadWas jenseits der Enden passiert: pad, reflect oder repeat
gradientTransformkeinerDen Verlauf drehen, skalieren oder neigen, z. B. rotate(30)
hrefkeinerStopps und Einstellungen von einem anderen Verlauf erben
Die wichtigsten Attribute von linearGradient. radialGradient teilt alle außer der ersten Zeile.

href spart Wiederholung. Definiere deine Stopps einmal in einem Basisverlauf und leg dann Varianten an, die darauf verweisen und nur Richtung oder Einheiten ändern. Die MDN-Referenz zu linearGradient behandelt jedes Attribut.

radialGradient: Mittelpunkt, Radius und Brennpunkt

Ein radialer Verlauf nimmt einen Mittelpunkt (cx, cy) und einen Radius (r), alle standardmäßig 0,5, er füllt die Form also von der Mitte aus. Er hat außerdem etwas, das CSS fehlt: einen eigenen Brennpunkt (fx, fy), an dem die erste Farbe beginnt. Rückst du den Brennpunkt aus der Mitte, wirkt eine Kugel wie von einer Seite beleuchtet.

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)" />
Ein Brennpunkt oben links macht aus einem flachen Kreis eine glänzende Kugel.
Beleuchtete Kugel, in CSS angenähertradial-gradient(circle at 32% 28%, #e0f2fe, #0ea5e9 35%, #082f49 80%)
CSS kann den Mittelpunkt verschieben, aber Mittelpunkt und Brennpunkt nicht trennen, das ist also nur eine Annäherung an die SVG-Kugel. Vergleiche CSS radialer Farbverlauf.

gradientUnits: objectBoundingBox oder userSpaceOnUse

Mit dem Standard objectBoundingBox bedeuten 0 und 1 die Ränder der jeweils gefüllten Form, also bekommt jede Form den ganzen Verlauf, passend gedehnt. Mit userSpaceOnUse stehen die Koordinaten in den eigenen Einheiten des SVG, der Verlauf bleibt also an seinem Platz, und Formen zeigen den Teil, den sie überdecken. So kann eine Reihe von Balken einen durchgehenden Verlauf teilen.

objectBoundingBox

  • Koordinaten von 0 bis 1 über jede Form
  • Jede Form zeigt den ganzen Verlauf
  • Der Verlauf dehnt sich mit den Proportionen der Form
  • Scheitert an exakt waagrechten oder senkrechten Linien

userSpaceOnUse

  • Koordinaten in den eigenen Einheiten der Zeichnung
  • Formen zeigen ihren Ausschnitt eines Verlaufs
  • Winkel bleiben richtig, egal welche Form
  • Funktioniert auf geraden Linien und dünnen Konturen

Farbverläufe auf Konturen und Text

stroke="url(#id)" malt Umrisse, so entstehen Verlaufs-Icons, Fortschrittsringe und Diagrammlinien. Auf <text> färbt fill="url(#id)" die Buchstaben, und die Worte bleiben auswählbar und durchsuchbar. Setz eine flache Farbe hinter die URL, etwa fill="url(#dusk) #7c3aed", dann wird sie genutzt, wenn der Verlauf nicht gefunden wird.

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>
Ein Verlauf in Zeichnungseinheiten, geteilt von einer Kurve und einem Wort. Beide laufen über dieselbe waagrechte Strecke von Cyan zu Lila.

Für Verlaufsschrift in HTML statt SVG ist Farbverlaufstext in CSS meist einfacher. Greif zu SVG-Text, wenn die Worte Teil einer Illustration oder eines Logos sind oder einem Pfad folgen sollen.

spreadMethod: pad, reflect und repeat

Ist die Verlaufslinie kürzer als die Form, entscheidet spreadMethod, was den Rest füllt. pad hält die Endfarben, reflect spiegelt den Übergang hin und her, und repeat beginnt ihn mit harter Kante neu. Hier läuft jeder Verlauf von 30 % bis 70 % der Breite.

Petrol zu Sand mit den drei Methoden, in CSS nachgebaut, damit du sie nebeneinander vergleichen kannst.

Ausblenden mit SVG-Masken

Eine Maske arbeitet mit Helligkeit: Weiße Bereiche zeigen, was maskiert ist, schwarze verbergen es, und Grautöne liegen dazwischen. Ein Verlauf von Weiß zu Schwarz in einer <mask> blendet also jede Form und jedes Bild weich ins Nichts aus. So machst du den Rand eines Fotos weicher oder lässt eine Diagrammlinie an ihrem Anfang ausblenden.

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)" />
Das Foto ist oben voll sichtbar und blendet über seine unteren 60 % aus.

Für HTML-Elemente erledigt CSS mask-image: linear-gradient(#000 40%, transparent) dieselbe Aufgabe, mit Alpha statt Helligkeit. Die Maskentechnik steckt auch hinter transparenten CSS-Farbverlaufsrahmen.

Vermeiden

  • Dieselbe Verlaufs-id in zwei Inline-SVGs auf einer Seite
  • Einen Sprite mit Verlaufsdefinitionen per display: none verstecken
  • Standardeinheiten auf geraden Linien
  • Sehr lange, weiche, dunkle Verläufe ohne Textur

Besser

  • Eindeutige ids oder ein gemeinsamer Sprite mit Definitionen
  • Sprites stattdessen mit null Breite und Höhe verstecken
  • userSpaceOnUse für Konturen und geteilte Verläufe
  • Großen Ausblendungen Körnung geben, siehe CSS-Rauschtextur

Häufige Fragen

Wie füge ich einem SVG einen Farbverlauf hinzu?

Definiere in <defs> ein <linearGradient> oder <radialGradient> mit <stop>-Kindern und einer id und setz dann fill oder stroke einer Form auf url(#id).

Warum ist meine SVG-Verlaufskontur auf einer Linie nicht zu sehen?

Eine gerade waagrechte oder senkrechte Linie hat eine Bounding Box der Größe null, also scheitern die Standardeinheiten objectBoundingBox. Nutze gradientUnits="userSpaceOnUse" mit echten Koordinaten.

Wie drehe ich einen SVG-Farbverlauf?

Ändere x1, y1, x2 und y2 oder füge gradientTransform="rotate(45 0.5 0.5)" hinzu, um um die Mitte der Bounding Box zu drehen.

Kann ich die Farben eines SVG-Farbverlaufs mit CSS ändern?

Ja. stop-color und stop-opacity sind CSS-Eigenschaften, also funktionieren Regeln wie stop { stop-color: var(--accent); } bei Inline-SVG.

Warum ist mein SVG-Farbverlauf verschwunden, als ich das SVG versteckt habe?

Definitionen in einem SVG mit display: none werden womöglich nicht gerendert. Versteck den Sprite stattdessen mit null Breite und Höhe oder mit absoluter Positionierung.

Diesen Artikel teilen

Geschrieben von GradientlyVerifiziertes Gradiently-Konto

Das Team hinter Gradiently, einem Designtool rund um Marks: lebendige Farbverläufe, durch die alles, was du gestaltest, nach dir aussieht.

Unser Profil ansehen