ChatGPT解决这个技术问题 Extra ChatGPT

Default background color of SVG root element

svg

I'd like to set a default background color for the entire SVG document, to red for example.

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

The solution above works but the background property of the style attribute is unfortunately not a standard one : http://www.w3.org/TR/SVG/styling.html#SVGStylingProperties, and so it gets removed during the cleaning process with SVG Cleaner.

Is there another way to declare this background color?

Is there probably also a bug in SVG Cleaner? It removes inline style blocks as well, although they are standard: w3.org/TR/SVG/styling.html#StylingWithCSS

B
Ben Kane

SVG 1.2 Tiny has viewport-fill I'm not sure how widely implemented this property is though as most browsers are targetting SVG 1.1 at this time. Opera implements it FWIW.

A more cross-browser solution currently would be to stick a <rect> element with width and height of 100% and fill="red" as the first child of the <svg> element, for example:

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

The rect hack sort of works, but it assumes that the aspect ratio of the svg always matches the viewport it gets, so it won't fill the entire viewport in all situations.
when the aspect ratio does not match the viewport then using width="10000%" height="10000%" may fix it. if not then add some zeros
@mulllhausen unfortunately adding a value as high as 10000000% didn't work. any other suggestions?
An abandoned viewport-fill caniuse pull request: github.com/Fyrd/caniuse/issues/2186 Why why why did they let SVG die.
@ErikDahlström Please check the solution at stackoverflow.com/a/69899106/6747994
c
cwingrav

Found this works in Safari. SVG only colors in with background-color where an element's bounding box covers. So, give it a border (stroke) with a zero pixel boundary. It fills in the whole thing for you with your background-color.

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


This causes all sub-element strokes to be zero-width as well, so its not a good "background" option.
J
JoKalliauer

It is the answer of @Robert Longson, now with code (there was originally no code, it was added later):

This answer uses:

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

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


G
Gianluca Casati

Let me report a very simple solution I found, that is not written in previous answers. I also wanted to set background in an SVG, but I also want that this works in a standalone SVG file.

Well, this solution is really simple, in fact SVG supports style tags, so you can do something like

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

Nice and simple solution!
Though this works in general in all browsers, setting the background-color of the <svg> element will make the IE11 render the background color also outside the area defined with the viewBox attribute. This does not matter when using width and height attributes though.
@conceptdeluxe interesting observation, in theory the style coded inside svg should apply only inside svg. However, setting width and height is almost always necessary.
Is there a difference between <svg style"...."></svg> and <svg><style>...</style></svg>, assuming the <style> tag is at the top level? If not, then this answer just seems like the OP's original solution, repackaged under a different syntax. (But maybe this solution survives SVG Cleaner, while <svg style="..."></svg> does not?)
@Labrador I was looking for a solutions, saw this question, then found a way to solve it and shared it. I do not know, it looks like the only the attributes reported in this w3.org/TR/SVG/styling.html#SVGStylingProperties are supported. On the other hand the solution I proposed works and I like it also cause you can style other SVG tags, like path, rect, etc. The main feature for me is that it works also for standalone SVGs.
C
Community

I'm currently working on a file like this:

<?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">
...

And I tried to put this into style.css:

svg {
  background: #bf1f1f;
}

It's working on Chromium and Firefox, but I don't think that it's a good practice. EyeOfGnome image viewer doesn't render it, and Inkscape uses a special namespace to store such a background:

<?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" ... >

Well, it seems that SVG root element is not part of paintable elements in SVG recommandations.

So I'd suggest to use the "rect" solution provided by Robert Longson because I guess that it is not a simple "hack". It seems to be the standard way to set a background with SVG.


at the beginning solves the problem for eog
m
muyueh

Another workaround might be to use <div> of the same size to wrap the <svg>. After that, you will be able to apply "background-color", and "background-image" that will affect thesvg.

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

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

This solution is a HTML hack. And may work only if you are using SVG into a web page. This is not a true SVG solution.
The background color of the SVG is borrowed from the component it is sitting in. (kinda like svg borrows the page colour, and the default page colour is white). Somehow I don't think it is a hack.
@clinux: What Charles was trying to say is, it works perfectly for web page rendering but suppose you want to use the same svg as an image with .svg extension for rendering it elsewhere, it may not work.
J
JoKalliauer

background and background-color are not widely supported

the shortest code without is to draw a circle with a radius of 10000, this does also work for width-height-aspect-ratios different to viewBox.

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