Tengo varios gráficos SVG cuyos colores me gustaría modificar a través de mis hojas de estilo externas, no directamente dentro de cada archivo SVG. No estoy colocando los gráficos en línea, sino almacenándolos en mi carpeta de imágenes y señalándolos.
Los he implementado de esta manera para permitir que la información sobre herramientas funcione, y también los he incluido en una <a>
etiqueta para permitir un enlace.
<a href='http://youtube.com/...' target='_blank'><img class='socIcon' src='images/socYouTube.svg' title='View my videos on YouTube' alt='YouTube' /></a>
Y aquí está el código del gráfico SVG:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="stylesheets/main.css" type="text/css"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 56.69 56.69">
<g>
<path d="M28.44......./>
</g>
</svg>
Puse lo siguiente en mi archivo CSS externo (main.css):
.socIcon g {fill:red;}
Sin embargo, no tiene ningún efecto sobre el gráfico. También probé .socIcon g path {} y .socIcon path {}.
Algo no está bien, tal vez mi implementación no permite modificaciones externas de CSS o me perdí un paso. ¡Realmente agradecería su ayuda! Solo necesito la capacidad de modificar los colores del gráfico SVG a través de mi hoja de estilo externa, pero no puedo perder la información sobre herramientas y la capacidad de enlace. (Aunque puede que pueda vivir sin la información sobre herramientas). ¡Gracias!
svg { fill:red; }
o dale a tu ruta un nombre de clase. Por ejemplo,<path class="socIcon" d="M28.44 ..... />
esto debería funcionar.Respuestas:
Su archivo main.css solo tendría efecto en el contenido del SVG si el archivo SVG está incluido en línea en el HTML:
https://developer.mozilla.org/en/docs/SVG_In_HTML_Introduction
Si desea mantener su SVG en archivos, el CSS debe definirse dentro del archivo SVG.
Puedes hacerlo con una etiqueta de estilo:
http://www.w3.org/TR/SVG/styling.html#StyleElementExample
Puede usar una herramienta en el lado del servidor para actualizar la etiqueta de estilo según el estilo activo. En rubí podrías lograr esto con Nokogiri. SVG es solo XML. Así que probablemente haya muchas bibliotecas XML disponibles que probablemente puedan lograr esto.
Si no puede hacer eso, tendrá que usarlos como si fueran PNG; creando un conjunto para cada estilo y guardando sus estilos en línea.
fuente
Puede hacer lo que quiera, con una advertencia (importante): las rutas dentro de su símbolo no se pueden diseñar de forma independiente a través de CSS externo; solo puede establecer las propiedades para todo el símbolo con este método. Entonces, si tiene dos rutas en su símbolo y desea que tengan colores de relleno diferentes, esto no funcionará, pero si desea que todas sus rutas sean iguales, esto debería funcionar.
En su archivo html, quiere algo como esto:
Y en el archivo SVG externo quieres algo como esto:
Cambiar la clase en el
svg
etiqueta (en tu html) defill-red
tofill-blue
y ta-da ... tienes azul en lugar de rojo.Puede sortear parcialmente la limitación de poder apuntar a las rutas por separado con CSS externo mezclando y haciendo coincidir el CSS externo con algo de CSS en línea en rutas específicas, ya que el CSS en línea tendrá prioridad. Este enfoque funcionaría si está haciendo algo como un icono blanco sobre un fondo de color, donde desea cambiar el color del fondo a través del CSS externo, pero el icono en sí es siempre blanco (o viceversa). Entonces, con el mismo HTML que antes y algo como este código svg, obtendrá un fondo rojo y una ruta de primer plano blanca:
fuente
symbol
elemento, es decir, puede simplemente dar unid
al elemento svg, entonces: `<svg id = example" xmlns = " w3.org/2000/svg " viewBox = "0 0256256 "> <path class =" background "d =" M120 ... "/> <path class =" icon "style =" fill: white; "d =" M20 ... "/> </ svg > `Puede incluir en sus archivos SVG un enlace a un archivo css externo usando:
Debe poner esto después de abrir la etiqueta:
No es la solución perfecta, porque tiene que modificar los archivos svg, pero los modifica una vez y todos los cambios de estilo se pueden realizar en un archivo css para todos los archivos svg.
fuente
Es posible diseñar un SVG creando dinámicamente un elemento de estilo en JavaScript y agregándolo al elemento SVG. Hacky, pero funciona.
Puede generar el JavaScript dinámicamente en PHP si lo desea; el hecho de que esto sea posible en JavaScript abre una miríada de posibilidades.
fuente
Un enfoque que puede tomar es usar filtros CSS para cambiar la apariencia de los gráficos SVG en el navegador.
Por ejemplo, si tiene un gráfico SVG que usa un color de relleno rojo dentro del código SVG, puede convertirlo en violeta con una configuración de rotación de tono de 180 grados:
Experimente con otros ajustes de rotación de tonos para encontrar los colores que desee.
Para ser claros, el CSS anterior va en el CSS que se aplica a su documento HTML. Está aplicando estilo a la etiqueta img en el código HTML, no aplicando estilo al código del SVG.
Y tenga en cuenta que esto no funcionará con gráficos que tengan un relleno de negro, blanco o gris. Tienes que tener un color real allí para rotar el tono de ese color.
fuente
Una solución muy rápida para tener un estilo dinámico con una hoja de estilo CSS externa, en caso de que esté usando la
<object>
etiqueta para incrustar su svg.Este ejemplo agregará una clase a la
<svg>
etiqueta raíz al hacer clic en un elemento principal.file.svg:
html:
Jquery:
al hacer clic en el elemento principal:
entonces puedes administrar tu css
svg.css:
fuente
Debería ser posible hacerlo insertando primero las imágenes svg externas. El siguiente código proviene de reemplazar todas las imágenes SVG con SVG en línea de Jess Frazelle.
fuente
Cuando se usa en una
<image>
etiqueta, SVG debe estar contenido en un solo archivo por razones de privacidad. Este error de bugzilla tiene más detalles sobre exactamente por qué es así. Lamentablemente, no puede usar una etiqueta diferente, como un,<iframe>
porque no funcionará como un enlace, por lo que tendrá que incrustar el CSS en un<style>
etiqueta dentro del archivo.Otra forma de hacer esto sería tener los datos SVG dentro del archivo html principal, es decir
Puede diseñar eso con un archivo CSS externo usando la
<link>
etiqueta HTML .fuente
Le sugiero que use PHP para esto. Realmente no hay mejor manera de hacer esto sin fuentes de iconos, y si se resiste a usarlas, puede intentar esto:
Y luego podría usar este archivo
filename.php?color=#ffffff
para obtener el archivo svg en el color deseado.fuente
if (!preg_match('/^[#][0-9a-f]{6}$/i', $_GET['color'])) die('Oops!');
(colóquelo en algún lugar del bloque PHP de inicio).Lo que me funciona: etiqueta de estilo con regla @import
fuente
Sé que es una publicación antigua, pero solo para solucionar este problema ... estás usando tus clases en el lugar equivocado: D
Primero que nada podrías usar
en tus
main.css
para ponerlo rojo. Esto tiene efecto. También podría usar selectores de nodos para obtener parches específicos.En segundo lugar, declaró la clase a la
img
etiqueta -Tag.En realidad, debería declararlo dentro de su SVG. si tiene diferentes patrones, podría definir más, por supuesto.
ahora puedes cambiar el color a tu
main.css
gustofuente
<?xml-stylesheet href="stylesheets/main.css" type="text/css"?>
<?xml-stylesheet ... ?>
declaración dentro de tu SVG. Supongo que funcionaría. Es similar a otras respuestas que recomiendan un<link rel="stylesheet" ... >
SVG interno. También tiene los mismos problemas (necesita actualizar cada SVG para que apunte a la hoja de estilo, y cualquier cambio en el nombre o ubicación de la hoja de estilo significa tener que cambiar todos los SVG nuevamente).Nota: los estilos externos no funcionarán si incluye una
<img>
etiqueta interior SVG . Funcionará perfectamente dentro de la<div>
etiqueta.fuente
@leo aquí está la versión angularJS, gracias de nuevo
fuente
Este método funcionará si el svg se ve dentro de un navegador web, pero tan pronto como este código se carga en el servidor y la clase para el icono de svg se codifica como si fuera una imagen de fondo, el color se pierde y vuelve al color predeterminado. . Parece que el color no se puede cambiar desde la hoja de estilo externa aunque tanto la clase svg para el color como la clase de la capa superior para la visualización y posición del svg están asignadas al mismo directorio.
fuente