Подтвердить что ты не робот

Как правильно ссылаться на внешний файл svg в svg?

Привет, я работаю над картой svg/js, которая состоит из многих небольших графических файлов (городских округов). Я помещаю каждую графику в собственный файл, чтобы мой основной файл svg по-прежнему поддерживался и не раздувался.

Как я могу правильно ссылаться на внешний файл svg из другого svg?

Ожидаемый результат: откройте 1.svg в браузере и увидите синий прямоугольник. Как это должно работать: w3c: использовать элемент

Так вот что я пробовал: 1.svg:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet href="style.css" type="text/css"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-       20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"    width="1000" height="1000">
<use xlink:href="another.svg#rectangle"/>
</svg>

another.svg:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-       20010904/DTD/svg10.dtd">
<svg id="rectangle" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"    width="1000" height="1000">
<rect class="blue" x="558.5" y="570" width="5" height="5" />
</svg>

style.css

.blue { fill: blue; }

Результат:

  • Firefox: синий прямоугольник (именно то, что я хотел)
  • Chrome: Ничего
  • Опера: Черный прямоугольник

Примечание. Я попробовал его с элементом изображения, но это не сработало со стилями, т.е. я получил черный прямоугольник, не синий.

Важно:. Если вы хотите ссылаться на другой SVG и, чтобы связанный SVG был частью формальной структуры документа, вы можете использовать AJAX для этого.

https://bugs.webkit.org/show_bug.cgi?id=12499

4b9b3361

Ответ 1

Из определения в спецификации SVG, которое вы связаны с:

Селекторы CSS2 не могут применяться к (концептуально) клонированному дереву DOM потому что его содержимое не является частью формальной структуры документа.

Это означает, что ваш селектор в 1.svg не применяется к клонированному дереву DOM.

Так почему бы просто не ссылаться на таблицу стилей из another.svg? Это должно работать во всех браузерах и с <use> и <image>.

Другим вариантом является стиль элемента <use> в главном документе svg (1.svg), поскольку стиль также каскадируется до клонированного дерева.

Ответ 2

Попробуйте сделать это следующим образом:

Квадрат:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"    width="1000" height="1000">
    <rect x="558.5" y="570" width="5" height="5" id="rectangle" />
</svg>

Используйте его:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet href="style.css" type="text/css"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"    width="1000" height="1000">
    <use xlink:href="another.svg#rectangle" class="blue"/>
</svg>

Ответ 3

Элемент

<svg> не имеет атрибута xlink:href, если вам нужно включить внешнее изображение, используйте элемент <image>.