Wir haben gelernt, dass eine Einschränkung bei der Verwendung von <use> zum Einfügen eines SVG-Teils darin besteht, dass Sie keine zusammengesetzten CSS-Selektoren schreiben können, die dort durchgreifen. Zum Beispiel
<svg class="parent">
<!-- shadow DOM boundary is effectively here -->
<use class="child">
<!-- stuff <use> references gets cloned in here -->
</use>
<!-- end shadow DOM boundary -->
</svg>
Diese Shadow DOM-Grenze verhindert, dass Selektoren wie
/* nope */
.parent .child {
}
funktionieren. Vielleicht erhalten wir eines Tages einen funktionierenden CSS-Selektor, der diese Shadow DOM-Grenze durchdringt, aber zum Zeitpunkt des Schreibens ist er noch nicht vorhanden.
Sie können die Füllung immer noch auf das <svg>-Elternelement setzen, und diese wird nach unten durchgereicht, aber das liefert Ihnen nur eine Farbe (denken Sie daran, das präsentationsbedingte fill-Attribut bei diesen Formen nicht zu setzen!).
Fabrice Weinberg dachte sich jedoch eine nette kleine Technik aus, um zwei Farben zu erzielen, indem er das currentColor-Schlüsselwort in CSS ausnutzte.
Setzen Sie die Füll-CSS-Eigenschaft bei beliebigen Formen auf currentColor
.shape-1, .shape-2 {
fill: currentColor;
}
Auf diese Weise wird beim Setzen der color-Eigenschaft auf dem übergeordneten <svg>-Element diese ebenfalls durchgereicht. Sie bewirkt allein nichts (es sei denn, Sie haben <text> darin), aber currentColor basiert auf color, sodass Sie es für andere Dinge verwenden können.
svg.variation-1 {
fill: red;
color: orange;
}
svg.variation-2 {
fill: green;
color: lightblue;
}
Demo
Sehen Sie sich den Pen CodePen Logo als Inline-SVG von Chris Coyier (@chriscoyier) auf CodePen an.
Gibt es eine Möglichkeit, dasselbe mit Animationen zu tun? Wer definiert es, nur um es später als wirkend zu definieren?
Animationen funktionieren sozusagen von Haus aus so: Der Animationsname und @keyframes werden in einem eigenen Block definiert und dann auf die Eigenschaft angewendet, bei der sie laufen sollen.
Ich muss ein SVG-Bild animieren, das zweimal erscheint, und nur eines davon soll funktionieren.
Das Problem ist, dass die Animation auf die gesamte Datei wirkt und ich sie nicht nur auf einen Teil der SVG-Datei abspielen kann.
Das Video hier zeigt einen Trick, wie man das mit Farben löst. Ich suche nach einer Lösung für Animationen...
Ich hoffe, ich war klar..
Wenn man eine Klasse aus dem SVG auswählen könnte, würde das das Problem lösen, aber im vorherigen Video wurde erklärt, dass es keine Möglichkeit gibt.
Heutzutage kann das ohne den currentColor-Trick gemacht werden
Sie können den ::part()-Pseudoelement-Selektor verwenden, um ein Element des Shadow DOM auszuwählen. Sie müssen ein Attribut part=”inner-box” zu dem Element mit dem Attribut class=”inner-box” hinzufügen und danach können Sie dieses Element auswählen mit
.logo-2 use::part(inner-box)
oder
.logo-3 use::part(inner-box)
Ich habe den CodePen geforkt und diese Details geändert. Schauen Sie sich CodePen an.