Tengo un documento SVG y me gustaría incluir una imagen svg externa dentro de él, es decir, algo como:
<object data="logo.svgz" width="100" height="100" x="200" y="400"/>
("objeto" es solo un ejemplo; el documento externo será SVG en lugar de xhtml).
¿Algunas ideas? ¿Es esto siquiera posible? ¿O es lo mejor para mí simplemente colocar el logo.svg xml en mi documento SVG externo?
<image>
en SVG (o<img>
, o<embed>
en HTML) para hacer referencia a un archivo SVG no se les da acceso a la DOM subyacente. Como tal, no, no puede aplicar estilo a elementos dentro de un elemento SVG al que se ha hecho referencia con un<image>
.<image xlink:href="data:image/svg+xml;utf8,<svg …>… </svg>" />
. (Si está utilizando JavaScript para establecer elhref
atributo, no necesita escapar de los<
caracteres, etc.)xlink:href
está en desuso , ahora solo debería usarhref
. ¿Podrías actualizar tu respuesta para incluir eso?O puede incrustar el svg secundario en el svg principal de esta manera:
demostración:
http://hitokun-s.github.io/old/demo/path-between-two-svg.html
fuente
Vale la pena mencionar que cuando incrusta SVG en otro SVG con:
luego, el SVG incrustado toma una forma rectangular con dimensiones determinadas.
Es decir, si su SVG incrustado es un círculo o alguna forma que no sea un cuadrado, entonces se convierte en un cuadrado con transparencia. Por lo tanto, los eventos del mouse quedan atrapados en ese cuadrado incrustado y no llegan al SVG principal. Cuidado con eso.
Un mejor enfoque es usar un patrón. Para rellenar una forma, ya sea un círculo, un cuadrado o incluso un camino.
Luego usa el patrón como este:
¡Ahora los eventos de su mouse no se atascan en cuadrados de imagen transparentes!
fuente
Descubrí que el uso de la
<image>
etiqueta daba un renderizado de baja calidad del archivo incrustado. Sin embargo, la siguiente técnica funcionó (para incrustar un archivo SVG dentro de un archivo SVG, no necesariamente para renderizar en una página HTML):Edite el archivo SVG en un editor de texto.
Encuentra el final de los metadatos:
Inserte esta línea después de esa etiqueta de grupo:
En este caso, estamos incluyendo OTHERFILE.svg en el archivo y todo layer1 (la primera capa predeterminada).
Guarde esto y luego abra el archivo en Inkscape.
Esta técnica es útil para tener un fondo o logotipo estándar en cada página. Al colocarlo primero en el archivo, se procesará primero (y por lo tanto en la parte inferior). También puede bloquearlo agregando este atributo:
En otras palabras:
fuente
La nota
xlink:href
ha quedado obsoleta , solo utilícelahref
en su lugar, por ejemploviewBox
,width
y losheight
valores (en esta respuesta) son simplemente para fines ilustrativos, ajuste el diseño en consecuencia ( lea más ).Dado que
<image>
las acciones de especificaciones similares como<img>
, lo que significa que no soporta SVG estilo, como se menciona en la respuesta de Christiaan . Por ejemplo, si tengo la siguiente línea css que establece que el color de la forma svg sea el mismo que el color de la fuente,El estilo anterior no se aplicaría si
<image>
se usa. Para eso, debe usar<use>
, como se muestra en la respuesta de Nick .La nota
id="layer1"
y loshref="OTHERFILE.svg#layer1"
valores en su respuesta son obligatorios .Lo que significa que debe agregar el
id
atributo al archivo svg externo, por lo que debe alojar el archivo svg externo (modificado) usted mismo (su sitio web) o en otro lugar. El archivo svg externo resultante se ve así (observe dónde coloco elid
):El valor de id puede ser cualquier cosa, utilizo "logo" en este ejemplo.
Para incrustar ese svg,
Si usa el svg anterior como en línea en su html, no necesita el atributo xmlns (al menos lo que sé de svgo ).
fuente
Necesitaba incrustar un SVG en mi SVG pero también cambiar su color y aplicar transformaciones.
Solo Firefox admite el atributo "transform" en los elementos svg anidados. Tampoco es posible cambiar el color de <imagen>. Entonces se necesitaba una combinación de ambos.
Lo que terminé haciendo fue lo siguiente
Esto funciona al menos en Firefox, Chrome e Inkscape.
Esto se comporta de la misma manera que el svg secundario en la respuesta del svg principal, con la excepción de que ahora puede aplicar transformaciones en él.
fuente