Este es un Q&A propio de un útil código que se me ocurrió.
Actualmente, no hay una manera fácil de incrustar una imagen SVG y luego tener acceso a los elementos SVG a través de CSS. Existen varios métodos para usar los marcos JS SVG, pero son demasiado complicados si todo lo que está haciendo es crear un icono simple con un estado de sustitución.
Entonces, esto es lo que se me ocurrió, que creo que es, con mucho, la forma más fácil de usar archivos SVG en un sitio web. Toma su concepto de los primeros métodos de reemplazo de texto a imagen, pero que yo sepa, nunca se ha hecho para SVG.
Esta es la pregunta:
Respuestas:
En primer lugar, use una etiqueta IMG en su HTML para incrustar un gráfico SVG. Usé Adobe Illustrator para hacer el gráfico.
Así es como incrustar una imagen normal. Tenga en cuenta que debe configurar el IMG para que tenga una clase de svg. La clase 'social-link' es solo por ejemplo. La identificación no es obligatoria, pero es útil.
Luego use este código jQuery (en un archivo separado o en línea en el HEAD).
Lo que hace el código anterior es buscar todos los IMG con la clase 'svg' y reemplazarlo con el SVG en línea del archivo vinculado. La gran ventaja es que le permite usar CSS para cambiar el color del SVG ahora, así:
El código jQuery que escribí también tiene puertos a través de las imágenes y el ID de las imágenes originales. Entonces este CSS también funciona:
O:
Puede ver un ejemplo de esto trabajando aquí: http://labs.funkhausdesign.com/examples/img-svg/img-to-svg.html
Tenemos una versión más complicada que incluye el almacenamiento en caché aquí: https://github.com/funkhaus/style-guide/blob/master/template/js/site.js#L32-L90
fuente
});
vuelva a colocar el de $ .get con}, 'xml');
img[src$=".svg"]
y eliminar la necesidad de lasvg
clase.$('#ico_company path').removeAttr('fill')
. Entonces podría hacerlo#ico_company { fill: #ccc }
en su archivo CSSEstilo
Guión
fuente
width="170.667"
en mi casopath
formas (comorect
), también necesitará manejarlos en CSSAhora puede usar la propiedad CSS
filter
en la mayoría de los navegadores modernos (incluido Edge, pero no IE11). Funciona en imágenes SVG, así como en otros elementos. Puede usarhue-rotate
oinvert
modificar colores, aunque no le permiten modificar diferentes colores de forma independiente. Utilizo la siguiente clase CSS para mostrar una versión "deshabilitada" de un icono (donde el original es una imagen SVG con color saturado):Esto lo hace gris claro en la mayoría de los navegadores. En IE (y probablemente Opera Mini, que no he probado), la propiedad de opacidad se desvanece notablemente, que todavía se ve bastante bien, aunque no es gris.
Aquí hay un ejemplo con cuatro clases CSS diferentes para el ícono de la campana Twemoji : original (amarillo), la clase "deshabilitada" anterior,
hue-rotate
(verde) yinvert
(azul).Mostrar fragmento de código
fuente
if ($('.w3-top img').css("color") == "rgb(0, 0, 0)") { $('.w3-top img').css("filter", "invert(100%)"); $('.w3-top img').css("-webkit-filter", "invert(100%)"); };
Alternativamente, podría usar CSS
mask
, el soporte del navegador no es bueno, pero podría usar un respaldofuente
-webkit-mask
no debe usarse en ningún sitio web de producción.Si puede incluir archivos (PHP incluye o incluye a través de su CMS de elección) en su página, puede agregar el código SVG e incluirlo en su página. Esto funciona igual que pegar la fuente SVG en la página, pero hace que el marcado de la página sea más limpio.
El beneficio es que puede apuntar a partes de su SVG a través de CSS para pasar el mouse por encima, no se requiere JavaScript.
http://codepen.io/chriscoyier/pen/evcBu
Solo tiene que usar una regla CSS como esta:
Tenga en cuenta que el
!important
bit es necesario para anular el color de relleno.fuente
<div ng-include="'svg.svg'"></div>
#pathidorclass:hover, .wrapperclass:hover #pathidorclass { fill: green; }
O incluso simplemente elimine el elemento emergente original de la ruta SVG ya que de todos modos ahora lo está apuntando a través del elemento contenedor.@Drew Baker dio una gran solución para resolver el problema. El código funciona correctamente. Sin embargo, aquellos que usan AngularJs pueden encontrar mucha dependencia en jQuery. En consecuencia, pensé que es una buena idea pegar para los usuarios de AngularJS, un código que sigue la solución de @Drew Baker.
AngularJs forma del mismo código
1. Html : use la etiqueta de abajo en su archivo html:
2. Directiva : esta será la directiva que necesitará para reconocer la etiqueta:
3. CSS :
4. Prueba de unidad con karma-jazmín :
fuente
<div ng-include="/icons/my.svg" class="any-class-you-wish"></div>
ng-include
entonces simplemente cambia esta líneavar imgURL = element.attr('src');
avar imgURL = element.attr('ng-include');
if (typeof(imgClass) !== 'undefined') { $svg.setAttribute("class", imgClass); }
lugar de dividir y para bucle.angular.element(data)[0];
) y hacer que funcione con el uso de IEif ($svg.getAttribute('class')) { $svg.setAttribute('class', $svg.getAttribute('class') + ' ' + imgClass); } else { $svg.setAttribute('class', imgClass); }
. También es posible que desee agregarcache: true
a las opciones de lo$http.get
contrario, su página podría volverse muy lenta.Me doy cuenta de que desea lograr esto con CSS, pero solo un recordatorio en caso de que sea una imagen pequeña y simple: siempre puede abrirlo en Notepad ++ y cambiar la ruta / relleno de Whaleverelement:
Podría salvar un montón de guiones feos. Lo siento si está fuera de la base, pero a veces las soluciones simples pueden pasarse por alto.
... incluso el intercambio de múltiples imágenes svg puede ser más pequeño que algunos de los fragmentos de código para esta pregunta.
fuente
Escribí una directiva para resolver este problema con AngularJS. Está disponible aquí: ngReusableSvg .
Reemplaza el elemento SVG después de que se ha renderizado y lo coloca dentro de un
div
elemento, haciendo que su CSS sea fácilmente cambiable. Esto ayuda a usar el mismo archivo SVG en diferentes lugares usando diferentes tamaños / colores.El uso es simple:
Después de eso, puede tener fácilmente:
fuente
TL / DR: IR aquí-> https://codepen.io/sosuke/pen/Pjoqqp
Explicación:
Supongo que tienes html algo como esto:
Definitivamente ir a la ruta del filtro, es decir. su svg probablemente sea blanco o negro. Puede aplicar un filtro para que sea del color que desee, por ejemplo, tengo un svg negro que quiero verde menta. Primero lo invierto para que sea blanco (que es técnicamente todos los colores RGB en su totalidad), luego juego con la saturación de tono, etc. Para hacerlo bien:
Aún mejor es que podría usar una herramienta para convertir el hexadecimal que desea en un filtro para usted: https://codepen.io/sosuke/pen/Pjoqqp
fuente
Aquí hay una versión
knockout.js
basada en la respuesta aceptada:Importante: En realidad, también requiere jQuery para el reemplazo, pero pensé que puede ser útil para algunos.
Luego solo aplica
data-bind="svgConvert: true"
a tu etiqueta img.Esta solución reemplaza completamente la
img
etiqueta con un SVG y no se respetarán los enlaces adicionales.fuente
get
lo solicitaría nuevamente. Pensé en cambiarlosrc
a undata-src
atributo en laimg
etiqueta, pero concluí que los navegadores modernos probablemente sean lo suficientemente inteligentes como para almacenar en caché el archivo de todos modosAquí hay un código sin marco, solo js puro:
fuente
Hay una biblioteca de código abierto llamada SVGInject que usa el
onload
atributo para activar la inyección. Puede encontrar el proyecto GitHub en https://github.com/iconfu/svg-injectAquí hay un ejemplo mínimo con SVGInject:
Después de cargar la imagen
onload="SVGInject(this)
, activará la inyección y el<img>
elemento será reemplazado por el contenido del archivo SVG provisto en elsrc
atributo.Resuelve varios problemas con la inyección de SVG:
Los SVG pueden ocultarse hasta que finalice la inyección. Esto es importante si un estilo ya se aplica durante el tiempo de carga, lo que de otro modo causaría un breve "destello de contenido sin estilo".
Los
<img>
elementos se inyectan automáticamente. Si agrega SVG dinámicamente, no tiene que preocuparse por volver a llamar a la función de inyección.Se agrega una cadena aleatoria a cada ID en el SVG para evitar tener el mismo ID varias veces en el documento si se inyecta un SVG más de una vez.
SVGInject es Javascript simple y funciona con todos los navegadores que admiten SVG.
Descargo de responsabilidad: soy coautor de SVGInject
fuente
Si tenemos un mayor número de tales imágenes svg, también podemos tomar la ayuda de archivos de fuentes.
Sitios como https://glyphter.com/ pueden obtenernos un archivo de fuente de nuestros svgs.
P.ej
fuente
Puedes usar data-image para eso. usando data-image (data-URI) puede acceder a SVG como en línea.
Aquí está el efecto de rollover usando CSS puro y SVG.
Lo sé desordenado, pero puedes hacerlo de esta manera.
Puede convertir su svg a url de datos aquí
fuente
Dado que SVG es básicamente código, solo necesita contenido. Usé PHP para obtener contenido, pero puedes usar lo que quieras.
Luego, imprimí el contenido "tal cual" dentro de un contenedor div
Para finalmente establecer la regla en los hijos SVG del contenedor en CSS
Obtuve estos resultados con un icono de material SVG:
fuente
La solución seleccionada está bien si desea que jQuery procese todos los elementos svg en su DOM y su DOM tenga un tamaño razonable. Pero si su DOM es grande y decide cargar partes de su DOM dinámicamente, realmente no tiene sentido tener que volver a escanear todo el DOM solo para actualizar los elementos svg. En su lugar, use un complemento jQuery para hacer esto:
En su html, especifique un elemento svg de la siguiente manera:
Y aplique el complemento:
fuente
para: animaciones de eventos flotantes podemos dejar los estilos dentro del archivo svg, como un
mira esto en svgshare
fuente