Eine hervorragende Funktion von SVG ist, dass Sie eine Form (oder eine Gruppe von Formen) einmal definieren und sie dann mehrmals auf einer Seite verwenden können. Sie können sogar unterschiedliche Füllungen und Filter usw. auf die verschiedenen Versionen anwenden. SVG-Templating, wenn Sie so wollen.
Mal sehen, ob wir das gut nutzen können, indem wir einige Tabs erstellen.
Ich habe erfahren, dass dies durch Oleg Solomkas Artikel auf Codrops möglich ist. Clever!
Es funktioniert so
- Definieren Sie die Form (es kann ein Kreis, ein Rechteck, ein Polygon oder eine beliebige Form oder eine Gruppe davon, die in ein
<g>eingepackt ist). - Geben Sie dieser Form eine ID.
- Verstecken Sie diese Form.
- Verwenden Sie die Form dort, wo sie benötigt wird, mit
<use>.
Das sieht in HTML so aus
<!-- TEMPLATE -->
<svg width="100px" height="100px" viewBox="0 0 100 100" class="visually-hidden">
<circle id="template" cx="50" cy="50" r="50">
</svg>
<!-- USE TEMPLATE SEVERAL TIMES -->
<svg viewBox="0 0 100 100" class="circle circle-1">
<use xlink:href="#template">
</svg>
<svg viewBox="0 0 100 100" class="circle circle-2">
<use xlink:href="#template">
</svg>
<svg viewBox="0 0 100 100" class="circle circle-3">
<use xlink:href="#template">
</svg>
Sie können dann diese verschiedenen Verwendungen der Vorlage einzeln referenzieren und damit tun, was Sie möchten. Zum Beispiel SVG-Gradientfüllungen oder SVG-Filter oder was auch immer.

display: none; setzen. Ich würde wahrscheinlich vermeiden, sie direkt zu verwenden, um eine saubere Trennung der Verantwortlichkeiten zu wahren.Demo
Sehen Sie den Pen Basic SVG Templating von Chris Coyier (@chriscoyier) auf CodePen
Tabs erstellen
Ich habe gerade einige Papiere von einem Anwalt zurückbekommen und natürlich sind sie alle mit diesem klassischen Aktenordner-Design getabbt.

Diese Art von Form wurde schon einmal mit CSS versucht. Abgerundete Tabs befasst sich mit der Verjüngung der Form nach unten in den Rest des Ordners. Schräge Tabs befasst sich mit den abgewinkelten Seiten. Aber keiner von beiden ist perfekt, es wäre schwierig oder unmöglich, sie zu kombinieren, und sie sind, obwohl clever, ein wenig "hackig" mit der Verwendung von generiertem Inhalt und Ähnlichem.
Wäre es nicht einfacher, die verdammte Form einfach als Vektor zu zeichnen und zu verwenden? Absolut, das ist perfektes SVG-Terrain. Und besser noch, wir können einfach eine Vorlage verwenden, um sie einmal zu definieren und immer wieder zu verwenden. Das ermöglicht es uns, die Farbe usw. zu ändern, ohne ein neues Asset anfordern zu müssen, und sieht scharf aus, egal in welcher Größe wir sie verwenden.
Sie könnten diese Form leicht in jedem Vektorgrafikprogramm zeichnen und den SVG-Code dafür extrahieren. Wenn Sie dabei Hilfe benötigen, sollte dieser Artikel nützlich sein.
Ich habe mich auf Stockfoto-Websites umgesehen, um einige zu finden, nur zum Spaß, und ich habe einige bei Shutterstock gefunden, die ungefähr dem entsprachen, was ich vorhatte. Ich habe sie heruntergeladen und die Form daraus extrahiert.

Zurückgeführt ist im Grunde dies
<svg>
<path id="tab-shape" d="M116.486,29.036c-23.582-8-14.821-29-42.018-29h-62.4C5.441,0.036,0,5.376,0,12.003v28.033h122v-11H116.486
z">
</svg>
Das HTML
Da wir Tabs wahrscheinlich Navigation nennen würden und Navigation Listen sind, hier ist, was wir am Ende hätten
<nav role="navigation" class="main-navigation">
<ul>
<li class="tab-1 active">
<a href="#home">
<span>Home</span>
<svg viewBox="0 0 122 40">
<use xlink:href="#tab-shape"></use>
</svg>
</a>
</li>
<li class="tab-2">
<a href="#about">
<span>About</span>
<svg viewBox="0 0 122 40">
<use xlink:href="#tab-shape"></use>
</svg>
</a>
</li>
<!-- etc. as many tabs as you'd like -->
</ul>
</nav>
Wir müssen <svg> im Markup verwenden, da dies die Funktionsweise ist. Wir verpacken es in ein <a>, da wir beabsichtigen, die Tabs als klickbare/tippbare Links zu gestalten. Wir brauchen das <span>, da wir beabsichtigen, das <svg> und den Text direkt übereinander zu positionieren, mit dem Text darüber.
Das CSS
Wir können eines der umgebenden Elemente als Positionierungskontext verwenden. Wir werden sowohl den <span> als auch das <svg> absolut positionieren und dem <span> einen höheren z-index geben.
Präsentiert in SCSS, da die Verschachtelung es angenehmer zu lesen macht
.main-navigation {
overflow: hidden;
position: relative;
padding: 0 0 0 1rem; /* push tabs back to right */
ul {
list-style: none;
padding: 0;
}
li {
float: left;
width: 12rem;
height: 5rem;
margin: 0 0 0 -1rem; /* pull to left to overlap tabs */
position: relative;
&.active {
z-index: 6; /* active one on top */
}
}
a {
position: relative;
display: inline-block;
width: 100%;
height: 100%;
}
svg {
width: 120%; /* tab shape should stick out past clickable box */
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 1;
pointer-events: none; /* SVG eats clicks weird */
}
span {
position: relative;
padding: 1rem 0 0 3.3rem; /* position the text */
z-index: 2;
display: inline-block;
width: 100%;
height: 100%;
}
}
Um das Aussehen jedes Tabs zu ändern, können Sie sie anhand des Klassennamens referenzieren und die fill ändern. Wir brauchen sie auch in umgekehrter z-index-Reihenfolge, damit der erste oben liegt und nicht der letzte, was durch explizites Deklarieren einfach genug ist.
.tab-1 {
z-index: 4;
svg {
fill: red;
}
}
.tab-2 {
z-index: 3;
svg {
fill: orange;
}
}
Die Demo
Sehen Sie den Pen SVG Tabs von Chris Coyier (@chriscoyier) auf CodePen
Es gibt etwas JavaScript im Inneren, um die verschiedenen Tabs zu aktivieren, was im Grunde nur das Ändern eines Klassennamens ist.
Sie werden vielleicht bemerken, dass die Tabs auch leichte Verläufe haben. Die interessante Verbindung hier ist, dass Sie diesen SVG-Verlauf in demselben <svg> wie die ursprüngliche Vorlage definieren können und dann eine Vorlageform füllen, indem Sie einfach den Filter anhand der ID referenzieren.
<linearGradient id="tab-1-bg" x1="0%" y1="0%" x2="0%" y2="65%">
<stop offset="0%" style="stop-color: rgba(136, 195, 229, 1.0);" />
<stop offset="100%" style="stop-color: rgba(118, 160, 192, 1.0);" />
</linearGradient>
.tab-1 {
svg {
fill: url(#tab-1-bg);
}
}
Im Grunde können Sie Ihre Filter also auch als Vorlagen betrachten und sie nach Belieben wiederverwenden. Spielen Sie auch ein wenig mit der Demo herum. Dort gibt es einige auskommentierte Teile, die sich hauptsächlich mit Schatten befassen, die Ihnen gefallen könnten. Richtig cool wäre es, sie flexibel zu machen, wo die Tabgröße je nach verfügbarem Platz größer und kleiner wird (auch der Text) und sie dann bei geringer Größe vollständig auszublenden und durch eine mobile Navigationslösung zu ersetzen.
Hey! Danke, dass Sie mich erwähnt haben) Könnte ich erwähnen, dass Iconmelon auf dieser Technik aufgebaut wurde? ;)
Sehr cooler Artikel. Nur ein weiterer Grund, einen Vektoreditor (oder den Browser, wenn das Ihr Ding ist) zum Entwerfen Ihrer Websites zu verwenden.
Toller Artikel…
Was bedeutet und bewirkt das Attribut "viewbox="0 0 20 30"? Was stellen die Zahlen dar? Sind sie Pixeln gleichwertig?
Das Attribut viewbox auf einem SVG-Element erstellt das Koordinatensystem für das Bild. Es ist der Schlüssel zum "skalierbaren" Aspekt von Scalable Vector Graphics: Anstatt Formen nach Pixeln oder ems oder beliebigen absoluten Maßen zu definieren, definieren Sie sie anhand beliebiger "Benutzerkoordinaten". Beachten Sie, dass in der Definition des SVG-Pfades für die Tab-Form die Zahlen ohne Einheiten angegeben sind; diese sind in Benutzerkoordinaten.
Der Browser skaliert das Benutzerkoordinatensystem auf das Rechteck, in dem das SVG basierend auf dem Attribut viewbox gezeichnet wird. Die vier Zahlen sind jeweils die Koordinaten der oberen linken Ecke sowie die Breite und Höhe des Bildes in Benutzerkoordinaten. Die Werte für Breite und Höhe werden nach Bedarf skaliert, um der endgültigen Breite und Höhe des Bildes zu entsprechen, wie sie durch CSS oder durch die Attribute SVG width und height definiert sind. Ein separates Attribut, preserveAspectRatio, kann eine einheitliche Skalierung erzwingen (gleicher Skalierungsfaktor für Höhe und Breite), damit das Bild nicht verzerrt wird.
Die ersten beiden Zahlen in der viewbox können verwendet werden, um das Bild relativ zu dem Feld zu verschieben, in dem es gezeichnet wird. Dies ähnelt der Verwendung von Positionsangaben, um img-Elemente oder Hintergrundbilder zu verschieben. Sie können sogar so etwas wie viewbox="0 100 100 -100" tun, wenn es Ihnen leichter fällt, mit dem Ursprung Ihres Koordinatensystems in der unteren linken Ecke zu arbeiten: Der negative Höhenwert kehrt die Standardrichtung um, während die ersten beiden Zahlen die obere linke Ecke als (0,100) definieren.
Wenn Sie keine viewbox verwenden, werden alle Abmessungen innerhalb des SVG als Pixel interpretiert, die relativ zur oberen linken Ecke gemessen werden, und es erfolgt keine Skalierung.
Hier ist die vollständige Spezifikation
http://www.w3.org/TR/SVG11/coords.html#ViewBoxAttribute
Vielen Dank, Amelia BR, für Ihre großartige Erklärung des viewbox-Attributs…
KORREKTUR
Es ist eine gute Idee, die verlinkten Quellen tatsächlich zu lesen, bevor man eine Antwort postet. Entschuldigung. Ich habe D3.js-Skalen mit der grundlegenden SVG-Viewbox-Syntax verwechselt.
Nein, Sie können keinen negativen Höhenwert verwenden, um die Richtung der Benutzerkoordinaten umzukehren. Dies wird in der Spezifikation eindeutig als Fehler beschrieben. Wenn Sie die Richtung der Koordinaten umkehren möchten, müssen Sie eine Transformation von scale(1,-1) verwenden. (Alle Transformationen ändern die Art und Weise, wie Benutzerkoordinaten auf den Raum abgebildet werden, in dem die Zeichnung gerendert wird.)
http://www.w3.org/TR/SVG11/coords.html#TransformAttribute
Bilder sind mehr als ein paar hundert Worte wert
http://codepen.io/AmeliaBR/full/lvkyD
Muss das Tag
<lineargradient>ein Kind eines<svg>-Tags sein? Oder kann es einfach ein eigenständiges Tag sein?Es ist möglich, dass einige Browser es trotzdem richtig rendern, aber das Tag
<linearGradient>ist ein SVG-Element und sollte daher Teil eines SVG-Blocks sein. Das empfohlene Format ist, es auch in ein<defs>-Tag zu packen, aber das beeinflusst das Rendering nicht, da ein SVG-Gradient ohnehin nicht allein gerendert wird.Danke nochmals Amelia BR… Ihre Zeit, meine Fragen zu beantworten, wird sehr geschätzt…
Das wird nicht nur gut skalierbar sein, wie Sie sagten, sondern auch auf großen "Retina/HD"-Geräten wie MacBook Pros, Tablets usw. großartig aussehen.
Toller Beitrag, Chris! SVG hat so viele coole Funktionen, und mit der Möglichkeit, es direkt in HTML einzubetten, zeigt es wirklich, wie nützlich und leistungsfähig es ist. Außerdem ist es perfekt für Retina-fähige Grafiken.
Coole Technik. Ich mag es nicht wirklich, das SVG so im HTML zu sehen. Macht es weniger semantisch.
Ich wollte gerade dasselbe sagen. Die Websites, an denen ich arbeite, haben alle dasselbe HTML, daher kann ich solche Techniken, die auf nicht-semantischem Markup basieren, nicht verwenden. Ich liebe SVGs, aber sie müssen im CSS sein.
Tolle Technik. Sehr nützlich. Danke Chris!
Sehr nett. Ich möchte aus eigener Erfahrung erwähnen, dass es sich lohnt, gekrümmte Pfade (d=“…”) selbst zu konstruieren und AI nicht die Arbeit machen zu lassen (wenn der Pfad nicht zu kompliziert ist). Gute Kurvensyntax ist einfache Mathematik und natürlich viel kürzer als das übliche Adobe-Markup. Eine Dezimalstelle (0,1) reicht in den meisten Fällen aus.
Sie können das Verstecken der Vorlage mit CSS vermeiden, indem Sie sie innerhalb eines
<def>-Elements definieren. Auf diese Weise wird sie nicht gerendert, aber Sie können sie immer noch mit<use>verwenden, genau wie Sie es in dieser Technik hier getan haben.Ich habe dasselbe in meinem Artikel auf Codrops (über die Erstellung von texturiertem Text) getan, als ich zum Beispiel ein SVG
patternoder eine SVGmaskerstellt und sie dann auf demtext-Element verwendet habe.Was auch sehr cool ist, ist das Speichern Ihrer Illustrator-Dateien als SVG-Datei, dann sehen Sie beim Erscheinen des SVG-Fensters SVG-Code, so einfach haben Sie ganz schnell SVG-Code. Toller Artikel!!
Wow, das ist wirklich beeindruckend, ich habe von Iconmelon gehört, hatte aber noch keine Gelegenheit, es anzusehen.
Es scheint, dass immer mehr SVG in unsere HTML-Dateien eindringen wird.
Vielen Dank nochmals für diese großartige Demo, ich werde einige davon in zukünftigen Projekten verwenden.
Hey! Das ist wirklich nett! Aber was ist mit geraden Tabs? Was, wenn meine Tabs flexibel sein müssen?
Danke Chris, das wird sehr nützlich sein…
Toller Artikel. Danke Chris.
Hallo, das ist eine großartige Technik, aber ich habe Probleme, die Pfadfüllung eines geklonten Elements zu ändern.
Ich kann CSS verwenden, um einen Pfad in der ursprünglichen SVG anzusprechen, aber nicht, scheint es, um einige der geklonten SVGs anders als die übergeordnete zu machen.
Hoffentlich zeigt dieser Pen das Problem.
Irgendwelche Ideen?
http://www.w3.org/TR/SVG11/struct.html#UseElement
„CSS-Selektoren wirken nur auf den formalen Dokumentenbaum, nicht auf den generierten Baum; daher werden diese Selektoren keine Übereinstimmung ergeben.“
Den Demo-Fork habe ich versucht, das Konzept hinter Douglas Bowmans "Sliding Doors" und dieser SVG-Vorlagentechnik zu kombinieren. Benötigt zwei SVG-Formen: eine sehr breite für die linke Seite und eine kleine, nur für die rechte Ecke.
Wirklich nützlich! Wenn Sie Grunt verwenden, habe ich ein Tool geschrieben, das Ihre Projektordner nach SVGs durchsucht, Formen extrahiert, Header und etwas Whitespace entfernt, sie in einzelne Gruppen mit ihrem Dateinamen als ID einfügt und diese kombinierten Gruppen in ein unsichtbares SVG-Tag einer HTML-Datei Ihrer Wahl schreibt.
https://github.com/serrynaimo/grunt-svgtemplater