ChatGPT解决这个技术问题 Extra ChatGPT

SVG 根元素的默认背景颜色

svg

我想为整个 SVG 文档设置默认背景颜色,例如红色。

<svg viewBox="0 0 500 600" style="background: red">/* content */</svg>

上面的解决方案有效,但不幸的是样式属性的背景属性不是标准属性:http://www.w3.org/TR/SVG/styling.html#SVGStylingProperties,因此它在使用 SVG Cleaner 的清理过程中被删除。

还有另一种方法来声明这种背景颜色吗?

SVG Cleaner 中可能还有一个错误吗?它也删除了内联样式块,尽管它们是标准的:w3.org/TR/SVG/styling.html#StylingWithCSS

B
Ben Kane

SVG 1.2 Tiny 有 viewport-fill 虽然目前大多数浏览器都以 SVG 1.1 为目标,但我不确定该属性的实现范围有多广。 Opera 实现了 FWIW。

目前更跨浏览器的解决方案是粘贴一个宽度和高度为 100% 的 <rect> 元素,并将 fill="red" 作为 <svg> 元素的第一个子元素,例如:

<rect width="100%" height="100%" fill="red"/>

rect hack 有点工作,但它假设 svg 的纵横比始终与它获得的视口相匹配,因此它不会在所有情况下填满整个视口。
当纵横比与视口不匹配时,使用 width="10000%" height="10000%" 可以修复它。如果不是,则添加一些零
@mulllhausen 不幸的是,添加高达 10000000% 的值不起作用。还有其他建议吗?
一个废弃的 viewport-fill caniuse 拉取请求:github.com/Fyrd/caniuse/issues/2186 为什么他们为什么让 SVG 死掉。
@ErikDahlström 请在 stackoverflow.com/a/69899106/6747994 查看解决方案
c
cwingrav

发现这在 Safari 中有效。 SVG 仅在元素的边界框覆盖的背景颜色中着色。因此,给它一个具有零像素边界的边界(笔划)。它用您的背景颜色为您填充整个内容。

<svg style='stroke-width: 0px; background-color: blue;'> </svg>


这会导致所有子元素笔划也为零宽度,因此它不是一个好的“背景”选项。
J
JoKalliauer

是@Robert Longson 的回答,现在有代码了(本来没有代码,后来加的):

这个答案使用:

https://stackoverflow.com/a/11293812/6747994

https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Fills_and_Strokes


G
Gianluca Casati

让我报告一个我发现的非常简单的解决方案,它没有写在以前的答案中。我还想在 SVG 中设置背景,但我也希望这可以在独立的 SVG 文件中使用。

嗯,这个解决方案真的很简单,事实上 SVG 支持样式标签,所以你可以做类似的事情

<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
  <style>svg { background-color: red; }</style>
  <text>hello</text>
</svg>

好的和简单的解决方案!
虽然这通常适用于所有浏览器,但设置 <svg> 元素的 background-color 将使 IE11 呈现背景颜色也在 viewBox 属性定义的区域之外。不过,在使用 widthheight 属性时,这并不重要。
@conceptdeluxe 有趣的观察,理论上 svg 中编码的样式应该只适用于 svg 中。但是,几乎总是需要设置宽度和高度。
假设 <style> 标记位于顶层,<svg style"...."></svg><svg><style>...</style></svg> 之间有区别吗?如果不是,那么这个答案似乎就像 OP 的原始解决方案,以不同的语法重新打包。 (但也许这个解决方案在 SVG Cleaner 中存在,而 <svg style="..."></svg> 没有?)
@Labrador我一直在寻找解决方案,看到了这个问题,然后找到了解决方法并分享了它。我不知道,似乎仅支持此 w3.org/TR/SVG/styling.html#SVGStylingProperties 中报告的属性。另一方面,我提出的解决方案很有效,我也喜欢它,因为您可以设置其他 SVG 标签的样式,如路径、矩形等。对我来说,主要特点是它也适用于独立的 SVG。
C
Community

我目前正在处理这样的文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/css" href="style.css" ?>
<svg
  xmlns="http://www.w3.org/2000/svg"
  version="1.1"
  width="100%"
  height="100%"
  viewBox="0 0 600 600">
...

我试图把它放到 style.css 中:

svg {
  background: #bf1f1f;
}

它适用于 Chromium 和 Firefox,但我认为这不是一个好习惯。 EyeOfGnome 图像查看器不会渲染它,Inkscape 使用一个特殊的命名空间来存储这样的背景:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
    xmlns="http://www.w3.org/2000/svg"
    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
    version="1.1"
    ...
  <sodipodi:namedview
     pagecolor="#480000" ... >

好吧,SVG 根元素似乎不是 SVG 建议中 paintable elements 的一部分。

所以我建议使用 "rect" solution provided by Robert Longson 因为我猜它不是一个简单的“hack”。这似乎是使用 SVG 设置背景的标准方式


开头解决了eog的问题
m
muyueh

另一种解决方法可能是使用相同大小的 <div> 来包装 <svg>。之后,您将能够应用 "background-color",而 "background-image" 将影响 svg

<div class="background">
  <svg></svg>
</div>

<style type="text/css">
.background{
  background-color: black; 
  /*background-image: */
}
</style>

这个解决方案是一个 HTML hack。并且仅当您在网页中使用 SVG 时才可能起作用。这不是真正的 SVG 解决方案。
SVG 的背景颜色是从它所在的组件借来的。(有点像 svg 借用页面颜色,默认页面颜色是白色)。不知何故,我不认为这是一个黑客。
@clinux:Charles 想说的是,它非常适合网页渲染,但假设您想使用与带有 .svg 扩展名的图像相同的 svg 在其他地方渲染它,它可能无法正常工作。
J
JoKalliauer

backgroundbackground-color 未得到广泛支持

没有的最短代码是绘制一个半径为 10000 的圆,这也适用于与 viewBox 不同的宽度-高度-纵横比。

<circle r="1e5" fill="red"/>