2009-03-16 37 views
8

Tengo un linearGradient en la sección defs de mi archivo SVG, y lo menciono con fill = "url (#myGradientName)". Eso funciona bien hasta ahora.Incluir archivo SVG en SVG

Creo que debería ser capaz de poner toda mi sección de defs en su propio archivo SVG, y luego solo hacer referencia a eso desde todas mis imágenes SVG. Es decir, algo así como:

styles.svg:

<svg xmlns=...> 
    <defs> 
    <linearGradient id="myGradient" ...> 
    </linearGradient> 
    </defs> 
</svg> 

image.svg:

<svg xmlns=...> 
    <rect width="100" height="100" fill="styles.svg#myGradient"/> 
</svg> 

Pero me parece que no puede conseguir el estilo a aplicar. ¿Tengo una sintaxis incorrecta para los ID externos a este archivo (styles.svg # myGradient)? ¿Debo incluir explícitamente el archivo primero de alguna manera?

He estado vertiendo sobre la especificación de SVG y parece que esto debería ser posible, pero ninguno de los ejemplos realmente muestra que se está haciendo.

Editar: El FOP FAQ sugiere que la sintaxis correcta es fill = "url (grad.svg # PurpleToWhite)", pero eso no funciona en Gecko o Webkit. ¿Es correcto y nadie lo apoya, o estoy haciendo algo más mal?

+0

Relacionados: https://stackoverflow.com/questions/20459685/how-do-i-use-svg-patterns-in-a-cross-browser-consistent-way – leo

Respuesta

4

Parece que esto solo es compatible con Firefox 3.1.

+0

Cualquier información sobre Opera o Webkit/Safari/¿Cromo? – Boldewyn

+0

La pregunta mencionó que no funciona en Webkit. No he probado esto en Opera, pero Gecko parece tener el soporte SVG más funcional en otras áreas, así que me sorprendería si Opera (y nadie más) lo admitiera. – Ken

+1

[Este error de Webkit muestra] (https://bugs.webkit.org/show_bug.cgi?id=12499) que este comportamiento incorrecto aún no se resuelve en las versiones actuales de Chrome/Safari.Muchas quejas sobre el informe de reparación de larga duración, sin embargo, el problema está ** no resuelto ** y el último responsable dejó el proyecto debido a un conflicto de intereses ... Excelente ... –

0

En realidad, las preguntas frecuentes de FOP son correctas, la sintaxis correcta abarca el URI con url(...). Acabo de consultar con mi Firefox, y se encarga de llenar solo con url() circundante. Sería un error en Safari u Opera, si lo manejara de manera diferente.

Casualmente presenté un similar question, pero con un éxito igualmente pequeño.

Saludos,

3

Sí es necesario decir fill="url(styles.svg#myGradient)". Eso funciona en Firefox 4 beta 6 y me imagino que funcionó en Firefox 3.5. Pero Chrome (7.0.517.41 beta) y la versión beta de IE9 (9.0.7930.16406) aún no son compatibles. Parece que ambos buscan #myGradient en el documento actual en lugar de ir a la URL especificada. Bruto.

Éstos son los archivos completos que he utilizado para probar esto:

styles.svg

<svg xmlns="http://www.w3.org/2000/svg"> 
    <defs> 
    <linearGradient id="myGradient"> 
     <stop offset="0" stop-color="red" /> 
     <stop offset="1" stop-color="black" /> 
    </linearGradient> 
    </defs> 
</svg> 

image.svg

<svg xmlns="http://www.w3.org/2000/svg"> 
    <rect width="100" height="100" fill="url(styles.svg#myGradient)"/> 
</svg> 
+0

Podrías hacer eso, pero eso significaría que tu gradiente se especificará en línea con el documento SVG. ¿Qué pasa si quieres gradientes diferentes en repeticiones múltiples del mismo icono de SVG? –

+0

@MichaelGiovanniPumo Eso suena como una pregunta diferente. No sé la respuesta de inmediato. Tal vez ['fill =" currentColor "'] (http://www.w3.org/TR/SVG11/painting.html#SpecifyingPaint) sería útil. Si incluye un ícono de SVG repetidamente usando '' o '', entonces [no heredará las propiedades de CSS de las hojas de estilo de la página] (http://www.w3.org/TR/SVG11/styling.html# Herencia) pero tal vez 'currentColor' todavía funcionaría. –

+0

Una actualización de 2014: Probado OK en Firefox, pero el degradado no se encuentra (se muestra en negro) en Chrome. Tristemente arruina todo el concepto "include a styles.svg". Una alternativa sería incluir esos "defs" del lado del servidor. –

1

Creo que puede tener sólo respondió a su pregunta en este thread here.