Es gibt nicht nur eine Möglichkeit, SVG zu animieren. Es gibt das <animate>-Tag, das direkt in den SVG-Code kommt. Es gibt Bibliotheken, die dabei helfen, wie Snap.svg oder SVG.js. Wir werden uns eine weitere Methode ansehen: Inline-SVG (SVG-Code direkt in HTML) verwenden und die Teile direkt über CSS animieren.
Ich habe dies kürzlich persönlich ausprobiert, da meine Alma Mater Wufoo die Werbegrafiken, die wir hier schalten, auffrischen wollte. Mein neuestes Design hier verwendet viel SVG und ich dachte, dies wäre eine weitere perfekte Gelegenheit, es noch mehr zu nutzen.
Das fertige Produkt ist ziemlich einfach. Hier ist es
Siehe den Pen Wufoo SVG Ad von Chris Coyier (@chriscoyier) auf CodePen.
Schauen wir uns an, wie es gemacht wird.
1. Gestalten Sie die Anzeige / Haben Sie einen Plan
Dies mag wie ein Moment vom Typ „Wie man eine Eule zeichnet“ erscheinen, aber dieser Artikel handelt von Animation, also kommen wir so schnell wie möglich dazu.
Mein Plan für diese Anzeige war, eine super einfache Wufoo-Anzeige mit ihrem klassischen Logo, Farben und allgemeinem Branding zu erstellen. Dann fügen wir ein wenig Flair hinzu.
- Lassen Sie die Buchstaben ein wenig von der Seite abprallen. Wufoo ist ein lustiges Wort, lassen Sie die Buchstaben ein bisschen Spaß haben.
- Früher haben wir ein T-Shirt mit Dinosauriern auf der Vorderseite gemacht und auf der Rückseite stand „Schnell. Intelligent. Furchterregend.“ Das sind Eigenschaften von sowohl Dinosauriern als auch Wufoo, ganz zu schweigen von dem lustigen kleinen Wortspiel mit FURCHTeinflößend. Lassen Sie uns diese ein- und ausblenden.
- Um die Verbindung mit dem Dinosaurier-Thema zu vervollständigen, wird ein T-Rex-Kopf neugierig von unten auftauchen und dann wegzoomen. Das Wort „Schnell.“ wird erscheinen, während er wegzoomt, was eine weitere schöne kleine Verbindung ist.
Ich habe alle Teile in Illustrator zusammengesetzt.

Beachten Sie, wie das Logo und der Slogan als Umrisse dargestellt sind. Das bedeutet, dass sie nur Vektorformen sind und perfekt so im SVG als <path>s gerendert werden. Der Text, den Sie dort sehen („Schnell.“), ist in Illustrator als Text belassen.
Wenn ich dies aus Illustrator speichere, wird dies als <text>-Element belassen.
2. Als SVG speichern
Illustrator kann dies direkt als SVG speichern

Sie können diese SVG-Datei in einem Code-Editor öffnen und den SVG-Code sehen

3. SVG bereinigen, Formen Klassen geben
Sie möchten es vielleicht durch SVGO laufen lassen, um es zu optimieren und DOCTYPE usw. zu entfernen. Aber wichtiger für diesen Beitrag ist, dass Sie den verschiedenen Formen Klassennamen geben möchten, damit wir sie in CSS auswählen und etwas damit tun können!
<svg version="1.1" id="wufoo-ad" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 400 400" enable-background="new 0 0 400 400" xml:space="preserve">
<!-- background -->
<rect class="wufoo-background" fill="#D03E27" width="400" height="400" />
<!-- logo letters -->
<path class="wufoo-letter" fill="#F4F4F4" d="M60.858,129...." />
<path class="wufoo-letter" fill="#F4F4F4" d="..." />
<!-- etc -->
<!-- dinosaur -->
<g class="trex">
<path ... />
<path ... />
</g>
</svg>
4. Das SVG einfügen
Sie können dieses SVG direkt in das HTML kopieren und einfügen, wo die Anzeige erscheinen soll. Aber das würde die Vorlage wahrscheinlich nur verschmutzen. Höchstwahrscheinlich werden Sie einfach etwas tun wie
<aside class="sidebar">
<div class="module module-ad">
<?php include("ads/wufoo.svg"); ?>
</div>
...
5. Animieren!
Jetzt haben wir diese Formen im DOM, die wir wie jedes andere HTML-Element ansprechen und gestalten können. Machen wir das.
Nehmen wir an, wir möchten dies als eine 10-sekündige Zeitleiste gestalten.
Wörter zuerst ein-/ausblenden
Das Erste, was passieren soll, ist die Sache mit „Schnell. Intelligent. Furchterregend.“ Jedes Wort wird eine Sekunde lang angezeigt. Also machen wir eine Animation, bei der das Wort 10 % der Zeit angezeigt wird
@keyframes hideshow {
0% { opacity: 1; }
10% { opacity: 1; }
15% { opacity: 0; }
100% { opacity: 0; }
}
Dann zielen wir auf das erste Wort und lassen die Animation 10 Sekunden dauern (10 % davon sind 1 Sekunde)
.text-1 {
animation: hideshow 10s ease infinite;
}
Die nächsten beiden Buchstaben werden zunächst versteckt (opacity: 0;) und verwenden dann exakt dieselbe Animation, nur mit einer Verzögerung, um etwas später zu beginnen
.text-2 {
opacity: 0;
animation: hideshow 10s 1.5s ease infinite;
}
.text-3 {
opacity: 0;
animation: hideshow 10s 3s ease infinite;
}
Die zusätzlichen 0,5 Sekunden bei jedem dienen dazu, die Ausblendzeit des vorhergehenden Wortes zu berücksichtigen.
Buchstaben-Sprünge
Sobald diese Buchstaben mit der Animation fertig sind, werden die Buchstaben in WUFOO ihren Jiggle-Jump-Effekt ausführen, so wie hier

Der Trick hierbei ist, dass wir die Animation nur 5 Sekunden lang machen, sie aber einmal vorwärts und einmal rückwärts laufen lassen. So passt sie in unsere 10-sekündige Zeitleiste, wird genau in die Mitte platziert, wo wir sie haben wollen, und wir müssen nur in eine Richtung skalieren, denn wenn sie sich umkehrt, wird sie zurückskaliert.
Jeder Buchstabe hat eine leichte Verzögerung, damit sie etwas versetzt passieren.
.wufoo-letter {
animation: kaboom 5s ease alternate infinite;
&:nth-child(2) {
animation-delay: 0.1s;
}
&:nth-child(3) {
animation-delay: 0.2s;
}
&:nth-child(4) {
animation-delay: 0.3s;
}
&:nth-child(5) {
animation-delay: 0.4s;
}
}
@keyframes kaboom {
90% {
transform: scale(1.0);
}
100% {
transform: scale(1.1);
}
}
Das Obige ist aus Gründen der Kürze in SCSS geschrieben und enthält keine Präfixe (wie sie in der Produktion benötigt würden).
Ich denke, dass animation-delay eine Eigenschaft ist, die von einer nativen Randomisierung in CSS profitieren würde. Es wäre schön zu sehen, wie die Buchstaben jedes Mal ein wenig zufällig verzögert werden.
Dinosaurier zuletzt
Sobald die Wörter fertig sind, wird der Dinosaurier seinen Kopf herausstrecken. Auch wenn der Dinosaurier aus vielen <path>s besteht, können wir sie alle zusammen ansprechen, indem wir das <g> (Gruppe)-Tag ansprechen, das sie alle umschließt.
Da die Verwendung von translate zur Animation der Position besser ist, werden wir dies in den Keyframes tun
@keyframes popup {
0% {
transform: translateY(150px);
}
34% {
transform: translateY(20px);
}
37% {
transform: translateY(150px);
}
100% {
transform: translateY(150px);
}
}
Wir wollten, dass diese Animation etwa 3 Sekunden dauert. Sie läuft eigentlich in 10-Sekunden-Schleifen, aber Sie werden sie nur 3 Sekunden lang etwas tun sehen. Wenn translateY(150px) wirksam ist, ist der Dinosaurier so weit nach unten verschoben, dass Sie nichts sehen. Nach 37 % dieser Animation (etwa 3 Sekunden) werden Sie ihn langsam nach oben und dann schnell wieder nach unten fahren gesehen haben.
Wenn wir diese Animation anwenden, stellen wir sicher, dass
Der Dinosaurier zunächst versteckt ist
Die Animation verzögert ist, damit sie direkt nach dem Fade-in/Fade-out-Tanz der Wörter beginnt.
.trex {
transform: translateY(150px);
animation: popup 10s 6.5s ease infinite;
}
Der Dinosaurier taucht genau in der letzten Sekunde ab, was genau dann ist, wenn das Wort „Schnell.“ wieder auf dem Bildschirm erscheint (da alle Animationen auf infinite eingestellt sind, was sie für immer wiederholt). Das ist eine schöne kleine Synergie.
6. Machen Sie es zu einer responsiven / klickbaren Anzeige
Eines der schönen Dinge an SVG ist, dass es ohne Qualitätsverlust auf jede Größe skaliert werden kann. Um ein Inline-SVG wie dieses so zu skalieren, dass sein Seitenverhältnis beibehalten wird, können wir die alte gepolsterte Box-Technik verwenden.
<div class="wufoo-ad-wrap">
<svg class="wufoo-ad">
...
</svg>
</div>
.wufoo-ad-wrap {
height: 0;
padding-top: 100%;
position: relative;
}
.wufoo-ad {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
Die Idee hier ist, dass der „Wrap“ immer ein perfektes Quadrat relativ zu seiner Breite sein wird. Dann positionieren wir das SVG absolut in diesem perfekten Quadrat, das sich fröhlich selbst verkleinert.
Da dies eine Anzeige ist (die natürlich klickbar sein sollte), könnten Sie anstelle eines <div> für den Wrap ein <a href=""> verwenden, stellen Sie nur sicher, dass Sie es auf display: block; setzen.
Das finale Ding als Referenz.
Ich denke, es gibt eine Zukunft für diese Art von Dingen in der Display-Werbung, insbesondere aufgrund der CSS-Kontrolle und der einfachen, scharfen Größenanpassung.
Animation mit CSS war schon immer ein Problem, da sie prozentbasiert und nicht zeitbasiert ist. Das ist einer der Gründe, warum GSAP so beliebt ist. SVG-Animation (SMIL) hingegen macht eine ziemlich gute Figur, hat aber überhaupt keine Unterstützung in IE. Ich schreibe gerade smil2css, um dieses Problem zu umgehen. Es konvertiert SMIL im Wesentlichen in CSS-Animationen, ähnlich wie Ihr Artikel vorschlägt.
Klingt gut, hilft aber nicht mit aktuellen IE-Versionen – die unterstützen auch keine CSS-Animationen, die auf SVG angewendet werden.
Ich habe IE11 noch nicht getestet, da ich Win8 nicht habe, aber es funktioniert in IE10 unter Win7 einwandfrei. Es gibt im Moment viele Browserprobleme mit SVG. Dieses hier muss zum Beispiel noch in eine Chrome-Version aufgenommen werden.
IE-Herstellerpräfix nicht unterstützt?
Ich habe nie daran gedacht,
SVGals Code-Snippet zu verwenden; ich habe sie immer nur wie eine normalepngoderjpgverlinkt. Jetzt sehe ich, wie einfach es ist, ich werde sie die ganze Zeit so verwenden.Tolles kleines Tutorial, Chris. Danke!
Man kann sie auch mit
background-imageladen, was meine bevorzugte Methode ist.Guter Tipp, Steven. Kann man die Klassen- und ID-Parameter in CSS immer noch ansprechen, wenn man sie über
background-imagelädt?Tom, ich habe es nicht getestet, aber ich stelle mir vor, dass, wenn das SVG als Stil-Asset geladen wird, es nicht auf die Stylesheet des Elterndokuments zugreifen kann. Es funktioniert aber definitiv, wenn Sie das relevante CSS in ein <style>-Tag innerhalb der SVG-Datei einbetten.
Guter Beitrag! Danke für die Tipps.
Ich habe letzte Woche mit SVG / CSS-Animationen herumgespielt und es hat eine Weile gedauert, bis ich die Syntax verstanden hatte. Ich habe es jedoch geschafft, eine Variante der beliebten „Linienzeichnungs“-Animation zu implementieren: http://codepen.io/shshaw/pen/JDEsG
Meine Hauptherausforderung war, wie man die
animation-delays für einzelne Elemente elegant handhabt, aber durch die Trennung der verschiedenen Animationsphasen (Linienzeichnung, Strichausblendung, Füllungseinblendung) konnte ich die Animationen der Elemente wie gewünscht abstufen.Wow, Shaw, das ist ziemlich cool. Großartige Arbeit.
Leider animieren auf Chrome Mobile nur die drei Wörter. Der Dinosaurier und Wufoo tun es nicht, oder ist das beabsichtigt?
Gute Arbeit! Ich habe in letzter Zeit viel mit SVG-Animationen gemacht, gut, diese Technik im Hinterkopf zu behalten. Ein weiterer Vorteil: Sie können die Animation für verschiedene Bildschirmgrößen mit Media Queries anpassen. Das kann man meines Wissens nach nicht mit reinen Inline-SVG-Animationen machen.
SVG-Animationen (SMIL) können CSS-Eigenschaften animieren, sodass Sie mit Prozentwerten animieren können. Media Queries können für die Positionierung etwas unübersichtlich werden, funktionieren aber gut für das Ein- und Ausblenden. Es ist ein Geben und Nehmen, denn CSS kann nicht alles, was SMIL kann. Ein Beispiel wäre das Animieren entlang eines Pfades.
Warum färbst du nicht mit Klassen?
Sie können fill=”FFFFFF” entfernen und es so machen
Das ist die Sache, die ich seit ein paar Monaten lernen versuche, aber sie ist ziemlich komplex :(
Ich habe diese Illustrator-Technik verwendet, um SVGs zu erstellen, die auch einen Doctyoe für das SVG ausgeben. Ich gehe davon aus, dass dies notwendig ist. Liege ich mit meiner Annahme richtig?
Klingt, als ob Sie die Dateigröße Ihrer SVG-Datei optimieren möchten. Wenn ja, könnten Sie die Abkürzung nehmen und sie einfach durch SVGO laufen lassen.
Illustrator (und Inkscape) erstellt eigenständige SVG-Dateien, die vollständig XML-konform mit Doctypes und Namespaces sind.
Wenn Sie das Bild nur im Browser verwenden (und wenn Ihr Server so konfiguriert ist, dass er immer den richtigen MIME-Typ für .svg-Dateien liefert), können Sie den Doctype normalerweise überspringen. Wenn Sie Ihren Code in eine html5-Seite kopieren und einfügen (oder ihn serverseitig über PHP importieren), können Sie auch die Namespace-Deklarationen überspringen.
s/peak/peek/ :P
Tolle Schritt-für-Schritt-Anleitung.
Eine Warnung für alle, die versuchen, CSS-Animationen und -Übergänge mit SVG zu verwenden: Vermeiden Sie die Verwendung des „-Elements, da die Dinge sehr schnell fehlerhaft werden!
http://codepen.io/AmeliaBR/pen/lshrp?editors=110
(dieses Beispiel konzentriert sich auf CSS-Übergänge und Mausereignisse)
http://codepen.io/AmeliaBR/pen/Dmoxz?editors=110
(speziell zu Animationen – nicht so fehlerhaft, aber immer noch inkonsistent)
Igitt. Das „ in der Warnung sollte <use> sein. Muss daran denken, die Vorschauoption zu verwenden.
PS: Nette Auto-Einbettungen, Chris & Co.!
Aufbauend auf dem bereits Gesagten scheint die Unterstützung für SVGs in mobilen Browsern schlecht zu sein. Die meisten SVGs auf dieser Seite sind hier auf Mobile Safari (iOS 6.1.6) komplett leere Quadrate und Animationen scheinen ganz auszufallen.
SVGs, einschließlich animierter (sowohl JS als auch reine CSS), funktionieren auf meinen Nexus-Geräten (5 und 7) einwandfrei. Es scheint auch auf dem xcode iDevice-Simulator gut zu funktionieren, obwohl das natürlich nicht viel aussagt ;).
Sehr schön. Gibt es bereits eine Software, die den CSS-Code einfach für Sie generieren kann. Wählen Sie einfach die gewünschte Animation aus, und zack! Da haben Sie es. Alles ist sauber codiert [HTML+CSS] nach dem Exportieren/Speichern. :D
Entschuldigung, dumme Frage, aber nicht gut im Design: Ist Illustrator erforderlich oder können wir das auch in Photoshop machen?
Aufgrund der Natur von SVG (Vektorgrafiken) benötigen Sie ein Programm, das Vektoren sofort verwenden und bearbeiten kann. Photoshop kann das nicht. Ich bin mir sicher, dass es auch andere Optionen als Illustrator gibt!
Photoshop: Nein. Sie könnten Inkscape verwenden, das kostenlos und Open Source ist.
Das ist großartig, Chris, schon wieder! Wenn Ihr Keyframe-Ende (der 100%-Teil) an derselben Position ist wie der Anfang (der 0%-Teil), müssen Sie das Ende nicht definieren, das ist das Standardverhalten.
Ich habe diese Technik bei einer kürzlichen Neugestaltung von http://spigotdesign.com verwendet, indem ich eine Vielzahl von Übergängen und Transformationen eingesetzt habe.
Funktioniert gut in den meisten modernen Browsern. In Firefox ist es ziemlich hässlich. Schön zu sehen, dass die Wufoo-Animation in FF korrekt ist.
Ich poste das hier, weil diese Technik mit älteren Webkit-Browsern ein großes Durcheinander verursachen könnte. Es gibt einen seltsamen Fehler in Webkit mit Elementen, die in -Tags eingebettet sind. Nicht-relative Links brechen CSS-Animationen. Mein altes Safari (5.1.10) weigert sich sogar, die Seite vollständig anzuzeigen, wenn sie ein Inline-SVG enthält, das von CSS animiert und in einen Link eingebettet ist. Ich untersuche das noch, aber es scheint, dass eine Lösung darin bestehen könnte, den Link über JavaScript hinzuzufügen. Dann wird Chrome (35.0.1916.114) die Animation ausführen, und das alte Safari wird die Seite anzeigen, nur ohne Animation.
Haben Sie eine Lösung dafür gefunden? Wenn möglich, teilen Sie sie mit uns.
Ups, Entschuldigung! Das hätte lauten sollen: …mit <svg>-Elementen, die in <a>-Tags eingebettet sind…
Sie können aus Illustrator CC mit Klassen und IDs im SVG-Code speichern.
KLASSE: Um einem Objekt eine benannte Klasse zu geben, wenden Sie einen Grafikstil mit diesem Namen an.
ID: Um eine ID anzuwenden, benennen Sie eine Ebene so, wie Sie Ihre ID haben möchten, und legen Sie Ihr Objekt darauf.
Wenn Sie Ihre SVG-Datei speichern, gehen Sie zu „Erweiterte Optionen“ und wählen Sie diese Einstellungen aus
Profil: SVG1.1
CSS-Eigenschaften: Stil-Elemente
Dezimalstellen: 3
Aktivieren Sie das Kontrollkästchen für „Weniger Elemente ausgeben“
Lassen Sie den Rest deaktiviert
Wenn Sie in einem Texteditor öffnen, fügt Illustrator Inline-Stile hinzu, die Sie löschen und stattdessen ein CSS-Dokument zum Stylen verwenden können.
Definieren Sie atomare, wiederverwendbare, ungestaltete Komponenten
Gruppieren Sie sie in komplexere Komponenten mit „use“ mit Stilen und Transformationen
Klonen Sie komplexe Komponenten/ganze SVGs, um die Unabhängigkeit zu erreichen