Ich wette, Sie alle haben diesen kleinen Trick gesehen, bei dem ein SVG-Pfad so animiert wird, dass er aussieht, als würde er sich selbst zeichnen. Es ist super cool. Jake Archibald hat die Technik eingeführt und hat einen super guten interaktiven Blogbeitrag darüber, wie es funktioniert. Brian Suda hat im Rahmen von 24 Ways darüber geschrieben. Polygon hat es in einem maßgeschneiderten Artikel hervorragend eingesetzt und darüber geschrieben. Codrops hat einige nette Beispiele.
Ich habe wenig hinzuzufügen, außer dass mein Gehirn es gerade irgendwie verstanden hat, also dachte ich, ich würde es noch einmal so erklären, wie es für mich klick gemacht hat.
1. Sie haben eine SVG-Form

2. Die Form muss einen Rand (Stroke) haben

3. Ränder können gestrichelt sein
Das könnten wir in Illustrator tun, aber wir können es auch programmgesteuert machen. Zielen wir mit CSS auf den Pfad (vorausgesetzt, wir verwenden hier Inline-SVG oder über ein <object>) und wenden den Strich auf diese Weise an.
<svg ...>
<path class="path" stroke="#000000" ... >
</svg>
.path {
stroke-dasharray: 20;
}
Das gibt uns Striche von 20 Pixeln Länge.

4. Diese Striche könnten länger sein...
.path {
stroke-dasharray: 100;
}

5. Wir können den Rand auch „verschieben“, was die Position dieser Striche verändert
Sehen Sie, wie wir die Verschiebung dieser langen Striche animieren

Das war so einfach wie
.path {
stroke-dasharray: 100;
animation: dash 5s linear;
}
@keyframes dash {
to {
stroke-dashoffset: 1000;
}
}
6. Stellen Sie sich einen Strich vor, der so lang ist, dass er die gesamte Form bedeckt
Nichts Besonderes zu sehen, es sieht genauso aus wie die vollständige Form, wenn sie überhaupt nicht gestrichelt wäre. Sie müssen nur stroke-dasharray auf einen längeren Wert als die Länge des Strichs setzen.
7. Verschieben Sie nun diesen Rand, so dass er die gesamte Form nicht mehr bedeckt, anstatt sie zu bedecken.
Es wird so aussehen, als ob die Form gar nicht vorhanden wäre.
8. Animieren Sie nun den Randversatz zurück auf 0

Wenn Sie dies mit CSS tun, möchten Sie, dass die animation den Wert animation-fill-mode von forwards hat, damit der Endzustand so bleibt, wie die Animation endet.
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
animation: dash 5s linear forwards;
}
@keyframes dash {
to {
stroke-dashoffset: 0;
}
}
Tada!
Live-Beispiel
Warum also all das JavaScript?
Die meisten Beispiele für SVG-Linienanimationen, die Sie sehen, verwenden JavaScript. Das liegt daran, dass es schwierig ist, die tatsächliche Länge dieses Randes zu kennen. Wir haben in unserem Beispiel nur 1000 verwendet, weil das ungefähr die richtige Länge ist.
Sie können diese Länge in JavaScript erhalten, z.
var path = document.querySelector('.path');
var length = path.getTotalLength();
Verwenden Sie sie dann, wie Sie möchten. Die oben genannten Artikel gehen viel mehr auf all dies ein, daher werde ich Sie ermutigen, diese für ausgefallenere Dinge zu konsultieren. Ich wollte nur das Konzept behandeln, damit es vielleicht auch für Sie klick macht.
Es gibt auch einen Trick! Schauen Sie sich A Trick That Makes Drawing SVG Lines Way Easier an.
Toller Artikel, danke dafür!
Schön!
Ich konnte die Gesamtlänge von Nicht-Pfaden nicht ermitteln. Also habe ich ein kleines Ding gemacht, um alle Nicht-Pfade zuerst in Pfade umzuwandeln und dann die Längen zu berechnen und zu animieren.
Ich benutze es auf meiner Hochzeitswebsite http://10-5.de/
Sie können den Code auf meinem Pen sehen: http://codepen.io/niorad/pen/xmfza
Wow, das ist eine wirklich coole Hochzeitswebsite und ein hervorragendes Beispiel dafür, was mit SVG-Animationen gemacht werden kann.
Herzlichen Glückwunsch zur Hochzeit und die Website ist wirklich schön.
Bravo!
Wie immer, Eigenschaften für Effekte verwenden, für die sie nie gedacht waren :)
Total süß. Eine so einfache Methode, die für großartige Effekte genutzt werden könnte!
Sehr cool, aber leider keine Internet Explorer-Unterstützung. Nicht einmal IE11.
Dann keine SVG-Animationen für IE. Erstellen Sie eine Fallback-Lösung!
Ich habe festgestellt, dass die einzige Möglichkeit, eine gute Cross-Browser-Unterstützung zu erzielen, die Verwendung von Javascript zur Animation für IE9 und höher ist. Hier ist eine gute Referenz für den Einstieg -> Animating SVGs
Ich habe auch festgestellt, dass dies in IE nicht funktioniert. Snap.svg ist eine ziemlich großartige Alternative. Alle Techniken und grundlegenden Theorien hier gelten immer noch. Sie erstellen einen
pathmit einer bestimmten Länge und setzen dannstrokeDasharrayundstrokeDashoffsetauf dieselbe Länge. Dann können Sie einfachpath.animate({strokeDashoffset: 0}, 1000);für denselben Effekt aufrufen (1000 ist die Zeit in ms).Sehr schön! Ich habe ein Experiment damit gemacht. Aber damit es in Chrome funktioniert, musste ich
@-webkit-keyframesund-webkit-animationhinzufügen.Sie können es hier sehen.
Ich habe Schwierigkeiten, diesen Teil zu verstehen
„Verschieben Sie nun diesen Rand, so dass er die gesamte Form nicht mehr bedeckt, anstatt sie zu bedecken.“
Wenn Sie das Dash-Array gleich der Länge des Randes machen, warum verschwindet es dann beim Verschieben, wo geht der Rest hin?
Ja, das ist seltsam. Ich schätze, das liegt daran, dass beim Strich-Trick immer mindestens ein Strich und ein gleich langer Abstand vorhanden sein muss. Je nachdem, wo dieser Strich oder Abstand übereinstimmt, wird der Teil des Randes angezeigt, der gefüllt ist.
Das Setzen von
stroke-dasharray: 1000;ist nur eine Kurzform fürstroke-dasharray: 1000 1000;, also einen 1000-Pixel-Strich gefolgt von einer 1000-Pixel-Lücke. Aus den SpezifikationenHallo Chris
Ich habe gerade mit dem Code herumgespielt und als ich ihn auf meinem System ausführe (nachdem ich den Code kopiert und eingefügt habe), konnte ich kein Ergebnis auf dem Bildschirm erhalten.
aber zu meiner Überraschung läuft es auf Codepen reibungslos, aber nicht auf jsbin oder js fiddle.
(http://jsfiddle.net/65LzR/ "Fiddle")
Bitte gib deine Meinung dazu ab
Verwendeter Browser: Chrome 32
Es sieht so aus, als ob die Animation richtig initialisiert wird. Indem Sie sie in Chrome öffnen und die Animationseigenschaft umschalten. Dann läuft sie korrekt.
Hey,
Es liegt daran, dass die aktuelle Version von Chrome das -webkit-Präfix für die CSS-Animationen benötigt
also wäre es "-webkit- animation: und @-webkit-keyframes"
http://jsfiddle.net/SeKLe/ – Hier ist eine Abspaltung Ihres Demos mit hinzugefügten Präfixen.
Großartiges Tutorial, danke fürs Teilen.
Das ist großartig!
Das ist großartig! Danke. Haben Sie Ressourcen/Dokumente für SVG-Eigenschaften, die mit CSS animiert werden können (oder sogar JS, zum Beispiel in Kombination mit der erstaunlichen Greensock Animation Library).
Das ist um Welten besser als das, was ich derzeit verwende: die getSubpath()-Methode in Raphael.js. Sie hat ihren Zweck erfüllt, sah aber oft eher so aus, als ob der Rand von seinem Ursprungspunkt aus skaliert würde.
Hallo!
Das ist sehr schön!!
Es funktioniert, wenn ich das SVG im HTML schreibe, aber nicht, wenn ich das SVG über das Objekt importiere.
Kann das behoben werden?
:*
Wenn Sie Ihr SVG in einem
<object>-Tag verstecken, ist es für CSS nicht zugänglich. Sie könnten die CSS-Stile in die externe SVG-Datei aufnehmen, aber ich kann nicht garantieren, dass dies in allen SVG-Browsern funktioniert.Juhu! Toller Artikel, eine Frage: Wie kann ich die Animation stoppen, sobald sie fertig ist?
animation-fill-mode: forwards;
Erstaunlich! Vielen Dank für diese schnelle und leicht verständliche Erklärung!
Vielen Dank! Das ist wirklich nützlich.
Großartig! :)
Nur zur Info: Nicht alle Browser interpretieren die Eigenschaft
stroke-dashoffsetgleich, und die Art und Weise, wie Sie die Animation definieren, könnte zu unerwarteten Ergebnissen führen. Siehe diese Stack Overflow-Frage und -Antwort.Ich bin mir nicht ganz sicher, wie der Versatz in diesen Fällen interpretiert wird, aber die Spezifikationen sind nicht sehr spezifisch darüber, was passieren sollte, wenn das Strichmuster doppelt so lang ist wie ein geschlossener Pfad und Sie mit dem Musterversatz um die gesamte Länge beginnen. Der Endeffekt ist, dass einige Browser den Wechsel auf einen Null-Versatz als Übergang von einer vollständig gezeichneten Linie zu nichts interpretieren, und einige interpretieren ihn als Übergang von nichts zu vollständig gezeichnet. Das macht keinen großen Unterschied, wenn Sie die Animation auf
alternate infiniteeinstellen, aber es macht einen großen Unterschied, wenn Sie die Linie zeichnen und dort lassen möchten.Ich würde empfehlen, die gesamte Animation mit der Eigenschaft
stroke-dasharraydurchzuführenAbspaltung des Beispiel-Pens mit implementierten Änderungen.
Und mit der Animation, die nur in eine Richtung geht.
Ja, das ermöglicht einige ziemlich coole und einfache Animationen, besonders wenn Ihr Designer Vektoren liebt und nur in Adobe Illustrator arbeiten will.
Wird dieser Wert "statisch" sein, bedeutet das, dass er immer derselbe für denselben gegebenen Pfad ist? So dass es genügen würde, einmal JS zu verwenden, um seine Länge zu ermitteln, und dann könnte man diesen festen Wert in CSS einfügen (ja, ich weiß, es wäre irgendwie eine "magische Zahl", aber trotzdem).
Oder ist er dynamisch und hängt von... was ab? Browser, Anzeigegröße des SVG-Bildes, ...?
Die Länge wird in den Einheiten des Koordinatensystems für das Pfadelement angegeben und ist daher unabhängig von jeder Skalierung des SVG als Ganzes. Allerdings erlauben die Spezifikationen, dass Browser die genaue Länge schätzen, indem sie einen Algorithmus ihrer Wahl verwenden, daher sind die Ergebnisse möglicherweise nicht immer genau gleich. Um dem entgegenzuwirken, können Sie das Attribut "pathLength" auf Ihrem Pfadelement auf den Wert setzen, den Sie für Animationen verwenden, und der Browser soll seine Berechnungen entsprechend anpassen.
Mit anderen Worten, um die Interoperabilität zu gewährleisten, können Sie Javascript verwenden, um die Länge Ihres Pfades auf Ihrem Entwicklungscomputer zu ermitteln, und dann diese Länge in einem
pathLength-Attribut des Pfadelements deklarieren und sie dann sicher in Ihren CSS-Animationen verwenden, ohne sich Sorgen machen zu müssen, dass die Dinge auf einem anderen Browser leicht abweichen. Sie *könnten* die Berechnung überspringen und einfach pathLength als schöne runde Zahl Ihrer Wahl deklarieren, aber dann müssten Sie einige eingehende Cross-Browser-Tests durchführen, um sicherzustellen, dass sie alle die entsprechenden Berechnungen durchführen...Danke Amelia, auch für deinen anderen Kommentar, ziemlich nützlich!
Hallo,
Ich habe das nachgebaut und ich möchte, dass die Animation nach dem Zeichnen auf der Seite bleibt. Wie gehe ich da vor? Ich habe das "infinite" entfernt und es spielt nur einmal ab. Ich möchte, dass es auf der Seite bleibt.
Jede Hilfe wäre großartig.
Danke!
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
-webkit-animation: dash 5s linear;
-webkit-animation-iteration-count:1;
}
@-webkit-keyframes dash {
from {
stroke-dashoffset: 1000;
}
to {
stroke-dashoffset: 10;
}
}
Ich verstehe es nicht, warum brauchst du stroke-dashoffset: 1000;?
Du kannst einfach das machen
.path {
stroke-dasharray: 1000;
animation: dash 5s linear;
animation-fill-mode: forwards;
}
@keyframes dash {
from{
stroke-dashoffset: 1000;
}
to {
stroke-dashoffset: 0;
}
}
Einige Browser unterstützen SVG, aber nicht die Linienanimation (ich schaue dich an, IE).
Wie kann ich also testen, ob der Browser SVG-Linienanimationen unterstützt, damit ich auf ein Raster zurückfallen kann?