SVG Properties in CSS Guide

Avatar of Katherine Kato
Katherine Kato am

SVG hat seine eigenen Elemente, Attribute und Eigenschaften in einem solchen Umfang, dass Inline-SVG-Code lang und komplex werden kann. Durch die Nutzung von CSS und einigen der kommenden Funktionen der SVG 2-Spezifikation können wir diesen Code für eine sauberere Markup reduzieren.

Präsentiert von DigitalOcean

DigitalOcean bietet die Cloud-Computing-Dienste, die Sie benötigen, um Ihr Wachstum in jeder Phase zu unterstützen. Starten Sie mit einem kostenlosen Guthaben von 200 $!

Es gibt viele Scalable Vector Graphics (SVG), aber nur bestimmte Attribute können als CSS auf SVG angewendet werden. Präsentationsattribute werden verwendet, um SVG-Elemente zu stylen und können als CSS-Eigenschaften verwendet werden. Einige dieser Attribute sind nur für SVG, während andere bereits in CSS geteilt werden, wie z. B. font-size oder opacity.

Um beispielsweise die Farbe eines -Elements rot zu ändern, verwenden Sie die fill-Eigenschaft in CSS. Das fill-Attribut ist ein Präsentationsattribut, daher kann es als CSS-Eigenschaft verwendet werden.

circle {
  fill: red;
}

Mit diesem Wissen tauchen wir nun tief und gründlich in alle SVG-Elemente ein, die uns zur Verfügung stehen, sowie in die CSS-Eigenschaften dafür. Wir werden auch verschiedene Styling-Ansätze betrachten, einschließlich allgemeiner Präsentationsstile und Animationen.

SVG-Elemente nach Kategorie

Die Präsentationsattribute, die als CSS-Eigenschaften verwendet werden können, finden Sie unten. Zur Referenz werden unterstützte Elemente nach Kategorie klassifiziert. Dies schließt keine veralteten Elemente ein.

ElementtypElemente
Container-Elemente<a>
<defs>
<g>
<marker>
<mask>
<pattern>
<svg>
<switch>
<symbol>
Filter-Primitive-Elemente<feBlend>
<feColorMatrix>
<feComponentTransfer>
<feComposite>
<feConvolveMatrix>
<feDiffuseLighting>
<feDisplacementMap>
<feFlood>
<feGaussianBlur>
<feImage>
<feMerge>
<feMorphology>
<feOffset>
<feSpecularLighting>
<feTile>
<feTurbulence>
Verlaufselemente<linearGradient>
<radialGradient>
<stop>
Grafikelemente<circle>
<ellipse>
<image>
<line>
<path>
<polygon>
<polyline>
<rect>
<text>
<use>
Formelemente<circle>
<ellipse>
<line>
<path>
<polygon>
<polyline>
<rect>
Textelementen<text>
<textPath>
<tspan>

Zwischen CSS und SVG geteilte Eigenschaften

Schriftarteigenschaften

PräsentationsattributUnterstützte Elemente
fontTextelementen
font-familyTextelementen
font-sizeTextelementen
font-size-adjustTextelementen
font-stretchTextelementen
font-styleTextelementen
font-variantTextelementen
font-weightTextelementen

Texteigenschaften

PräsentationsattributUnterstützte Elemente
direction<text>
<tspan>
letter-spacingTextelementen
text-decorationTextelementen
unicode-bidiTextelementen
word-spacingTextelementen
writing-mode<text>

Maskierungseigenschaften

PräsentationsattributUnterstützte Elemente
overflow<foreignObject>
<image>
<marker>
<pattern>
<svg>
<symbol>

Interaktivitätseigenschaften

PräsentationsattributUnterstützte Elemente
cursorContainer-Elemente
Grafikelemente

Farbeigenschaften

PräsentationsattributUnterstützte Elemente
colorAnwendbar auf Elemente, die
fill
stroke
stop-color
flood-color
lighting-color

Sichtbarkeitseigenschaften

PräsentationsattributUnterstützte Elemente
displayGrafikelemente
Textelementen
<a>
<foreignObject>
<g>
<svg>
<switch>
visibilityGrafikelemente
Textelementen

SVG CSS Eigenschaften

Texteigenschaften

PräsentationsattributUnterstützte Elemente
alignment-baseline<textPath>
<tspan>
baseline-shift<textPath>
<tspan>
dominant-baselineTextelementen
glyph-orientation-horizontalTextelementen
glyph-orientation-verticalTextelementen
kerningTextelementen
text-anchorTextelementen

Clip-Eigenschaften

PräsentationsattributUnterstützte Elemente
clip<foreignObject>
<image>
<marker>
<pattern>
<svg>
<symbol>
clip-pathContainer-Elemente
Grafikelemente
clip-rule<clipPath>

Maskierungseigenschaften

PräsentationsattributUnterstützte Elemente
maskContainer-Elemente
Grafikelemente
opacityGrafikelemente
<a>
<defs>
<g>
<marker>
<pattern>
<svg>
<switch>
<symbol>

Filtereffekte

PräsentationsattributUnterstützte Elemente
enable-backgroundContainer-Elemente
filterContainer-Elemente
Grafikelemente
flood-color<feFlood>
flood-opacity<feFlood>
lighting-color<feDiffuseLighting>
<feSpecularLighting>

Verlaufseigenschaften

PräsentationsattributUnterstützte Elemente
stop-color<stop>
stop-opacity<stop>

Interaktivitätseigenschaften

PräsentationsattributUnterstützte Elemente
pointer-eventsGrafikelemente

Farbeigenschaften

PräsentationsattributUnterstützte Elemente
color-profile<image> bezieht sich auf Rasterbild

Maleigenschaften

PräsentationsattributUnterstützte Elemente
color-interpolationContainer-Elemente
Grafikelemente
color-interpolation-filtersFilter-Primitive-Elemente
color-renderingContainer-Elemente
Grafikelemente
fillFormelemente
Textelementen
fill-ruleFormelemente
Textelementen
fill-opacityFormelemente
Textelementen
image-rendering<image>
marker<line>
<path>
<polygon>
<polyline>
marker-start<line>
<path>
<polygon>
<polyline>
marker-mid<line>
<path>
<polygon>
<polyline>
marker-end<line>
<path>
<polygon>
<polyline>
shape-renderingFormelemente
strokeFormelemente
Textelementen
stroke-dasharrayFormelemente
Textelementen
stroke-dashoffsetFormelemente
Textelementen
stroke-linecapFormelemente
Textelementen
stroke-linejoinFormelemente
Textelementen
stroke-miterlimitFormelemente
Textelementen
stroke-opacityFormelemente
Textelementen
stroke-widthFormelemente
Textelementen
text-rendering<text>

SVG 2

Während Präsentationsattribute als CSS-Eigenschaften verwendet werden können, um SVG zu stylen, wie sieht es mit der Steuerung der Koordinaten und Dimensionen von SVG-Elementen mit CSS aus? SVG 2, das zum Zeitpunkt des Schreibens den Status Candidate Recommendation hat, ermöglicht das Styling und die Animation dieser Eigenschaften.

Die Spezifikation von SVG 2 besagt:

Einige Styling-Eigenschaften können nicht nur in Style-Sheets und 'style'-Attributen, sondern auch in Präsentationsattributen angegeben werden. Dies sind Attribute, deren Name einer bestimmten CSS-Eigenschaft entspricht (oder ähnlich ist) und deren Wert als Wert dieser Eigenschaft geparst wird."

Das bedeutet nicht nur, dass SVG-Eigenschaften mit CSS als Präsentationsattribute oder in Style-Sheets gestylt werden können, sondern dies kann auch auf CSS-Pseudo-Klassen wie :hover oder :active angewendet werden.

SVG 2 führt auch weitere Präsentationsattribute ein, die als Styling-Eigenschaften verwendet werden können. Diese Attribute finden Sie in der SVG 2 Spezifikation.

Element-spezifische Eigenschaften

Es ist wichtig zu beachten, dass nicht jedes SVG-Element die gleichen CSS-Eigenschaften unterstützt. Ähnlich wie es CSS-Eigenschaften gibt, die auf bestimmte SVG-Elemente angewendet werden können, gibt es spezifische Eigenschaften, die von bestimmten SVG-Elementen unterstützt werden.

Zum Beispiel unterstützen die Elemente <circle> oder <ellipse> die Eigenschaften cx und cy als Mittelpunktkoordinaten der Form. Das Element unterstützt auch die Eigenschaften rx und ry als Radius, aber das Element kann diese Eigenschaften nicht verwenden.

Geometrieeigenschaften

In SVG 2 sind Eigenschaften wie rx und ry als Geometrieeigenschaften definiert. Geometrieeigenschaften können als CSS-Eigenschaften verwendet werden, genau wie Präsentationsattribute wie fill oder stroke-Eigenschaften. Diese CSS-Eigenschaften und die entsprechenden SVG-Elemente umfassen

SVG-ElementGeometrieeigenschaft
<circle>cx
cy
r
<ellipse>cx
cy
rx
ry
<rect>rx
ry
height
width
x
y
<path>path
<image>height
width
x
y
<foreignObject>height
width
x
y
<svg>height
width
x
y

Positionierung von SVG-Elementen

SVG 2 ermöglicht auch die Positionierung von SVG-Elementen mit CSS. Beginnen wir mit dem Zeichnen einer Rechteckform mit dem folgenden SVG:

<svg width="170" height="170">
  <rect x="10" y="10" width="150" height="150" />
</svg>

Und dem folgenden CSS:

rect {
  fill: #6e40aa;
}

Dies erzeugt eine Rechteckform mit ihren Koordinaten auf 10, 10 gesetzt. Mit SVG 2 können x und y als CSS-Eigenschaften angewendet werden.

/* This will work with SVG 2 */
rect {
  x: 10;
  y: 10;
  ...
}

Der SVG-Code würde sich auf Folgendes reduzieren:

<svg width="170" height="170">
  <rect width="150" height="150" />
</svg>

Sie können sogar width und height für das <rect>-Element mit CSS wie folgt festlegen:

rect {
  ...
  width: 150px;
  height: 150px;
  ...
}

Das lässt uns mit nur Folgendem für die SVG-Markup:

<svg width="170" height="170">
  <rect />
</svg>

Zum Zeitpunkt des Schreibens funktionieren die folgenden Demos in Blink (z. B. Chrome und Opera) und WebKit (z. B. Safari) Browsern, da diese Browser SVG 2-Funktionen unterstützen. Bis dahin tauchen wir ein, wie man SVG-Eigenschaften mit CSS überschreibt.

SVG-Form-Morphing

Das Element kann mit CSS überschrieben werden, um Shape-Morphing zu erzeugen.

Die SVG-Pfade, die sich ineinander verwandeln, müssen dieselben Befehle und dieselbe Anzahl von Punkten haben, andernfalls funktioniert das Morphing nicht.

Beginnen wir mit dem Zeichnen eines Elements in Form eines Dreiecks. Die Verwendung der d-Eigenschaft gibt die Form des Elements an.

<svg height="220" width="300">
  <path d="M150 10 L40 200 L260 200Z" />
</svg>

Damit sich das Dreieck in eine andere Form verwandelt, überschreiben wir das SVG-Element mit der d-Eigenschaft durch CSS:

path {
  d: path("M150, 10 L40, 200 L260, 200Z");
  fill: #4c6edb;
}

Fügen wir auch eine :active-Pseudo-Klasse zur Eigenschaft hinzu, sodass sich die Form in ein Quadrat verwandelt und ihre fill-Farbe ändert, wenn auf das Element geklickt wird. Fügen wir außerdem eine transition-Eigenschaft hinzu, um die Shape-Morphing-Aktion flüssig erscheinen zu lassen. Hier ist das CSS:

path:active {
  d: path("M150, 10 L40, 200 L260, 200 L260, 200Z");
  fill: #4c6edb;
  transition: all 0.35s ease;
}

Und das SVG wäre:

<svg height="220" width="300">
  <path />
</svg>

Möchten Sie eine weitere Demo? Hier ist eine coole Demo von Chris Coyier, die SVG-Shape-Morphing beim Hovern zeigt!

Animieren von SVG-Eigenschaften

SVG-Eigenschaften können mit CSS durch CSS-Animationen und -Übergänge animiert werden.

In dieser Demo zeichnen wir verschiedene SVG-Elemente und erstellen eine Wellenanimation. Beginnen wir mit dem Zeichnen von fünf Elementen:

<svg width="350" height="250">
  <circle class="shape" />
  <circle class="shape" />
  <circle class="shape" />
  <circle class="shape" />
  <circle class="shape" />
</svg>

Wir verwenden CSS-Variablen und die :nth-child() CSS-Pseudo-Klasse, um jede .shape-Klasse zu definieren. Die .shape-Klasse hat einen cy von 50 und einen r von 20. Jede der .shape-Klassen hat ihre eigenen cx und fill CSS-Eigenschaften gesetzt.

:root {
  --color-1: #6e40aa;
  --color-2: #4c6edb;
  --color-3: #24aad8;
  --color-4: #1ac7c2;
  --color-5: #1ddea3;
}

.shape {
  cy: 50;
  r: 20;
}

.shape:nth-child(1) {
  cx: 60;
  fill: var(--color-1);
}

.shape:nth-child(2) {
  cx: 120;
  fill: var(--color-2);
}

.shape:nth-child(3) {
  cx: 180;
  fill: var(--color-3);
}

.shape:nth-child(4) {
  cx: 240;
  fill: var(--color-4);
}

.shape:nth-child(5) {
  cx: 300;
  fill: var(--color-5);
}

So sollte es bisher aussehen.

Jetzt ist es Zeit zu animieren! Beginnen wir mit der Verwendung der @keyframes-Regel, um die moveCircle-Animation zu definieren:

@keyframes moveCircle {
  50% {
    cy: 150;
    r: 13;
  }
}

Dadurch wird jedes Element dazu gebracht, seine cy-Koordinaten von 50 auf 150 und r von 20 auf 13 zu ändern. Fügen Sie der .shape-Klasse das Folgende hinzu, um die Animation unendlich laufen zu lassen:

.shape {
  ...
  animation: moveCircle 1250ms ease-in-out both infinite;
}

Fügen Sie schließlich eine animation-delay zu jeder der .shape-Klassen zum CSS hinzu, mit Ausnahme von .shape:nth-child(1), wie folgt:

.shape:nth-child(2) {
  ...
  animation-delay: 100ms;
}

.shape:nth-child(3) {
  ...
  animation-delay: 200ms;
}

.shape:nth-child(4) {
  ...
  animation-delay: 300ms;
}

.shape:nth-child(5) {
  ...
  animation-delay: 400ms;
}

Formen in SVG <pattern>-Elementen können ebenfalls mit CSS animiert werden. Hier ist eine coole Demo von Dudley Storey, die das zeigt!

Zusammenfassung

Da SVG 1.1 der aktuelle Standard ist, unterstützen nur wenige Browser derzeit SVG 2-Funktionen. Es wird nicht empfohlen, diese Techniken bereits in Produktion zu nehmen. Die Implementierung von SVG 2 befindet sich derzeit im Stadium der Candidate Recommendation, daher sollte die Unterstützung für das Styling von SVG-Geometrieeigenschaften mit CSS in Zukunft verbessert werden.