English 中文(简体)
SVG样式的CSS类名是全局的吗?
原标题:CSS class name in SVG style is global?
  • 时间:2023-06-23 21:37:33
  •  标签:
  • css
  • svg

如果我在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>

https://codepen.io/napsta32/pen/ExOPGae

问题回答

您误解了defs的用法,它们用于定义图形元素,稍后将与标签一起使用use如果您在其中放入了非图形元素的内容,它将直接进入文档,例如样式或脚本。即使def是全局的,如果你在svg中定义了一个元素,你也可以在另一个svg中使用它。

<svg xmlns="http://www.w3.org/2000/svg" width=100 viewBox="0 0 15 10">
  <defs>
  <circle id="circle_defined_in_first_svg" cx="1" cy="2" r="6" />
 </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>

<svg xmlns="http://www.w3.org/2000/svg" width=100 viewBox="0 0 15 10">
    <defs>
        <style>
            .iconMain {
                fill: #9cbacf;
                background-color:pink;
            }
        </style>       
      <script>
        var variableInsideDef = 7987;
      </script>      
    </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" />
  
  <use x="5" y="5" href="#circle_defined_in_first_svg"/>
  
</svg>

<p class="iconMain"> P ELEMENT IN ROOT AFFECTED BY THE STYLE INSIDE DEF</p>

<script>
  alert("Variable declared inside def: " + variableInsideDef)
</script>

内联SVG包含<;样式>元素将影响全局文档样式,就像任何其他附加样式表一样。

正如保罗·费尔南多

请参阅此示例,同时影响HTML元素

<svg xmlns="http://www.w3.org/2000/svg" width=100 viewBox="0 0 15 10">
    <path class="iconMain" d="M7.5 9l-6.5-4.2l0.5-0.9l6 4l6-4l0.5 0.9zm6.5-7.1l-0.5-0.9l-6 4l-6-4l-0.5 0.9l6.5 4.2z" />
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width=100 viewBox="0 0 15 10">
    <defs>
        <style>
            .iconMain {
                fill: #9cbacf;
            }
          p{
            color: red
          }
          body{
            background: #ccc
          }
          h1{
            color:green
          }
        </style>
    </defs>
    <path class="iconMain"
        d="M7.5 9l-6.5-4.2l0.5-0.9l6 4l6-4l0.5 0.9zm6.5-7.1l-0.5-0.9l-6 4l-6-4l-0.5 0.9l6.5 4.2z" />
</svg>

<h1>New Heading</h1>
<p>New paragraph</p>

Use case 1: icons

常见做法:保持图标图形尽可能中性,以便于设置样式,如更改每个实例的填充/笔划颜色。

你可以从流行的图标库中获得灵感,如fontAwesome、羽毛图标、材质图标等。

主要概念:将您的图标组织为<;符号>元素并通过<;使用>元素。

svg{
  width:1em;
  border:1px solid #ccc;
}
<svg viewBox="0 0 15 10">
  <use href="#angle-double-down" fill="red"/>
</svg>

<svg viewBox="0 0 15 10">
  <use href="#angle-double-down" fill="green"/>
</svg>

<svg viewBox="0 0 15 10">
  <use href="#angle-double-down" fill="purple"/>
</svg>


<!-- hidden svg icon asset -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15 10" style="position:absolute; height:0; width:0;">
  <symbol id="angle-double-down">
    <path d="M7.5 9l-6.5-4.2l0.5-0.9l6 4l6-4l0.5 0.9zm6.5-7.1l-0.5-0.9l-6 4l-6-4l-0.5 0.9l6.5 4.2z" />
  </symbol>
</svg>

在某种程度上,您还可以使用外部<;使用>引用,如

<svg viewBox="0 0 15 10">
  <use href="icons.svg#angle-double-down" fill="green"/>
</svg>

然而,在渐变、遮罩剪辑路径等方面存在一些限制或问题。(相关”SVG忽略渐变样式“)。

Use case 2: complex SVG graphics with predefined colors

例如,当您显示复杂的矢量插图时,并不总是需要操纵SVG样式。

In this case – just use an <img> element referencing a SVG file.
This file can also contain style rules but it won t override any global HTML element styles.

<img src="data:image/svg+xml,%3Csvg xmlns= http://www.w3.org/2000/svg  width= 100  viewBox= 0 0 15 10 %3E%3Cdefs%3E%3Cstyle%3E .iconMain %7B fill: %239cbacf; %7D body %7B background: red; %7D %3C/style%3E%3C/defs%3E%3Cpath 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  /%3E%3C/svg%3E" />

否则,使用本机web组件可能是一个很好的选择,如此处:”如何更改svg元素的颜色?”

不,默认情况下,SVG(可缩放矢量图形)中的CSS类不是全局的。SVG是一种基于XML的语言,用于描述二维矢量图形,它通过属性和属性提供了自己的应用样式的方法。

在SVG中,可以使用“class”属性为元素分配类名,类似于HTML。但是,与HTML不同的是,SVG中的类名并不是在整个文档中自动全局的。SVG中类的作用域仅限于当前文档片段或当前SVG文件。

如果要使用一个类将样式应用于多个SVG元素,则需要在同一SVG文档或文件中定义该类及其关联的样式。换句话说,为一个SVG文件中的类定义的样式不会影响另一个SVG中的元素,除非您在第二个文件中显式引用该类。

需要注意的是,SVG可以嵌入HTML文档中,在这种情况下,HTML文档中的CSS类将具有全局范围,包括其中的任何SVG元素。





相关问题
CSS working only in Firefox

I am trying to create a search text-field like on the Apple website. The HTML looks like this: <div class="frm-search"> <div> <input class="btn" type="image" src="http://www....

jquery ui dialog opens only once

I have a button that opens a dialog when clicked. The dialog displays a div that was hidden After I close the dialog by clicking the X icon, the dialog can t be opened again.

Drop down background url in Safari Issue

selectBox.selectCSS { background: url(/Images/replacementSelectBackground.png) top left no-repeat height:auto; } I have an issue in Safari only where the image is not rendering on top ...

CSS specific for Safari

How do you target specifically safari in css with styles?

Aligning textarea in a form

Ive used the following css code to align my form elements: form { position:relative; } form input { position:absolute; left:11em; } However, the textarea element is not aligned correctly with the ...

Firefox background image horizontal centering oddity

I am building some basic HTML code for a CMS. One of the page-related options in the CMS is "background image" and "stretch page width / height to background image width / height." so that with large ...

CSS problem with page footer

I have defined my page footer in the css file as: #footer { position: absolute; height: 50px; text-align: center; background: #66CCCC; bottom: 0px; left: 0px; width: 100%; height: ...