Esta é uma sessão de perguntas e respostas de um pedaço de código útil que eu criei.
Atualmente, não há uma maneira fácil de incorporar uma imagem SVG e, em seguida, ter acesso aos elementos SVG via CSS. Existem vários métodos de uso de estruturas JS SVG, mas eles são muito complicados se tudo o que você está fazendo é criar um ícone simples com um estado de rolagem.
Então, aqui está o que eu criei, que eu acho que é de longe a maneira mais fácil de usar arquivos SVG em um site. Ele leva o conceito dos métodos de substituição de texto para imagem, mas até onde sei, nunca foi feito para SVGs.
Esta é a questão:
Respostas:
Primeiro, use uma tag IMG no seu HTML para incorporar um gráfico SVG. Eu usei o Adobe Illustrator para fazer o gráfico.
É assim que você incorporaria uma imagem normal. Note que você precisa configurar o IMG para ter uma classe de svg. A classe 'social-link' é apenas um exemplo. O ID não é obrigatório, mas é útil.
Em seguida, use esse código jQuery (em um arquivo separado ou embutido no HEAD).
O que o código acima faz é procurar todos os IMGs com a classe 'svg' e substituí-lo pelo SVG embutido do arquivo vinculado. A grande vantagem é que ele permite que você use CSS para alterar a cor do SVG agora, da seguinte forma:
O código do jQuery que escrevi também transporta o ID e as classes das imagens originais. Portanto, este CSS também funciona:
Ou:
Você pode ver um exemplo disso trabalhando aqui: http://labs.funkhausdesign.com/examples/img-svg/img-to-svg.html
Temos uma versão mais complicada que inclui armazenamento em cache aqui: https://github.com/funkhaus/style-guide/blob/master/template/js/site.js#L32-L90
fonte
});
de US $ .get com}, 'xml');
img[src$=".svg"]
e eliminar a necessidade dasvg
classe.$('#ico_company path').removeAttr('fill')
. Então você poderia fazer#ico_company { fill: #ccc }
em seu arquivo CSSEstilo
Roteiro
fonte
width="170.667"
no meu casopath
formas (comorect
), você também precisará manipulá-los em cssAgora você pode usar o
filter
propriedade CSS nos navegadores mais modernos (incluindo o Edge, mas não o IE11). Funciona em imagens SVG e em outros elementos. Você pode usarhue-rotate
ouinvert
modificar cores, embora elas não permitam modificar cores diferentes independentemente. Eu uso a seguinte classe CSS para mostrar uma versão "desativada" de um ícone (onde o original é uma imagem SVG com cores saturadas):Isso torna o cinza claro na maioria dos navegadores. No IE (e provavelmente no Opera Mini, que eu não testei), é visivelmente desbotado pela propriedade opacity, que ainda parece muito boa, embora não seja cinza.
Aqui está um exemplo com quatro classes CSS diferentes para o Twemoji ícone de campainha : original (amarelo), a classe "desativada" acima,
hue-rotate
(verde) einvert
(azul).Mostrar snippet de código
fonte
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%)"); };
Como alternativa, você pode usar CSS
mask
, o suporte concedido ao navegador não é bom, mas você pode usar um fallbackfonte
-webkit-mask
não deve ser usado em nenhum site de produção.Se você pode incluir arquivos (o PHP inclui ou inclui pelo CMS de sua escolha) em sua página, você pode adicionar o código SVG e incluí-lo em sua página. Isso funciona da mesma maneira que colar a fonte SVG na página, mas torna a marcação da página mais limpa.
O benefício é que você pode segmentar partes do seu SVG via CSS para passar o mouse - não é necessário javascript.
http://codepen.io/chriscoyier/pen/evcBu
Você só precisa usar uma regra CSS como esta:
Observe que o
!important
bit é necessário para substituir a cor de preenchimento.fonte
<div ng-include="'svg.svg'"></div>
#pathidorclass:hover, .wrapperclass:hover #pathidorclass { fill: green; }
Ou até mesmo elimine a focalização original do caminho SVG, já que você está direcionando-o agora através do elemento wrapper.@Drew Baker deu uma ótima solução para resolver o problema. O código funciona corretamente. No entanto, quem usa AngularJs pode encontrar muita dependência do jQuery. Consequentemente, achei uma boa ideia colar para usuários do AngularJS, um código que segue a solução de @Drew Baker.
AngularJs maneira do mesmo código
1. Html : use a tag abaixo no seu arquivo html:
2. Diretiva : será a diretiva que você precisará reconhecer a etiqueta:
3. CSS :
4. Teste unitário com karma-jasmim :
fonte
<div ng-include="/icons/my.svg" class="any-class-you-wish"></div>
ng-include
em seguida, basta alterar esta linhavar imgURL = element.attr('src');
paravar imgURL = element.attr('ng-include');
if (typeof(imgClass) !== 'undefined') { $svg.setAttribute("class", imgClass); }
vez de split e for loop.angular.element(data)[0];
) e fazê-lo funcionar com o uso do IEif ($svg.getAttribute('class')) { $svg.setAttribute('class', $svg.getAttribute('class') + ' ' + imgClass); } else { $svg.setAttribute('class', imgClass); }
. Além disso, você pode adicionarcache: true
opções às opções,$http.get
caso contrário sua página poderá ficar muito lenta.Sei que você deseja fazer isso com CSS, mas apenas um lembrete, caso seja uma imagem pequena e simples - você sempre pode abri-la no Notepad ++ e alterar o caminho / o preenchimento de qualquer elemento:
Poderia economizar uma tonelada de scripts feios. Desculpe se está fora da base, mas às vezes as soluções simples podem ser negligenciadas.
... mesmo a troca de várias imagens svg pode ser menor em tamanho do que alguns dos trechos de código para esta pergunta.
fonte
Eu escrevi uma diretiva para resolver esse problema com o AngularJS. Está disponível aqui - ngReusableSvg .
Ele substitui o elemento SVG após sua renderização e o coloca dentro de um
div
elemento, tornando seu CSS facilmente alterável. Isso ajuda a usar o mesmo arquivo SVG em locais diferentes, usando tamanhos / cores diferentes.O uso é simples:
Depois disso, você pode facilmente ter:
fonte
TL / DR: VÁ aqui-> https://codepen.io/sosuke/pen/Pjoqqp
Explicação:
Eu estou assumindo que você tem html algo como isto:
Definitivamente, siga a rota do filtro, ou seja. seu svg provavelmente é preto ou branco. Você pode aplicar um filtro para obter a cor que desejar, por exemplo, tenho um svg preto que quero verde menta. Primeiro inverti para branco (que é tecnicamente todas as cores RGB cheias) e depois brinquei com a saturação de matiz etc. Para acertar:
Ainda melhor é que você pode usar uma ferramenta para converter o hexágono que deseja em um filtro para você: https://codepen.io/sosuke/pen/Pjoqqp
fonte
Aqui está uma versão
knockout.js
baseada na resposta aceita:Importante: Na verdade, também requer jQuery para a substituição, mas achei que poderia ser útil para alguns.
Em seguida, basta aplicar
data-bind="svgConvert: true"
a sua tag img.Essa solução substitui completamente a
img
tag por um SVG e quaisquer ligações adicionais não seriam respeitadas.fonte
get
solicitá-lo novamente. Eu considerei mudar osrc
a umdata-src
atributo naimg
tag, mas concluiu que os navegadores modernos são suficientes provavelmente inteligente para armazenar em cache o arquivo de qualquer maneiraAqui está um código sem estrutura, apenas js puros:
fonte
Existe uma biblioteca de código aberto chamada SVGInject que usa o
onload
atributo para disparar a injeção. Você pode encontrar o projeto GitHub em https://github.com/iconfu/svg-injectAqui está um exemplo mínimo usando SVGInject:
Após o carregamento da imagem
onload="SVGInject(this)
, a injeção será acionada e o<img>
elemento será substituído pelo conteúdo do arquivo SVG fornecido nosrc
atributoEle resolve vários problemas com a injeção de SVG:
Os SVGs podem ficar ocultos até a injeção terminar. Isso é importante se um estilo já estiver aplicado durante o tempo de carregamento, o que causaria um breve "flash de conteúdo sem estilo".
Os
<img>
elementos os injetam automaticamente. Se você adicionar SVGs dinamicamente, não precisará se preocupar em chamar a função de injeção novamente.Uma sequência aleatória é adicionada a cada ID no SVG para evitar ter o mesmo ID várias vezes no documento se um SVG for injetado mais de uma vez.
SVGInject é Javascript simples e funciona com todos os navegadores que suportam SVG.
Disclaimer: Eu sou o co-autor do SVGInject
fonte
Se tivermos um número maior de imagens svg, também podemos ter a ajuda de arquivos de fonte.
Sites como https://glyphter.com/ podem obter um arquivo de fonte do nosso svgs.
Por exemplo
fonte
Você pode usar a imagem de dados para isso. usando a imagem de dados (URI de dados), você pode acessar o SVG como em linha.
Aqui está o efeito de sobreposição usando CSS e SVG puros.
Eu sei que é uma bagunça, mas você pode fazer assim.
Você pode converter seu svg em url de dados aqui
fonte
Como o SVG é basicamente código, você precisa apenas de conteúdo. Eu usei o PHP para obter conteúdo, mas você pode usar o que quiser.
Em seguida, imprimi o conteúdo "como está" dentro de um contêiner div
Para definir finalmente uma regra para childs SVG do contêiner no CSS
Eu obtive esses resultados com um ícone de material SVG:
fonte
A solução selecionada é boa se você quiser que o jQuery processe todos os elementos svg no seu DOM e seu DOM seja de tamanho razoável. Mas se o seu DOM for grande e você decidir carregar partes do seu DOM dinamicamente, realmente não faz sentido ter que varrer novamente todo o DOM apenas para atualizar os elementos svg. Em vez disso, use um plugin jQuery para fazer isso:
No seu html, especifique um elemento svg da seguinte maneira:
E aplique o plugin:
fonte
para: animações de evento pairar, podemos deixar os estilos dentro do arquivo svg, como um
verifique isso no svgshare
fonte