Devo usar <img>
, <object>
ou <embed>
para carregar arquivos SVG em uma página de uma forma semelhante ao carregamento de um jpg
, gif
ou png
?
Qual é o código de cada um para garantir que funcione da melhor maneira possível? (Estou vendo referências à inclusão do tipo de mimet ou apontando para renderizadores SVG substitutos em minha pesquisa e não vendo uma boa referência do estado da arte).
Suponha que eu esteja verificando o suporte ao SVG com o Modernizr e retornando (provavelmente fazendo uma substituição por uma <img>
marca simples ) para navegadores que não sejam compatíveis com SVG.
html
svg
vector-graphics
artlung
fonte
fonte
<svg>
partir do qual deseja fazer referência a outros SVGs. Isso pode ser alcançado, por exemplo, usando<image>
.Respostas:
Posso recomendar o SVG Primer (publicado pelo W3C), que aborda este tópico: http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#SVG_in_HTML
Se você usar
<object>
, obterá o fallback de varredura gratuitamente *:*) Bem, não é de graça, porque alguns navegadores baixam os dois recursos, veja a sugestão de Larry abaixo para saber como contornar isso.
Atualização de 2014:
Se você deseja um svg não interativo, use
<img>
com fallbacks de script para a versão png (para IE e android mais antigos <3). Uma maneira limpa e simples de fazer isso:<img src="your.svg" onerror="this.src='your.png'">
.Isso se comportará como uma imagem GIF e, se o seu navegador suportar animações declarativas (SMIL), elas serão reproduzidas.
Se você deseja um svg interativo, use
<iframe>
ou<object>
.Se você precisar fornecer a navegadores antigos a capacidade de usar um plug-in svg, use
<embed>
.Para svg em css
background-image
e propriedades semelhantes, modernizr é uma opção para alternar para imagens de fallback, outra depende de vários fundos para fazê-lo automaticamente:Nota : a estratégia de vários fundos não funciona no Android 2.3 porque suporta vários fundos, mas não svg.
Uma boa leitura adicional é este post no blog sobre svg fallbacks.
fonte
<param name="src" value="your.svg" />
dentro da<object>
tag. Passei muito tempo tentando descobrir como fazer tudo isso, e acho que finalmente consegui.No IE9 e acima, você pode usar o SVG em uma tag IMG comum.
https://caniuse.com/svg-img
fonte
<img/>
tag pode querer saber sobre como anexar identificadores SVG Fragement , por exemplo, "<img src="myimage.svg#svgView(preserveAspectRatio(none))" />
", que permite controlar a proporçãoviewBox
, etc, da mesma forma que nas definições de SVG embutidas. Leitura adicional sobre dimensionamento - css-tricks.com/scale-svg<object>
e<embed>
possuem uma propriedade interessante: permitem obter uma referência ao documento SVG a partir de um documento externo (levando em consideração a política de mesma origem). A referência pode ser usada para animar o SVG, alterar suas folhas de estilo etc.Dado
Você pode fazer coisas como
fonte
A melhor opção é usar imagens SVG em diferentes dispositivos :)
fonte
onerror
incêndios se o svg não renderizar? Quais navegadores você testou?Usar
srcset
Hoje, a
srcset
maioria dos navegadores atuais suporta o atributo , que permite especificar imagens diferentes para diferentes usuários. Por exemplo, você pode usá-lo para densidade de pixels de 1x e 2x, e o navegador selecionará o arquivo correto.Nesse caso, se você especificar um SVG no
srcset
e o navegador não o suportar, ele fará o fallback nosrc
.Este método possui vários benefícios sobre outras soluções:
srcset
devem saber como lidar com isso, para que ele faça o download apenas do arquivo necessário.fonte
Se você precisar que seus SVGs sejam totalmente estilizados com CSS, eles deverão estar embutidos no DOM. Isso pode ser alcançado através da injeção SVG, que usa Javascript para substituir um elemento HTML (geralmente um
<img>
elemento) pelo conteúdo de um arquivo SVG após o carregamento da página.Aqui 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 fornecido nosrc
atributo Isso funciona com todos os navegadores que suportam SVG.Disclaimer: Eu sou o co-autor do SVGInject
fonte
Eu pessoalmente usaria uma
<svg>
tag, porque se você tiver controle total sobre ela . Se você o usar,<img>
não poderá controlar as entranhas do SVG com CSS etc.Outra coisa é o suporte ao navegador .
Basta abrir seu
svg
arquivo e colá-lo diretamente no modelo.então no seu css você pode simplesmente por exemplo:
Algum recurso: dicas SVG
fonte
Se você usar tags <img> , os navegadores baseados no kit da web não exibirão imagens de bitmap incorporadas .
Para qualquer tipo de uso avançado de SVG, incluindo o SVG embutido, oferece de longe a maior flexibilidade.
O Internet Explorer e o Edge redimensionarão o SVG corretamente , mas você deve especificar a altura e a largura.
Você pode adicionar onclick, onmouseover, etc. dentro do svg, a qualquer forma no SVG: onmouseover = "top.myfunction (evt);"
Você também pode usar fontes da Web no SVG incluindo-as em sua folha de estilos comum.
Nota: se você estiver exportando SVGs do Illustrator, os nomes das fontes da Web estarão incorretos. Você pode corrigir isso no seu CSS e evitar mexer no SVG. Por exemplo, o Illustrator atribui o nome errado a Arial e você pode corrigi-lo assim:
Tudo isso funciona em qualquer navegador lançado desde 2013 .
Para um exemplo, consulte ozake.com . Todo o site é composto por SVGs, exceto pelo formulário de contato.
Aviso: as fontes da Web são redimensionadas de maneira imprecisa no Safari - e se você tiver muitas transições de texto sem formatação para negrito ou itálico, pode haver uma pequena quantidade de espaço extra ou ausente nos pontos de transição. Veja minha resposta nesta pergunta para obter mais informações.
fonte
img
etiqueta ... Você sabe se isso está oficialmente documentado em algum lugar?Meus dois centavos: a partir de 2019, 93% dos navegadores em uso (e 100% das duas últimas versões de cada um deles) podem manipular SVG em
<img>
elementos:Fonte: Posso usar
Então, nós poderia dizer que não há nenhuma razão para usar
<object>
mais.No entanto , ainda tem seus profissionais :
Ao inspecionar (por exemplo, com as Ferramentas de Desenvolvimento do Chrome), você recebe toda a marcação SVG, caso queira mexer um pouco com ela e ver alterações ao vivo.
Ele fornece uma implementação de fallback muito robusta, caso seu navegador não suporte SVGs (aguarde, mas todos eles suportam!), O que também funciona se o SVG não for encontrado. Esse era um recurso essencial das especificações XHTML2, que é como betamax ou HD-DVD
Mas também existem contras :
<object>
(embora seja perfeitamente seguro usá-lo<amp-img>
e usá-lo também em linha) .<object>
tag pode impedir que o seu PWA seja realmente capaz de offline.fonte
Foi encontrada uma solução com CSS puro e sem download de imagem dupla. Não é bonito como eu quero, mas funciona.
A idéia é inserir SVG especial com estilo de fallback.
Mais detalhes e processo de teste você pode encontrar no meu blog .
fonte
Essa função jQuery captura todos os erros nas imagens svg e substitui a extensão do arquivo por uma extensão alternativa
Por favor, abra o console para ver o erro ao carregar a imagem svg
fonte
Eu recomendo usar a combinação de
fonte
Você pode inserir um SVG indiretamente usando a
<img>
tag HTML e isso é possível no StackOverflow, seguindo o descrito abaixo:Tenho o seguinte arquivo SVG no meu PC
Fiz upload desta imagem para https://svgur.com
Após o término do upload, eu obtive o seguinte URL:
Em seguida, adicionei MANUALMENTE (sem usar o ícone IMAGE) após a tag html
e o resultado está logo abaixo
Para usuários com alguma dúvida, é possível ver o que fiz na edição da seguinte resposta no StackOverflow inserindo imagem SVG
OBSERVAÇÃO-1: o arquivo SVG deve conter o
<?xml?>
elemento No começo, eu simplesmente criei um arquivo SVG que começa diretamente com a<svg>
tag e nada funcionou!OBSERVAÇÃO-2: no início, tentei inserir uma imagem usando o
IMAGE
ícone deEdit Toolbar
. Eu colo o URL do meu arquivo SVG, mas o StackOverflow não aceita esse método. A<img>
tag deve ser adicionada manualmente.Espero que esta resposta possa ajudar outros usuários.
fonte