使用从内容加载的 SVG 样式表

Posted

技术标签:

【中文标题】使用从内容加载的 SVG 样式表【英文标题】:Using style sheet for SVG loaded from content 【发布时间】:2013-09-01 16:49:07 【问题描述】:

我有一个circle.svg 文件

<svg xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink"
   >
  <circle class="circle" cx="24" cy="24" r="24"></circle>
</svg>

还有一个 html 文件

...
<div class="bullet blue">
  ...
</div>
<div class="bullet red">
  ...
</div>
<style>
.bullet:before 
  content: url(circle.svg);

.bullet.blue:before 
  .circle 
    fill: #0000FF;
  

.bullet.red:before 
  .circle 
    fill: #FF0000;
  

</style>

我希望样式表填充圆圈,但它不起作用。但是,如果我将 svg 代码嵌入到 HTML 中,样式表会对其生效,但我不想在 HTML 代码中插入额外的资源。有没有办法通过 CSS 做到这一点?如果没有,使用 javascript 怎么样?

【问题讨论】:

Can I change the fill color of an svg path with CSS?的可能重复 【参考方案1】:

我不认为如果您将 svg 设置为外部资源, 您将能够使用 css 或 javascript 修改其内部属性 这就像尝试使用 css 设置 iFrame 样式一样。

几个解决方案:

    将 SVG 嵌入到 html 中 从 SVG 中创建一个带有蓝色和红色圆圈的精灵,并且只移动背景位置 创建多个 SVG 并根据类分别调用它们。 希望对您有所帮助。

【讨论】:

【参考方案2】:

样式不适用于文档,并且您拥有的 SVG 和 HTML 是单独的文档。

如果您通过两个 &lt;object&gt;&lt;iframe&gt; 标签嵌入圆圈,则可以做您想做的事情,因为您可以访问和操作 SVG DOM,即

var svgDoc = document.getElementById("objectId1").contentDocument;
var style = svgDoc.createElementNS("http://www.w3.org/2000/svg". "style");
style.textContent = ".circle  fill: #0000FF; ";
svgDoc.rootElement.appendChild(style);

对于另一个 &lt;object&gt; 标签也是如此。

【讨论】:

是的,我终于用 JavaScript 和模板系统做到了。

以上是关于使用从内容加载的 SVG 样式表的主要内容,如果未能解决你的问题,请参考以下文章

Webpack 从我的样式表中的内联 SVG 中去除标签,我不知道为啥

从useEffect动态呈现样式表?

外部样式表中带有 fill:url(#id) 样式的 Firefox SVG,内联样式很好

混合内容页面:请求不安全的样式表错误

带有嵌入式样式表的 SVG 到 PNG

拒绝加载样式表,因为它违反了内容安全策略