Inline-SVG kann „gestylt“ werden, in dem Sinne, dass es bereits Füllungen und Konturen und dergleichen hat, sobald Sie es auf die Seite stellen. Das ist großartig und eine absolut gute Art, Inline-SVG zu verwenden. Aber Sie können Inline-SVG auch über CSS stylen, was irgendwie großartig ist, weil, stelle ich mir vor, für viele von uns CSS der Ort ist, an dem wir uns stark und wohl fühlen.
Es funktioniert ziemlich so, wie Sie es erwarten würden. Hier ist ein einfaches Beispiel
<svg>
<rect class="my-rect" ... />
</svg>
.my-rect {
fill: blue; /* remember it's fill not background, teamsters */
}
CSS hat etwas mehr „Power“, könnte man sagen, als Style-Attribute auf den SVG-Elementen selbst. Wenn dieses <rect> beispielsweise fill="red" hätte, würde das CSS trotzdem „gewinnen“. Sie denken vielleicht das Gegenteil, weil es so scheint, als wären Style-Attribute so mächtig wie Inline-Styles, aber das sind sie nicht. Inline-Styles sind allerdings immer noch mächtig.
Ebenso werden CSS-Regeln nicht weitervererbt, wenn etwas Spezifischeres passiert. Zum Beispiel
<g class="parent">
<rect fill="blue" />
</g>
.parent {
fill: red;
}
Das CSS verliert in diesem Fall, weil das Blau spezifischer auf das Rechteck angewendet wird.
Wenn ich SVG über CSS stylen möchte, finde ich es im Allgemeinen am einfachsten, die Style-Attribute ganz wegzulassen.
Wichtiger Hinweis!
Wir haben uns mit <use> beschäftigt. Nehmen wir diese Situation an
<svg>
<symbol viewport="0 0 100 100" id="thing">
<rect class="child" ... />
<symbol>
</svg>
<svg class="parent">
<use xlink:href="#thing" />
</svg>
Letztendlich wird das „Kind“ in das „Elternteil“ eingefügt, richtig? Richtig. Das sollte also funktionieren?
.parent .child {
fill: red;
}
Aber es tut es nicht.
So funktioniert <use>: Es klont dieses <symbol> und fügt es in einen „Shadow DOM“ im zweiten SVG ein. Sie können diesen Shadow DOM mit einem solchen Selektor nicht durchdringen. Funktioniert einfach nicht. Vielleicht gibt es eines Tages eine Lösung, aber im Moment nicht.
Sie können Folgendes tun:
.parent {
fill: red;
}
Und diese Füllung wird durchlaufen und die Kindelemente beeinflussen, wenn nichts Spezifischeres im Weg ist. Oder
.child {
fill: red;
}
und alle Instanzen dieses Kindes beeinflussen. Aber eben nicht beides.
Wenn Sie unterschiedlich gestylte Versionen desselben Elements benötigen...
Duplizieren Sie einfach das <symbol> oder was auch immer Sie brauchen. Die überwiegende Mehrheit der Informationen wird identisch sein, und GZip frisst identischen Text zum Frühstück.
Eine Hürde, die ich gerade entdeckt habe: Beim Definieren von SVGs in einer externen Datei können Sie keine
<style>-Tags innerhalb eines<symbol>haben – die Stile werden nicht angewendet, wenn Sie einen<use xlink:href="stuff.svg#mysvg"></use>verwenden. Zum Beispiel dieses Icon von Polymer verwendet CSS-Styling im Gegensatz zu präsentationsbezogenen Attributen.Um das zu lösen, können Sie das SVG so konvertieren, dass es nur präsentationsbezogene Attribute für das Styling verwendet. In Illustrator speichern Sie es einfach und wählen Sie im Dialogfeld unter „Erweiterte Optionen“ > „CSS-Eigenschaften“ „Präsentationsbezogene Attribute“.
Ja, da gibt es einen grundlegenden Unterschied. Wenn es extern referenziert wird, teilt es nicht denselben DOM wie der Rest des Dokuments, wie es der Fall ist, wenn Sie
useaus demselben Dokument verwenden.Ich würde mich sehr freuen zu erfahren, ob etwas erneuert wurde und es eine Möglichkeit gibt, ein CSS-Design für eine bestimmte Klasse in der SVG-Datei zu schreiben!
Danke :)
Hallo! Ja, Sie können definitiv einen Klassennamen im inline eingebetteten SVG erstellen und diese Klasse in einem Stylesheet aufrufen. Der Trick ist, sicherzustellen, dass die Eigenschaften, die Sie in CSS steuern möchten, nicht bereits im SVG selbst festgelegt sind, denn genau wie bei CSS überschreiben inline Eigenschaften die Eigenschaften von Stylesheets.
Es ist jetzt möglich, einzelne Komponenten von Symbolen auf unterschiedliche Weise mit CSS Custom Properties zu stylen.
Beispiel