SVG/Farben/Verläufe
- 15min
- mittel
- SVG/Farben/Füllungen
Diese Farbverläufe werden zentral im Definitionsabschnitt festgelegt und über eine ID gekennzeichnet. Um einen Verlauf zu referenzieren, ruft man im fill- oder stroke-Attribut eine URL-Funktion mit der id des Verlaufs auf: fill="url(#id)"
.
Somit kann ein Verlauf einmal festgelegt, aber beliebig oft referenziert werden.
Inhaltsverzeichnis
Verläufe in SVG und CSS
Seit CSS3 gibt es ähnliche CSS-Funktionen, die in HTML allerdings nur den Hintergrund über background-image formatieren können. Sie sind aber - anders als die universell verwendbaren filter()-Funktionen - nicht auf die SVG-Präsentationsattribute wie fill
und stroke
anwendbar.
Verläufe in SVG müssen zwingend im SVG-Quelltext definiert sein! Sind Verläufe vorhanden, können Sie diese immerhin mit CSS umfärben, z.B. für den ersten Stop des Verlaufs verlaufname
so:
svg #verlaufname stop:nth-child(1) {
stop-color: white;
}
Der lineare Farbverlauf
Einen linearen Farbverlauf legen Sie mit dem linearGradient-Element fest. Standardmäßig folgt der Verlauf einem Vektor von links nach rechts.
Folgende Angaben sind optional:
- x1: horizontaler Startpunkt (Standard: 0%)
- x2: vertikaler Startpunkt (Standard: 0%)
- y1: horizontaler Endpunkt (Standard: 100%)
- y2: vertikaler Endpunkt (Standard: 0%)
Lineare Farbverläufe verlaufen ...
- horizontal, wenn y1 / y2 gleich und x1 / x2 verschieden sind (oder alle Angaben fehlen)
- vertikal, wenn y1 / y2 verschieden und x1 / x2 gleich sind
- schräg, wenn x1 / x2 verschieden und y1 / y2 verschieden sind
Farben, Positionen und Transparenz eines Farbverlaufs
Mit dem stop-Element lässt sich ein Color-Stop festlegen, der die Position, Farbe und deren Transparenz setzt.
Folgende Angaben sind möglich:
- offset: regelt die Position der Farbe (erlaubte Werte 0-1 oder 0%-100%)
- stop-color: setzt die Farbe
- stop-opacity: regelt die Transparenz der Farbe
<stop offset="0%" stop-color="black" stop-opacity="100%" />
In diesem Beispiel sehen Sie drei verschiedene Verläufe:
<defs>
<linearGradient id="horizontal">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</linearGradient>
<linearGradient id="vertikal" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="20%" stop-color="green" />
<stop offset="50%" stop-color="yellow" />
<stop offset="80%" stop-color="navy" />
</linearGradient>
<linearGradient id="diagonal" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="20%" stop-color="green" />
<stop offset="50%" stop-color="yellow" />
<stop offset="80%" stop-color="navy" />
</linearGradient>
</defs>
<rect id="eins" x="10" y="10" width="150" height="200" fill="url(#horizontal)" />
<rect id="zwei" x="200" y="10" width="150" height="200" fill="url(#vertikal)" />
<rect id="drei" x="370" y="10" width="150" height="200" fill="url(#diagonal)" />
Verläufe mit CSS gestalten
Im SELF-Forum wurde 2013 gefragt, wie man Strahlen nach außen hin transparent werden lassen kann.[1] Auch dies geht mit Verläufen:
#begin {
stop-color: blue;
stop-opacity:1;
}
#end {
stop-color: skyblue;
stop-opacity:0;
}
svg:hover #end {
stop-color: lime;
stop-opacity:1;
}
In einem symbol-Element wird ein Strahl angelegt und mit dem Verlauf #grad1 gefüllt. In mehreren use-Elementen wird es referenziert und mit transform entsprechend gedreht.
Der Clou: die stop-color- und stop-opacity-Attribute sind Präsentationsattribute und können mit CSS gesetzt und bei :hover verändert werden. Probieren Sie es aus!
Wiederholung von Farbverläufen
Sobald der Raum eines Farbübergangs mittels eines Vektors eingeschränkt wird, bleibt der Rest des Raums frei. Mit dem spreadMethod-Attribut kann man den ungenutzten Teil ebenfalls füllen.
Die Werte des Attributs lauten:
pad
: der Verlauf wird abgeschnitten (Standard)reflect
: horizontale und vertikale Spiegelungrepeat
: Wiederholung
<defs>
<linearGradient id="pad" spreadMethod="pad">
<stop offset="20%" stop-color="#337799" />
<stop offset="50%" stop-color="#dfac20" />
<stop offset="80%" stop-color="#c82f04" /> </linearGradient>
<linearGradient id="reflect" spreadMethod="reflect" x1="0%"
x2="0%" y1="50%" y2="0%">
<stop offset="20%" stop-color="#337799" />
<stop offset="50%" stop-color="#dfac20" />
<stop offset="80%" stop-color="#c82f04" /> </linearGradient>
<linearGradient id="repeat" x1="0%" x2="0%" y1="25%" y2="0%"
spreadMethod="repeat">
<stop offset="20%" stop-color="#337799" />
<stop offset="50%" stop-color="#dfac20" />
<stop offset="80%" stop-color="#c82f04" />
</linearGradient>
</defs>
<rect fill="url(#pad)" transform="translate(10,10)"
/>
<rect fill="url(#reflect)" transform="translate(290,10)"
/>
<rect fill="url(#repeat)" transform="translate(570,10)"
/>
Der radiale Farbverlauf
Das radialGradient-Element erzeugt einen Farbübergang anhand eines Kreises. Auch hier folgt der Verlauf einem Vektor, der jedoch vom Mittelpunkt nach außen gerichtet ist.
Folgende Angaben sind möglich:
- cx: horizontaler Mittelpunkt (Standardwert ist
50%
) - cy: vertikaler Mittelpunkt (Standardwert ist
50%
) - r: Radius (Standardwert ist
50%
) - fx: horizontaler Brennpunkt (verschiebt die Stelle mit der höchsten Farbintensität vom Mittelpunkt an einen anderen Punkt, Standardwert ist der Wert von cx)
- fy: vertikaler Brennpunkt (Standardwert ist der Wert von cy)
- fr: Radius des Brennpunkts (Standardwert ist 0)
Wenn Sie nichts anderes angeben, liegt (fx,fy)
an der gleichen Stelle wie (cx,cy)
und fr
ist 0, es handelt sich also um einen Brennpunkt.
<radialGradient id="radial1">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial2" cx="0" cy="0" r="0.3">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial3" cx="0" cy="0" r="1">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial4" cx="0.5" cy="0.5" r="0.5" fx="0.25" fy="0.25">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial5" cx=".5" cy=".5" r=".5" fx="1" fy=".5">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial6" cx=".5" cy=".5" r=".5" fx=".5" fy="1">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial7" cx=".2" cy=".2" r=".4" fx=".7" fy="0.6">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" /> </radialGradient>
<radialGradient id="radial8" cx=".7" cy=".7" r=".3" fx=".2" fy="0.2" fr="0.1">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
In der oberen Reihe sehen Sie einen radialen Verlauf ohne Angabe von cx, cy und r. Die Standardwerte positionieren den Verlauf in der Mitte und über 50 % der Breite des Elements. Der Vektor des Farbverlaufs (roter Pfeil) geht von der Mitte nach außen.
In den nächsten Bildern wird der Verlauf mit cx="0" cy="0"
oben links positioniert. Der Verlauf im mittleren Bild hat einen kleineren Radius (r="0.3"
); rechts ist er mit (r="1"
) größer.
In der mittleren Reihe wurden auch die Werte für die fx- und fy-Attribute geändert. Damit wird der Brennpunkt der Velraufs verschoben.
Wenn der Startkreis (oder Startpunkt) vollständig im Inneren des Endkreises liegt, besteht der radiale Gradient aus ineinander liegenden Kreisen und das Grafikelement wird vollständig gefüllt. Das ändert sich, sobald der Startkreis auch nur um ein Weniges aus dem Endkreis hinausragt. SVG zeichnet auch jetzt Kreisringe, und verschiebt dabei den Mittelpunkt von (fx,fy) nach (cx,cy), aber die hohe Exzentrität des Mittelpunkts bewirkt, dass keine vollständige Füllung mehr entsteht, sondern ein Füllkegel. Die Beispielgradienten 7 und 8 zeigen dieses Verhalten.
radialGradient
jedoch „nur“ XML-Attribute sind.Wiederholung von radialen Verläufen
Welche Farbe im Inneren des Startkreises und außerhalb des Endkreises gewählt wird, hängt vom spreadMethod-Attribut ab, die Sie angeben. Dieses Attribut des radialGradient-Elements kann folgende Werte annehmen:
- pad
- Im Inneren des Startkreises ist die Farbe von Offset 0 %, außerhalb des Endkreises ist die Farbe von Offset 100 %
- repeat
- Im Inneren des Startkreises ist die Farbe von Offset 100 %, außerhalb des Endkreises wird der Farbverlauf wiederholt, d. h. für Offset 100 % bis 200 % werden die Farben von Offset 0 % bis 100 % wiederholt, für Offset 200 % bis 300 % erneut, bis die Fläche gefüllt ist.
- reflect
- Im Inneren des Startkreises ist die Farbe von Offset 0 %. Außerhalb des Endkreises wird der Farbverlauf gespiegelt dargestellt, d. h. für Offset 100 % bis 200 % werden die Farben von 100 % bis 0 % dargestellt, dann von 200 % bis 300 % wieder die Farben von 0 % bis 100 %, und so weiter.
<radialGradient id="radial1" cx="0.5" cy="0.5" r="0.3"
fx="0.4" fy="0.4" spreadMethod="pad">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial2" cx="0.5" cy="0.5" r="0.3"
fx="0.4" fy="0.4" spreadMethod="reflect">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial3" cx="0.5" cy="0.5" r="0.3"
fx="0.4" fy="0.4" spreadMethod="repeat">
<stop offset="0%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
gradientTransform
Die optionale Angabe gradientTransform dient einer möglichen Transformation (Richtungsänderung) des Verlaufs.
<radialGradient id="radial1" cx="100" cy="100" r="100" fx="100" fy="100" gradientUnits="userSpaceOnUse" >
<stop offset="0%" stop-color="blue" />
<stop offset="50%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial2" cx="100" cy="100" r="100" fx="100" fy="100" gradientUnits="userSpaceOnUse" gradientTransform="skewX(30) translate(-60, 0)">
<stop offset="0%" stop-color="blue" />
<stop offset="50%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
<radialGradient id="radial3" cx="100" cy="100" r="100" fx="100" fy="100" gradientUnits="userSpaceOnUse" gradientTransform="translate(50, 0) scale(0.5,1.5)">
<stop offset="0%" stop-color="blue" />
<stop offset="50%" stop-color="yellow" />
<stop offset="100%" stop-color="blue" />
</radialGradient>
Folgende Funktionen sind möglich:
translate()
: Verschiebungrotate()
: Drehungscale()
: Streckungskew()
: Neigen, Verzerrenmatrix()
: Transformieren durch Angabe der Transformationsmatrix
Siehe auch
- CSS/Tutorials/Hintergrund - Farbverläufe in CSS
Referenz:
Quellen
- ↑ SELF-Forum: Strahlen nach außen hin transparent werden lassen vom 26.09.2013