Tenho um documento SVG e gostaria de incluir uma imagem SVG externa nele, ou seja, algo como:
<object data="logo.svgz" width="100" height="100" x="200" y="400"/>
("objeto" é apenas um exemplo - o documento externo será SVG em vez de xhtml).
Alguma ideia? Isso é mesmo possível? Ou é melhor simplesmente inserir o xml logo.svg em meu documento SVG externo?
<image>
em SVG (ou<img>
ou<embed>
em HTML) para fazer referência a um arquivo SVG, você não tem acesso ao DOM subjacente. Portanto, não, você não pode definir o estilo de elementos dentro de um elemento SVG que foi referenciado por um<image>
.<image xlink:href="data:image/svg+xml;utf8,<svg …>… </svg>" />
. (Se estiver usando JavaScript para definir ohref
atributo, não é necessário escapar os<
caracteres etc.)xlink:href
está obsoleto , agora você deve apenas usarhref
. Você poderia atualizar sua resposta para incluir isso?Ou você pode incorporar o svg filho no svg pai assim:
demonstração:
http://hitokun-s.github.io/old/demo/path-between-two-svg.html
fonte
É importante mencionar que quando você incorpora SVGs em outro SVG com:
então, o SVG incorporado assume uma forma retangular com as dimensões fornecidas.
Ou seja, se o seu SVG incorporado for um círculo ou outra forma que não seja um quadrado, ele se tornará um quadrado com transparência. Portanto, os eventos do mouse ficam presos nesse quadrado incorporado e não alcançam o SVG pai. Cuidado com isso.
Uma abordagem melhor é usar um padrão. Para preencher uma forma, seja um círculo, um quadrado ou mesmo um caminho.
Em seguida, use o padrão como este:
Agora os eventos do mouse não ficam presos em quadrados de imagem transparentes!
fonte
Descobri que o uso da
<image>
tag gerou uma renderização de baixa qualidade do arquivo incorporado. No entanto, a seguinte técnica funcionou (para incorporar um arquivo SVG dentro de um arquivo SVG - não necessariamente para renderização em uma página HTML):Edite o arquivo SVG em um editor de texto.
Encontre o final dos metadados:
Insira esta linha após a tag de grupo:
Neste caso, estamos incluindo OTHERFILE.svg no arquivo e toda a camada 1 (a primeira camada padrão).
Salve e abra o arquivo no Inkscape.
Essa técnica é útil para ter um plano de fundo ou logotipo padrão em cada página. Colocando-o primeiro no arquivo, ele será renderizado primeiro (e, portanto, na parte inferior). Você também pode bloqueá-lo adicionando este atributo:
Em outras palavras:
fonte
Eu precisava incorporar um SVG em meu SVG, mas também mudar sua cor e aplicar transformações.
Apenas o Firefox suporta o atributo "transform" nos elementos svg aninhados. Alterar a cor de <imagem> também não é possível. Portanto, uma combinação de ambos era necessária.
O que acabei fazendo foi o seguinte
Isso funciona pelo menos no Firefox, Chrome e Inkscape.
Este se comporta da mesma forma que o svg filho na resposta svg pai, com a exceção de que agora você pode aplicar transformações nele.
fonte
Nota
xlink:href
foi descontinuada , basta usar em seuhref
lugar, por exemploviewBox
,width
e osheight
valores (nesta resposta) são apenas para fins ilustrativos, ajuste o layout de acordo ( leia mais ).Desde
<image>
ações especificação semelhante como<img>
, o que significa que não suporta SVG styling, conforme mencionado na resposta de Christiaan . Por exemplo, se eu tiver a seguinte linha css que define a cor da forma svg para ser igual à cor da fonte,O estilo acima não se aplicaria se
<image>
fosse usado. Para isso, você precisa usar<use>
, conforme mostrado na resposta de Nick .Nota
id="layer1"
ehref="OTHERFILE.svg#layer1"
valores em sua resposta são obrigatórios .Significa que você tem que adicionar o
id
atributo ao arquivo svg externo, então você precisa hospedar o arquivo svg externo (modificado) por você (seu site) ou em outro lugar. O arquivo svg externo resultante tem a seguinte aparência (observe onde coloquei oid
):O valor de id pode ser qualquer coisa, eu uso "logo" neste exemplo.
Para incorporar esse svg,
Se você usar o svg acima como embutido em seu html, você não precisa do atributo xmlns (pelo menos o que eu sei do svgo ).
fonte