Цвет фона корневого элемента SVG по умолчанию

134

Я хотел бы установить цвет фона по умолчанию для всего документа SVG, например красный.

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

Приведенное выше решение работает, но свойство background атрибута style, к сожалению, не является стандартным: http://www.w3.org/TR/SVG/styling.html#SVGStylingProperties , и поэтому оно удаляется во время процесса очистки с помощью SVG. Очиститель.

Есть ли другой способ объявить этот цвет фона?

Delapouite
источник
1
Есть ли ошибка в SVG Cleaner? Он также удаляет встроенные блоки стиля, хотя они являются стандартными: w3.org/TR/SVG/styling.html#StylingWithCSS
Volker E.

Ответы:

120

SVG 1.2 Tiny имеет заполнение области просмотра, но я не уверен, насколько широко реализовано это свойство, поскольку в настоящее время большинство браузеров ориентированы на SVG 1.1. Opera реализует это FWIW.

В настоящее время более кроссбраузерным решением было бы прикрепить <rect>элемент с шириной и высотой 100% и fill = "red" в качестве первого дочернего <svg>элемента элемента, например:

<rect width="100%" height="100%" fill="red"/>
Роберт Лонгсон
источник
24
Метод rect hack работает, но он предполагает, что соотношение сторон svg всегда соответствует получаемой области просмотра, поэтому он не будет заполнять всю область просмотра во всех ситуациях.
Erik Dahlström
1
когда соотношение сторон не соответствует области просмотра, использование width="10000%" height="10000%"может исправить это. если нет, то добавьте несколько нулей
Mulllhausen
1
@mulllhausen, к сожалению, добавить значение до 10 000 000% не удалось. какие-либо другие предложения?
Крашалот
Заброшенный viewport-fillзапрос на перенос caniuse: github.com/Fyrd/caniuse/issues/2186 Почему, почему они позволили SVG умереть.
Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
47

Нашел это работает в Safari. SVG окрашивается только в фоновый цвет там, где закрывается ограничивающая рамка элемента. Итак, дайте ему границу (обводку) с нулевой границей пикселей. Он заполняет все для вас вашим цветом фона.

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

cwingrav
источник
5
Это приводит к тому, что все штрихи подэлементов также имеют нулевую ширину, так что это не лучший вариант для "фона".
duanev 07
35

Это ответ @Robert Longson, теперь с кодом (изначально кода не было, он был добавлен позже):

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

В этом ответе используются:

JoKalliauer
источник
20

Позвольте мне сообщить об очень простом решении, которое я нашел, о котором не было написано в предыдущих ответах. Я также хотел установить фон в 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>
Джанлука Казати
источник
Красивое и простое решение!
conceptdeluxe
1
Хотя это работает вообще во всех браузерах, настройка background-colorна <svg>элементе будет сделать IE11 рендеринг цвета фона также за пределами области , определенную с viewBoxатрибутом. Это не имеет значения при использовании widthи heightатрибутов , хотя.
conceptdeluxe
@conceptdeluxe интересное наблюдение, теоретически стиль, закодированный внутри svg, должен применяться только внутри svg. Однако установка ширины и высоты почти всегда необходима.
Джанлука Касати
Есть ли разница между <svg style"...."></svg>и <svg><style>...</style></svg>, если <style>тег находится на верхнем уровне? Если нет, то этот ответ выглядит как исходное решение OP, переупакованное с другим синтаксисом. (Но, может быть, это решение выживает SVG Cleaner, а <svg style="..."></svg>нет?)
Лабрадор
@Labrador Я искал решение, увидел этот вопрос, затем нашел способ его решить и поделился им. Я не знаю, похоже , поддерживаются только атрибуты, указанные в этом w3.org/TR/SVG/styling.html#SVGStylingProperties . С другой стороны, предложенное мной решение работает, и мне оно нравится, потому что вы можете стилизовать другие теги SVG, такие как path, rect и т. Д. Основная особенность для меня заключается в том, что оно работает также и с автономными SVG.
Джанлука Касати
10

Сейчас я работаю над таким файлом:

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

Поэтому я предлагаю использовать «прямое» решение, предложенное Робертом Лонгсоном, потому что я предполагаю, что это не простой «взлом». Кажется, это стандартный способ установить фон с помощью SVG.

Шарль-Эдуар Кост
источник
4
<rect width = "100%" height = "100%" fill = "white" /> в начале решает проблему для eog
nvrandow
2

Другой обходной путь может заключаться в использовании <div>того же размера для упаковки <svg>. После этого вы сможете подать заявку "background-color", и "background-image"это повлияет на svg.

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

<style type="text/css">
.background{
  background-color: black; 
  /*background-image: */
}
</style>
muyueh
источник
12
Это решение - взлом HTML. И может работать, только если вы используете SVG на веб-странице. Это не настоящее решение SVG.
Шарль-Эдуард Кост
Цвет фона SVG заимствован из компонента, в котором он находится (вроде как svg заимствует цвет страницы, а цвет страницы по умолчанию - белый). Почему-то не думаю, что это взлом.
Clinux
@clinux: Чарльз пытался сказать, что он отлично работает для рендеринга веб-страниц, но предположим, что вы хотите использовать тот же svg, что и изображение с расширением .svg, для рендеринга в другом месте, это может не сработать.
Arunkumar Srisailapathi