Вставить SVG в SVG? - PullRequest
       13

Вставить SVG в SVG?

72 голосов
/ 27 марта 2011

У меня есть документ SVG, и я хотел бы включить в него внешнее изображение SVG, то есть что-то вроде:

<object data="logo.svgz" width="100" height="100" x="200" y="400"/>

(«объект» - только пример - внешний документ будет SVG, а не xhtml).

Есть идеи? Это вообще возможно? Или мне лучше всего просто вставить logo.svg xml в мой внешний SVG-документ?

Ответы [ 6 ]

107 голосов
/ 27 марта 2011

Используйте элемент image и укажите ваш файл SVG.Для развлечения сохраните следующее как recursion.svg:

<svg width="100%" height="100%" viewBox="-100 -100 200 200" version="1.1"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <circle cx="-50" cy="-50" r="30" style="fill:red" />
  <image x="10" y="20" width="80" height="80" xlink:href="recursion.svg" />
</svg>
76 голосов
/ 18 декабря 2014

Или вы можете встроить дочерний svg в родительский svg следующим образом:

<svg>
    <g>
        <svg>
            ...
        </svg>
    </g>
</svg>

демо
http://hitokun -s.github.io / демо / путь-между-два-svg.html

28 голосов
/ 10 августа 2014

Стоит отметить, что когда вы встраиваете SVG в другой SVG с:

<image x="10" y="20" width="80" height="80" xlink:href="image.svg" />

, тогда встроенный SVG принимает прямоугольную форму с заданными размерами.

То есть, если встроенный SVG представляет собой круг или какую-либо форму, отличную от квадрата, он становится квадратом с прозрачностью. Поэтому события мыши попадают в этот встроенный квадрат и не достигают родительского SVG. Остерегайтесь этого.

Лучше всего использовать шаблон. Чтобы заполнить форму, или круг, квадрат или даже путь.

<defs>
 <pattern id="pat" x="0" y="0" width="500" height="500" patternUnits="userSpaceOnUse">
   <image x="0" y="0" width="500" height="500" xlink:href="images/mysvg.svg"></image>
 </pattern>
</defs>

Затем используйте шаблон так:

<circle cx="0" cy="0" r="250" fill="url(#pat)"></circle>

Теперь ваши события мыши не застревают в прозрачных квадратах изображения!

3 голосов
/ 15 мая 2018

Я обнаружил, что использование тега <image> дает низкокачественный рендер встроенного файла. Однако сработал следующий метод (для встраивания файла SVG в файл SVG - не обязательно для рендеринга на странице HTML):

  • Редактировать файл SVG в текстовом редакторе.

  • Найдите конец метаданных:

    </metadata>
      <g
       id="layer1"
       inkscape:groupmode="layer"
       inkscape:label="Layer 1">
    
  • Вставьте эту строку после тега группы:

    <use xlink:href="OTHERFILE.svg#layer1" y="0" x="0" />
    
  • В этом случае мы включаем OTHERFILE.svg в файл и все layer1 (первый слой и слой по умолчанию).

  • Сохраните и откройте файл в Inkscape.

Этот метод полезен для стандартного фона или логотипа на каждой странице. Поместив его первым в файл, он будет отображен первым (и, следовательно, снизу). Вы также можете заблокировать его, добавив этот атрибут:

sodipodi:insensitive="true" 

Другими словами:

<use xlink:href="OTHERFILE.svg#layer1" sodipodi:insensitive="true" y="0" x="0" />
1 голос
/ 06 января 2017

Мне нужно было встроить SVG в мой SVG, но также изменить его цвет и применить преобразования.

Только Firefox поддерживает атрибут transform для вложенных элементов SVG.Изменение цвета также невозможно.Таким образом, комбинация обоих была необходима.

Я закончил тем, что сделал следующее:

<svg>
  <image x="0" y="0" xlink:href="data:image/svg+xml;base64,[base64 of nested svg]"></image>
</svg>

Это работает как минимум на Firefox, Chrome и Inkscape.

Это ведет себятак же, как дочерний svg в родительском svg-ответе, за исключением того, что теперь вы можете применить к нему преобразования.

0 голосов
/ 08 июня 2019

Примечание xlink:href было устарело , просто используйте href, например,

<svg viewBox="0 0 512 512">
  <image width="512" height="512" href="external.svg"/>
</svg>

viewBox, width и height значения (в этом ответе) просто для наглядности, соответственно измените компоновку ( читать дальше ).

Поскольку <image> имеет аналогичные спецификации как <img>, то есть это не так• Поддержка стилей SVG, как указано в ответе Кристиана .Например, если у меня есть следующая строка css, в которой цвет фигуры svg совпадает с цветом шрифта,

svg {
  fill: currentColor;
}

Приведенный выше стиль не будет применяться, если используется <image>.Для этого вам нужно использовать <use>, как показано в ответ Ника .

Примечание * Значения id="layer1" и href="OTHERFILE.svg#layer1" в его ответе обязательны .

Это означает, что вы должны добавить атрибут id во внешний файл svg, поэтому вам нужно разместить (измененный) внешний файл svg самостоятельно (на своем веб-сайте) или где-то еще.Полученный внешний svg-файл выглядит следующим образом (обратите внимание, где я поставил id):

<svg id="logo" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
  <path d="..."/>
</svg>

Значение id может быть любым, в этом примере я использую «логотип».

Чтобы встроить этот svg,

<svg viewBox="0 0 512 512">
  <use href="edited-external.svg#logo"/>
</svg>

Если вы используете вышеупомянутый svg в качестве встроенного в html, вам не нужен атрибут xmlns (по крайней мере, то, что я знаю из svgo ).

...