如果我在HTML主体中有几个SVG元素,其中每个SVG引用一个CSS类名,并且这个类名在下面的一个SVG元素中定义,那么所有SVG元素都受此样式的影响。我试图找出这是否是设计的,以及如何确保CSS类名对于定义它的SVG是本地的。
<svg xmlns="http://www.w3.org/2000/svg" width=100 viewBox="0 0 15 10">
<path class="iconMain" d="M7.5,9,1,4.78789l.46713-.91645L7.5,7.85543l6.03287-3.984L14,4.78789ZM14,1.91646,13.53287,1,7.5,4.98349,1.46713,1,1,1.91646l6.5,4.2121Z" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width=100 viewBox="0 0 15 10">
<defs>
<style>
.iconMain {
fill: #9cbacf;
}
</style>
</defs>
<path class="iconMain"
d="M7.5,9,1,4.78789l.46713-.91645L7.5,7.85543l6.03287-3.984L14,4.78789ZM14,1.91646,13.53287,1,7.5,4.98349,1.46713,1,1,1.91646l6.5,4.2121Z" />
</svg>
3条答案
按热度按时间aiqt4smr1#
你误解了
defs
的用法,他们习惯于define
图形元素,稍后使用use
标签,如果你在里面放一些不是图形元素的东西,它会直接进入文档,例如样式或脚本。即使def也是全局的,如果你在svg中定义了一个元素,你可以在另一个svg中使用它。我能想到的唯一方法是让样式只适用于一个特定的svg是为每一个样式都有一个不同的类。
pxiryf3j2#
是的,SVG内容是全局内容。
id
属性变为重复,以下SVG将<use>
第一个元素与该id
<style>
成为全局样式。最简单、最现代的方法是:
创建一个*原生 * JavaScript Web组件(JSWC)
将
innerHTML
Package 在shadowDOM中,创建您所要的“scope”,所以样式不会 * 泄漏 *(除了CSS属性,parts和inheritable styles)
Symantic HTML:
然后创建:
将Web组件重构为
<svg-icon>
,您就拥有了自己的图标设计系统:来自另一个StackOverflow问题的
fish
和ice
图标:wydwbb8l3#
包含
<style>
元素的内联SVG会像任何其他附加样式表一样影响全局文档样式。正如Paulo Fernando指出的那样
请参见以下示例也影响HTML元素:
用例一:圣像
常见做法:保持图标图形尽可能中性以便于样式化,例如更改每个示例的填充/描边颜色。
你可以从流行的图标库中获得灵感,比如fontAwesome,羽毛图标,材质图标等。
主要概念:将你的图标组织为
<symbol>
元素,并通过<use>
元素创建示例。在某种程度上,您还可以使用外部
<use>
引用,如然而,存在关于渐变、遮罩、剪辑路径等的一些限制或问题。(相关的“SVG忽略渐变样式”)。
用例二:具有预定义颜色的复杂SVG图形
并不总是需要操作SVG样式,例如,在显示复杂的矢量图时。
在本例中-只需使用引用SVG文件的
<img>
元素。此文件也可以包含样式规则,但不会覆盖任何全局HTML元素样式。
否则,使用本机Web组件可能是一个很好的替代方案,如下所述:“如何更改'svg'元素的颜色?“