Die SVG `path`-Syntax: Ein illustrierter Leitfaden

Avatar of Chris Coyier
Von Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Das `path`-Element in SVG ist das ultimative Zeichenelement. Es kann alles zeichnen! Ich habe gehört, dass unter der Haube alle anderen Zeichenelemente letztendlich sowieso Pfade verwenden. Das Pfadelement nimmt ein einziges Attribut zur Beschreibung dessen, was es zeichnet: das `d`-Attribut. Sein Wert ist eine eigene Mini-Syntax. Es kann ziemlich unentzifferbar aussehen. Es ist eine Menge von Zahlen und Buchstaben, die zu einem langen String zusammengequetscht sind. Wie bei allem im Computer gibt es einen Grund für den Reim. Ich bin hier kein Experte, aber ich dachte, es wäre lustig, einzutauchen.

Hier ist ein Beispiel für einen Pfad mittlerer Komplexität, würde ich sagen

<path d="M213.1,6.7c-32.4-14.4-73.7,0-88.1,30.6C110.6,4.9,67.5-9.5,36.9,6.7C2.8,22.9-13.4,62.4,13.5,110.9
  C33.3,145.1,67.5,170.3,125,217c59.3-46.7,93.5-71.9,111.5-106.1C263.4,64.2,247.2,22.9,213.1,6.7z"/>

Wir könnten es neu formatieren, um es verständlich zu machen (immer noch gültiger Code)

<path d="
  M 213.1,6.7
  c -32.4-14.4-73.7,0-88.1,30.6
  C 110.6,4.9,67.5-9.5,36.9,6.7
  C 2.8,22.9-13.4,62.4,13.5,110.9
  C 33.3,145.1,67.5,170.3,125,217
  c 59.3-46.7,93.5-71.9,111.5-106.1
  C 263.4,64.2,247.2,22.9,213.1,6.7
  z" />

Die Buchstaben sind Befehle. Die Zahlen sind Werte, die an diese Befehle übergeben werden. Alle Kommas sind optional (es könnten auch Leerzeichen sein).

Zum Beispiel ist der erste Befehl `M`. `M` bedeutet, im übertragenen Sinne, hebe den Stift an und bewege ihn zur exakten Position `213.1, 6.7`. Zeichne noch nichts, bewege nur den Standort des Stifts. So dass, wenn andere Befehle zeichnen, es jetzt an diesem Standort beginnt.

`M` ist nur einer von vielen Pfadbefehlen. Es gibt nach meiner Zählung 18 davon.

Viele (aber nicht alle) davon kommen im Doppelpack. Es gibt eine GROSSBUCHSTABIGE und eine kleingeschriebene Version. Die GROSSBUCHSTABIGE Version ist die absolute Version und die kleingeschriebene ist die relative Version. Nehmen wir M weiter als Beispiel

  • `M 100,100` bedeutet „Nimm den Stift und bewege ihn zu den exakten Koordinaten 100,100“
  • `m 100,100` bedeutet „Bewege den Stift 100 nach unten und 100 nach rechts von deinem aktuellen Standort aus.“

Viele Befehle haben diese gleiche Konfiguration. Die kleingeschriebene Version berücksichtigt, wo sich der „Stift“ gerade befindet.

Betrachten wir zwei absolute Befehle

commands<svg viewBox="0 0 100 100"> <path d=" M 50,50 L 100,100 " /> </svg> Pick up the pen and move it to 50,50Put down the penand draw a line to 100,100

Gefolgt von einem relativen Befehl

commands<svg viewBox="0 0 100 100"> <path d=" M 50,50 L 100,100 l 25,0 " /> </svg> From the currentposition, move right 25

Genau wie die `M`- und `m`-Befehle nehmen `L` und `l` zwei Zahlen entgegen: entweder absolute oder relative Koordinaten. Es gibt vier weitere Befehle, die im Wesentlichen einfachere Versionen der Linienbefehle sind. Sie zeichnen ebenfalls Linien, benötigen aber nur einen Wert: horizontal oder vertikal. Als wir `l 25,0` verwendeten, hätten wir `h 25` verwenden können, was bedeutet: „Zeichne von der aktuellen Position des Stifts 25 nach rechts.“ Etwas prägnanter, nehme ich an. Sein größeres Geschwisterchen `H` bedeutet, wie wir vermuten können, zum exakten horizontalen Koordinatenwert 25 zu zeichnen. `V` und `v` bewegen sich vertikal absolut und relativ, wie Sie sicherlich erraten werden.

Schauen Sie sich diese Chris Nager-Demo an, in der er ein Kreuz mit extrem wenig Code zeichnet, dank der relativen Koordinatenzeichnung

Sehen Sie das allerletzte Zeichen, das Chris dort verwendet hat? `Z`. `Z` (oder `z`, es spielt keine Rolle) „schließt“ den Pfad. Wie jeder andere Befehl ist er optional. Es ist eine einfache und bequeme Möglichkeit, eine gerade Linie direkt zur letzten Stelle zu zeichnen, an der der „Stift“ abgesetzt wurde (wahrscheinlich der letzte `M`- oder `m`-Befehl). Es erspart Ihnen, diese erste Position wiederholen und einen Linienbefehl verwenden zu müssen, um dorthin zurückzukehren.

commands<svg viewBox=”0 0 100 100″> <path d=” M 50,50 L 100,100 l 25,0 Z ” /> </svg> Draw a linestraight back to the start

Betrachten wir die bisher behandelten Befehle.

M x,yBewege dich zu den absoluten Koordinaten x,y
m x,yBewege dich x nach rechts und y nach unten (oder links und oben bei negativen Werten)
L x,yZeichne eine gerade Linie zu den absoluten Koordinaten x,y
l x,yZeichne eine gerade Linie zu einem Punkt, der relativ x nach rechts und y nach unten ist (oder links und oben bei negativen Werten)
H xZeichne eine Linie horizontal zur exakten Koordinate x
h xZeichne eine Linie horizontal relativ um x nach rechts (oder nach links bei negativem Wert)
V yZeichne eine Linie vertikal zur exakten Koordinate y
v yZeichne eine Linie vertikal relativ um y nach unten (oder nach oben bei negativem Wert)
Z (oder z)Zeichne eine gerade Linie zurück zum Start des Pfades

Bisher haben wir uns nur gerade Linien angesehen. `path` ist ein vollkommen akzeptables Element und eine Syntax dafür, obwohl man argumentieren könnte, dass Elemente wie `line` eine noch einfachere Syntax für gerade Linienformen haben, wenn auch etwas eingeschränkter.

Die Superkraft von `path` sind Kurven! Es gibt ziemlich viele verschiedene Arten.

Erinnern Sie sich an den ersten Teil des Beispielcodes, den wir uns angesehen haben? Er verwendete viele `C`- und `c`-Befehle. Das sind „Bézier-Kurven“ und erfordern mehr Daten für ihre Funktion.

Der `C`-Befehl nimmt drei Punkte entgegen. Die ersten beiden Punkte definieren die Position zweier Bézier-Steuerpunkte. Vielleicht ist dieses Konzept von einem Werkzeug wie dem Zeichenstift in Adobe Illustrator vertraut

Der letzte der drei Punkte ist das Ende der Kurve. Der Punkt, an dem die Kurve enden soll. Hier ist eine Illustration

commands<svg viewBox=”0 0 100 100″> <path d=” M 25,50 C 25,100 150,100 150,50 ” /> </svg> Bezier point #1Bezier point #2Final point

Der kleingeschriebene `c`-Befehl ist genau derselbe, außer dass alle drei Punkte relative Werte verwenden.

Der `S`- (oder `s`-) Befehl ist ein Kumpel der C-Befehle, da er nur *zwei* Punkte benötigt, weil er davon ausgeht, dass der erste Bézier-Punkt eine Spiegelung des letzten Bézier-Punktes des letzten S- oder C-Befehls ist.

commands<svg viewBox=”0 0 100 100″> <path d=” M 25,100 C 25,150 75,150 75,100 S 100,25 150,75 ” /> </svg> ASSUMED!Bezier PointFinal Point

Der `Q`-Befehl ist einer der einfacheren, da er nur zwei Punkte benötigt. Der Bézier-Punkt, den er benötigt, ist ein „quadratischer“ Kurvenkontrollpunkt. Es ist, als ob sowohl der Start- als auch der Endpunkt einen einzigen Punkt für ihr Steuerungs-Handle teilen.

Wir können auch gleich `T` behandeln. Er ist ein Kumpel von `Q`, genau wie `S` von `C` ist. Wenn `T` nach einem `Q` kommt, wird angenommen, dass der Kontrollpunkt eine Spiegelung des vorherigen ist, sodass Sie nur den Endpunkt angeben müssen.

commands<svg viewBox=”0 0 100 100″> <path d=” M 25,75 Q 50,150 75,100 T 150,150 ” /> </svg> Bezier PointFinal PointASSUMED!Final Point

Der `A`-Befehl ist wahrscheinlich der komplizierteste. Oder er benötigt zumindest die meisten Daten. Sie geben Informationen, die die Breite, Höhe und Rotation eines Ovals definieren, zusammen mit dem Endpunkt. Dann noch ein paar weitere Informationen darüber, welchen Weg entlang dieses Ovals der Pfad nehmen soll. Von MDN

Es gibt zwei mögliche Ellipsen, um die der Pfad verlaufen kann, und zwei verschiedene mögliche Pfade auf beiden Ellipsen, was vier mögliche Pfade ergibt. Das erste Argument ist das `large-arc-flag`. Es bestimmt einfach, ob der Bogen größer oder kleiner als 180 Grad sein soll; am Ende bestimmt dieses Flag die Richtung, in die der Bogen um einen gegebenen Kreis verläuft. Das zweite Argument ist das `sweep-flag`. Es bestimmt, ob der Bogen mit negativen oder positiven Winkeln beginnen soll, was im Wesentlichen auswählt, welchen der beiden Kreise Sie durchlaufen werden.

Joni Trythalls Grafik, die `A` erklärt, aus ihrem Artikel über SVG-Pfade, ist ziemlich klar

Hier sind schriftliche Erklärungen zu diesen Kurvenbefehlen.

C cX1,cY1 cX2,cY2 eX,eYZeichne eine Bézier-Kurve basierend auf zwei Bézier-Steuerpunkten und ende an den angegebenen Koordinaten
cGleiches gilt für alle relativen Werte
S cX2,cY2 eX,eYIm Grunde ein C-Befehl, der davon ausgeht, dass der erste Bézier-Steuerpunkt eine Spiegelung des letzten Bézier-Punktes ist, der im vorherigen S- oder C-Befehl verwendet wurde
sGleiches gilt für alle relativen Werte
Q cX,cY eX,eYZeichne eine Bézier-Kurve basierend auf einem einzigen Bézier-Steuerpunkt und ende an den angegebenen Koordinaten
qGleiches gilt für alle relativen Werte
T eX,eYIm Grunde ein Q-Befehl, der davon ausgeht, dass der erste Bézier-Steuerpunkt eine Spiegelung des letzten Bézier-Punktes ist, der im vorherigen Q- oder T-Befehl verwendet wurde
tGleiches gilt für alle relativen Werte
A rX,rY Rotation, arc, sweep, eX,eYZeichnet einen Bogen, der auf der Kurve einer Ellipse basiert. Definieren Sie zuerst die Breite und Höhe der Ellipse. Dann die Rotation der Ellipse. Zusammen mit dem Endpunkt ergeben sich zwei mögliche Ellipsen. Die Parameter `arc` und `sweep` sind entweder 0 oder 1 und bestimmen, welche Ellipse und welchen Pfad sie nehmen wird.
aGleiches gilt für relative Werte für eX,eY

Möchten Sie viele Beispiele sehen? OK

Wenn Sie in einem kürzlich veröffentlichten Blink-basierten Browser nachschauen und eine Maus haben, sehen Sie einige Hover-Animationen! Es stellt sich heraus, dass man Pfaddaten jetzt direkt in CSS einstellen kann. Zum Beispiel...

<svg viewBox="0 0 10 10">
  <path d="M2,5 C2,8 8,8 8,5" />
</svg>
svg:hover path {
  transition: d 0.2s;
  d: path("M2,5 C2,2 8,2 8,5");
}

Dieser SVG Path Visualizer ist wirklich cool!


Möchten Sie mehr über SVG erfahren? Es ist wirklich cool, verspreche ich. Ich habe ein ganzes Buch darüber geschrieben. Es heißt Practical SVG und ist nicht sehr teuer.