SVG-Verwendung und Farbverläufe als Füllung

Lesezeit: 4 Minuten

Benutzer-Avatar
RJo

Ich habe versucht, meine SVG-Symbole in eine Datei zu externalisieren und sie mit Markup wie zu referenzieren <svg><use xlink:href="file.svg#icon" /></svg>. Theoretisch funktioniert das sehr gut, aber verschiedene Browser haben Probleme mit dem Rendern. Alle Browser sind in der Lage, das SVG korrekt darzustellen, wenn auf das Symbol mit verwiesen wird <use> innerhalb der Datei und öffnen Sie die URL der SVG-Datei direkt.

Kurz gesagt, gibt es eine browserübergreifende Möglichkeit, SVG zu erhalten linearGradients arbeiten als Füllungen für Elemente, wenn auf die Symbole mit verwiesen wird <svg><use/></svg> im Markup?

Ich habe einen Plunker eingerichtet, der das Problem demonstriert:
http://plnkr.co/edit/feKvZ7?p=preview

Vereinfacht sieht das Markup wie folgt aus:

<!DOCTYPE html>
    <html>
      <body>
        <h1>SVG sprite test</h1>
        <svg width="100" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
          <use xlink:href="icon.svg#icon" />
        </svg>
      </body>
    </html>

Und die SVG-Datei sieht so aus:

  <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
      <defs>
        <linearGradient id="gradient">
          <stop offset="0" stop-color="black" />
          <stop offset="1" stop-color="white" />
        </linearGradient>
      </defs>
      <symbol id="icon" viewBox="0 0 100 100">
        <circle cx="50" cy="50" r="40" stroke="black" fill="url(#gradient)" />
      </symbol>
    
      <use id="iconuse" xlink:href="#icon" width="100" height="100" />
    
    </svg>

So sieht es in den verschiedenen Browsern aus:
Unterschiedliche Ergebnisse beim Rendern linearer Farbverläufe für Symbole in verschiedenen Browsern

  • Es ist viele Jahre später … was machst du heutzutage?

    – Nick Darvey

    20. Oktober 2020 um 13:47 Uhr

  • @NickDarvey eine gute Frage. Ich habe diesen Ansatz aufgegeben und verwende heutzutage Dinge wie svgr: github.com/gregberge/svgr. Könnte aber ein interessanter Zeitpunkt für einen erneuten Besuch sein. Bei einem kurzen Blick auf Plunkr gibt es immer noch Unterschiede zwischen den Browsern, wie sie die verschiedenen SVGs rendern.

    – RJo

    28. Oktober 2020 um 11:35 Uhr

Versuchen Sie es mit dem nächsten (so stellt Inkscape die Implementierung von Farbverläufen bereit):

<linearGradient id="gradient">
  <stop
     style="stop-color:black;"
     offset="0"/>
  <stop
     style="stop-color:white;"
     offset="1" />
</linearGradient>
...
<path
   style="fill:url(#gradient); ...

  • Ändern der Eigenschaften, in denen Sie sich befinden möchten style Attribute haben das Problem nicht behoben

    – RJo

    29. Mai 2017 um 8:30 Uhr

  • Versuchen Sie, Inline-SVG in img zu ändern <img src="./icon.svg#icon" />

    – FieryCat

    29. Mai 2017 um 8:43 Uhr

  • Das würde wahrscheinlich zum Rendern funktionieren, aber ich werde die Vielseitigkeit verlieren. Möchte diesen Weg nicht gehen.

    – RJo

    29. Mai 2017 um 8:51 Uhr

  • Irgendwelche Fortschritte dabei? Ich bin auf das gleiche Problem gestoßen und kann es nicht lösen.

    – Bice

    14. Juli 2020 um 18:33 Uhr

Das symbol -Tag wird verwendet, um die darin enthaltenen Elemente zu verbergen. Elemente innerhalb der symbol werden mit dem aufgerufen <use> Befehl durch ihren eindeutigen Indikator.
Daher ist es besser, diese Methode zum Aufrufen einzelner Elemente zu verwenden, anstatt das Ganze aufzurufen symbol

Darüber hinaus Elemente bei der Verwendung <use> fallen in die shadow DOM und die Verwendung von CSS wird in einigen Fällen unmöglich
Daher ist es besser, alle internen Stile innerhalb des Symbols zu löschen und sie direkt dem zuzuweisen use Befehl

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <linearGradient id="gradient">
      <stop offset="0" stop-color="black" />
      <stop offset="1" stop-color="white" />
    </linearGradient>
  </defs>
  <symbol  id="icon"  viewBox="0 0 100 100"> 
    <circle id="circle" cx="50" cy="50" r="40"   />
     <rect id="rect" x="100" y="10" width="100" height="100" />
  </symbol>

  <use class="iconuse" xlink:href="#circle" width="100" height="100" fill="url(#gradient)" stroke="black" />
     <use class="iconuse" xlink:href="#rect" width="100" height="100" fill="url(#gradient)" />
</svg>

  • MDN zeigt mit xlink:href direkt für das Symbol-Tag und nicht die einzelnen Elemente darin: developer.mozilla.org/en-US/docs/Web/SVG/Element/symbol

    – RJo

    28. Oktober 2020 um 11:31 Uhr

  • @RJo Wo steht, dass Sie einzelne Elemente nicht aus Symbol aufrufen können? in MDN nur ein Beispiel mit einem inneren Element, das ich mit zwei Elementen habe. Wenn Sie sich sicher sind, was Sie behaupten, zeigen Sie den Link von der Spezifikation W3C

    – Alexandr_TT

    28. Oktober 2020 um 11:45 Uhr

  • Das deutete nur auf Ihre ursprüngliche Beschreibung hin: “Es ist besser, diese Methode zum Aufrufen einzelner Elemente zu verwenden, als das gesamte Symbol aufzurufen”. Auf jeden Fall ging es bei der ursprünglichen Frage darum, auf ein Element mit einer ID in einer externen SVG-Datei zu verweisen. Nicht auf Elemente innerhalb einer Inline-SVG-Definition zeigen.

    – RJo

    10. November 2020 um 16:02 Uhr

vielleicht versuchen Sie es mit

<img src="https://stackoverflow.com/questions/44235845/name.svg">

1215720cookie-checkSVG-Verwendung und Farbverläufe als Füllung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy