Цвет фона корневого элемента 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. Очиститель.

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


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>


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>

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


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>

12
Это решение - взлом HTML. И может работать, только если вы используете SVG на веб-странице. Это не настоящее решение SVG.
Шарль-Эдуард Кост

Цвет фона SVG заимствован из компонента, в котором он находится (вроде как svg заимствует цвет страницы, а цвет страницы по умолчанию - белый). Почему-то не думаю, что это взлом.
Clinux

@clinux: Чарльз пытался сказать, что он отлично работает для рендеринга веб-страниц, но предположим, что вы хотите использовать тот же svg, что и изображение с расширением .svg, для рендеринга в другом месте, это может не сработать.
Arunkumar Srisailapathi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.