Couleur d'arrière-plan par défaut de l'élément racine SVG

134

Je voudrais définir une couleur d'arrière-plan par défaut pour tout le document SVG, au rouge par exemple.

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

La solution ci-dessus fonctionne mais la propriété background de l'attribut style n'est malheureusement pas standard: http://www.w3.org/TR/SVG/styling.html#SVGStylingProperties , et donc elle est supprimée pendant le processus de nettoyage avec SVG Nettoyeur.

Existe-t-il une autre façon de déclarer cette couleur d'arrière-plan?

Delapouite
la source
1
Y a-t-il probablement aussi un bogue dans SVG Cleaner? Il supprime également les blocs de style en ligne, bien qu'ils soient standard: w3.org/TR/SVG/styling.html#StylingWithCSS
Volker E.

Réponses:

120

SVG 1.2 Tiny a viewport-fill Je ne suis pas sûr de l'ampleur de l'implémentation de cette propriété, car la plupart des navigateurs ciblent SVG 1.1 pour le moment. Opera l'implémente FWIW.

Une solution plus multi-navigateur actuellement serait de coller un <rect>élément avec une largeur et une hauteur de 100% et fill = "red" comme premier enfant de l' <svg>élément, par exemple:

<rect width="100%" height="100%" fill="red"/>
Robert Longson
la source
24
Le rect hack fonctionne en quelque sorte, mais il suppose que le rapport hauteur / largeur du svg correspond toujours à la fenêtre qu'il obtient, donc il ne remplira pas toute la fenêtre dans toutes les situations.
Erik Dahlström
1
lorsque le rapport hauteur / largeur ne correspond pas à la fenêtre, l'utilisation width="10000%" height="10000%"peut le corriger. sinon ajoutez quelques zéros
mulllhausen
1
@mulllhausen, malheureusement, ajouter une valeur aussi élevée que 10000000% n'a pas fonctionné. d'autres suggestions?
Crashalot
Une viewport-filldemande d'extraction caniuse abandonnée : github.com/Fyrd/caniuse/issues/2186 Pourquoi pourquoi ont-ils laissé SVG mourir.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
47

J'ai trouvé que cela fonctionne dans Safari. SVG ne colore que la couleur d'arrière-plan là où le cadre de délimitation d'un élément couvre. Alors, donnez-lui une bordure (trait) avec une limite de zéro pixel. Il remplit le tout pour vous avec votre couleur d'arrière-plan.

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

cwingrav
la source
5
Cela fait que tous les traits de sous-élément ont également une largeur nulle, donc ce n'est pas une bonne option "d'arrière-plan".
duanev
35

C'est la réponse de @Robert Longson, maintenant avec du code (il n'y avait pas de code à l'origine, il a été ajouté plus tard):

<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg">
 <rect width="100%" height="100%" fill="red"/>
</svg>

Cette réponse utilise:

JoKalliauer
la source
20

Permettez-moi de rapporter une solution très simple que j'ai trouvée, qui n'est pas écrite dans les réponses précédentes. Je voulais également définir l'arrière-plan dans un SVG, mais je veux aussi que cela fonctionne dans un fichier SVG autonome.

Eh bien, cette solution est vraiment simple, en fait SVG prend en charge les balises de style, vous pouvez donc faire quelque chose comme

<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50">
  <style>svg { background-color: red; }</style>
  <text>hello</text>
</svg>
Gianluca Casati
la source
Solution sympa et simple!
conceptdeluxe
1
Bien que cela fonctionne en général dans tous les navigateurs, le réglage background-colorde l' <svg>élément fera que IE11 rendra la couleur d'arrière-plan également en dehors de la zone définie avec l' viewBoxattribut. Cela n'a pas d'importance lors de l'utilisation widthet des heightattributs.
conceptdeluxe
@conceptdeluxe observation intéressante, en théorie le style codé à l'intérieur de svg ne devrait s'appliquer qu'à l'intérieur de svg. Cependant, le réglage de la largeur et de la hauteur est presque toujours nécessaire.
Gianluca Casati
Y a-t-il une différence entre <svg style"...."></svg>et <svg><style>...</style></svg>, en supposant que la <style>balise se trouve au niveau supérieur? Sinon, alors cette réponse semble être la solution originale de l'OP, reconditionnée sous une syntaxe différente. (Mais peut-être que cette solution survit à SVG Cleaner, alors <svg style="..."></svg>que non?)
Labrador
@Labrador Je cherchais une solution, j'ai vu cette question, puis j'ai trouvé un moyen de la résoudre et je l'ai partagée. Je ne sais pas, il semble que les seuls attributs rapportés dans ce w3.org/TR/SVG/styling.html#SVGStylingProperties sont pris en charge. D'un autre côté, la solution que j'ai proposée fonctionne et je l'aime aussi parce que vous pouvez styliser d'autres balises SVG, comme path, rect, etc. La caractéristique principale pour moi est qu'elle fonctionne aussi pour les SVG autonomes.
Gianluca Casati
10

Je travaille actuellement sur un fichier comme celui-ci:

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

Et j'ai essayé de mettre ceci dans style.css:

svg {
  background: #bf1f1f;
}

Cela fonctionne sur Chromium et Firefox, mais je ne pense pas que ce soit une bonne pratique . La visionneuse d'images EyeOfGnome ne le rend pas et Inkscape utilise un espace de noms spécial pour stocker un tel arrière-plan:

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

Eh bien, il semble que l'élément racine SVG ne fasse pas partie des éléments pouvant être peints dans les recommandations SVG.

Je suggère donc d'utiliser la solution "rect" fournie par Robert Longson car je suppose que ce n'est pas un simple "hack". Cela semble être la manière standard de définir un arrière-plan avec SVG.

Charles-Édouard Coste
la source
4
<rect width = "100%" height = "100%" fill = "white" /> au début résout le problème pour eog
nvrandow
2

Une autre solution de contournement peut être d'utiliser <div>la même taille pour envelopper le fichier <svg>. Après cela, vous pourrez postuler "background-color", et "background-image"cela affectera le svg.

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

<style type="text/css">
.background{
  background-color: black; 
  /*background-image: */
}
</style>
muyueh
la source
12
Cette solution est un hack HTML. Et peut fonctionner uniquement si vous utilisez SVG dans une page Web. Ce n'est pas une vraie solution SVG.
Charles-Édouard Coste
La couleur d'arrière-plan du SVG est empruntée au composant dans lequel il se trouve (un peu comme svg emprunte la couleur de la page, et la couleur par défaut de la page est le blanc). D'une manière ou d'une autre, je ne pense pas que ce soit un hack.
clinux
@clinux: Ce que Charles essayait de dire, c'est que cela fonctionne parfaitement pour le rendu de page Web, mais supposons que vous vouliez utiliser le même svg qu'une image avec l'extension .svg pour le rendre ailleurs, cela peut ne pas fonctionner.
Arunkumar Srisailapathi