O Chrome não renderiza SVG referenciado por meio da tag <img>

99

Estou tendo problemas com o google chrome, não renderizando svg com uma tag img. Isso acontece ao atualizar a página e ao carregar a página inicial. Posso fazer com que a imagem apareça "Inspecionando Elemento", clicando com o botão direito do mouse no arquivo SVG e abrindo o arquivo SVG em uma nova guia. A imagem SVG será então renderizada na página original.

<img src="../images/Aged-Brass.svg">

Totalmente perdido aqui quanto ao problema. A imagem svg funciona bem no IE9 e FF, mas não no Chrome ou Safari.

Eu tenho meus tipos MIME definidos também. (imagem / svg + xml)

EDIT: Aqui está uma página html simples que criei para ajudar a ilustrar meu problema.

<!DOCTYPE html>
<html>
<head>
    <title>SVG Test</title>

    <style>
        #BackgroundImage{
            background: url('../images/Aged-Brass.svg') no-repeat scroll left top;
            width: 400px;
            height: 600px;
        }

        #ImageTag{
            width: 400px;
            height: 600px;
            margin: 0px;
            padding: 0px;
        }
    </style>
</head>
<body>
    <div id="ImageTag">
        <img src="../images/Aged-Brass.svg">
    </div>
    <div id="BackgroundImage"></div>
</body>
</html>

Como você pode ver, estou tentando usar um arquivo svg em uma tag img e em css como imagem de fundo. Nenhum trabalho no carregamento da página inicial no Chrome ou Safari. Quando eu inspeciono o elemento, clique com o botão direito em svg ou clique no link para svg load em outra janela, o arquivo svg será renderizado na guia original.

Jason Van Vuren
fonte
1
Você pode colocar um exemplo ou postar algum código de exemplo aqui?
Sirko
Nós realmente precisamos ser capazes de ver e reproduzir isso nós mesmos, se você quiser ajuda.
Phrogz
Por acaso, seu "Aged-Brass.svg" contém uma imagem embutida? Eu tive o mesmo problema, e foi isso que rastreei ...
McGarnagle

Respostas:

131

Uma maneira simples e fácil; de acordo com https://css-tricks.com/forums/topic/svg-css-background-image-not-showing-in-chrome/ Você deve abrir o arquivo .SVG com um editor de texto (como o bloco de notas) e alterar

xlink:href="data:img/png;base64,

para:

xlink:href="data:image/png;base64,

funcionou para mim!

Sharif Yazdian
fonte
10
Esta é uma solução funcional. Eu tive esse problema ao exportar um objeto vetorial inteligente como SVG usando o photoshop.
Mikhail
11
Este foi um salva-vidas, passar horas tentando descobrir qual era o problema. Obrigado!!
mhodges,
2
Da mesma forma, isso resolveu meu problema, também passei muito tempo tentando descobrir por que a imagem não estava aparecendo.
MrEvers
3
Eu não tinha essa linha de código no arquivo SVG e adicioná-la à tag <svg> não fez nada para mim.
Pete
2
Isso deve estar bem no topo. Você salvou meu dia.
Mattia Rasulo
43

A tag svg precisa do atributo de namespace xmlns:

<svg xmlns="http://www.w3.org/2000/svg"></svg>
estrondo
fonte
Este. E eu tive que carregá-lo como uma imagem de fundo de um div.
casey
1
O svg ainda precisa do namespace. Apenas certifique-se de que esteja definido no arquivo SVG que você usa como plano de fundo.
bang,
31

vim aqui porque tive o mesmo problema, quando inspeciono o elemento consigo ver o arquivo, mas no site não consigo (mesmo usando localhost)

a resposta para o meu problema era salvar o arquivo SVG. Se você salvou do ilustrador, clique em 'incorporar' e não em 'link'. como link irá apenas referir-se aos seus arquivos locais em vez de incluir os dados (se bem entendi). insira a descrição da imagem aqui

Eu li sobre isso no site da adobe, que tem algumas outras dicas úteis para exportar http://www.adobe.com/inspire/2013/09/exporting-svg-illustrator.html

Isso funcionou para mim, espero que tenha sido útil.

MintWelsh
fonte
1
Alguém sabe se existe uma maneira de fazer isso com um objeto inteligente no Photoshop? Abrir o illustrator e reexportar com esta opção no illustrator foi a única coisa que me permitiu mostrar svgs no chrome, após várias tentativas de outras correções.
Alex Podworny
2
Que efeito essa opção tem no código SVG real?
Jānis Elmeris
21

Vim aqui porque tive um problema parecido, a imagem não estava sendo renderizada. O que descobri foi que o cabeçalho do tipo de conteúdo do meu servidor de teste não estava correto. Eu corrigi-lo adicionando o seguinte ao meu arquivo .htaccess:

AddType image/svg+xml svg svgz
AddEncoding gzip svgz
user87312
fonte
1
Obrigado. Definir Content-Type como image / svg + xml corrigiu.
samir105
Observe que image/svgoferece o arquivo para download, ele tem que ter +xml.
Jakub Vrána
10

Em <object>vez disso, use (é claro, substitua cada URL pelo seu):

.BackgroundImage {
        background: url('https://upload.wikimedia.org/wikipedia/commons/b/bd/Test.svg') no-repeat scroll left top;
        width: 400px;
        height: 600px;
}
<!DOCTYPE html>
<html>
<head>
    <title>SVG Test</title>
</head>
<body>
    <div id="ObjectTag">
        <object type="image/svg+xml" data="https://upload.wikimedia.org/wikipedia/commons/b/bd/Test.svg" width="400" height="600">
          Your browser does not support SVG.
        </object>
    </div>
    <div class="BackgroundImage"></div>
</body>
</html>

Essem
fonte
7

Adicionar o atributo de largura à tag [svg] (editando o XML de origem svg) funcionou para mim: por exemplo:

<!-- This didn't render -->
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
...  
</svg>

<!-- This did -->
<svg version="1.1" baseProfile="full" width="1000" xmlns="http://www.w3.org/2000/svg">
...  
</svg>
Silas Palmer
fonte
3

Consegui usar seu exemplo para criar uma página de teste e funcionou muito bem. Minha suposição é que há algo errado com seu arquivo SVG. Você pode colar isso aqui também? Aqui está o exemplo que usei.

 <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
   <!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
   <g>
      <title>Layer 1</title>
      <ellipse ry="30" rx="30" id="svg_1" cy="50" cx="50" stroke-width="5" stroke="#000000" fill="#FF0000"/>
   </g>
 </svg>
RestingRobot
fonte
3

parece um bug do Chrome, fiz outra coisa, pois quase fiquei louco por causa disso ... usando o depurador Chrom se você alterar o css do objeto svg que ele mostra na tela.

então o que fiz foi: 1. verificar o tamanho da tela 2. ouvir o evento "load" do meu objeto SVG 3. quando o elemento é carregado, eu mudo seu css usando jQuery 4. ele funcionou para mim

if (jQuery(window).width() < 769) {

  jQuery('object#mysvg-logo')[0].addEventListener('load', function() {
       jQuery("object#mysvg-logo").css('width','181px');
  }, true);

}
width: 180px;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<object id="mysvg-logo" type="image/svg+xml" data="my svg logo url here">Your browser does not support SVG</object>

Yossi Ben-david
fonte
2

Tive um problema semelhante e as respostas existentes para isso não eram aplicáveis ​​ou funcionavam, mas não podíamos usá-las por outros motivos. Então, eu tive que descobrir o que o Chrome não gostava em nossos SVGs.

No nosso caso, acabou sendo que o idatributo da symboltag no arquivo SVG tinha um :, o que o Chrome não gostou. Assim que removi o :, funcionou bem.

Ruim:

<svg
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 72 72">
    <defs>
        <symbol id="ThisIDHasAColon:AndChromeDoesNotLikeIt">
        ...
        </symbol>
    </defs>
    <use
        ....
        xlink:href="#ThisIDHasAColon:AndChromeDoesNotLikeIt"
    />
</svg>

Boa:

<svg
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 72 72">
    <defs>
        <symbol id="NoMoreColon">
        ...
        </symbol>
    </defs>
    <use
        ....
        xlink:href="#NoMoreColon"
    />
</svg>
Mike Willis
fonte
2

.svga imagem não tem altura e largura iniciais. Portanto, não é visível. Você tem que configurá-lo.

Você pode fazer in-line ou em arquivo css:

Na linha:

<img src="../images/Aged-Brass.svg" class="image" alt="logo" style="width: 100px; height: 50px;">

Arquivo css:

<img src="../images/Aged-Brass.svg" class="image" alt="logo">
.image {
    width: 100px;
    height: 50px;
}
Krzysztof Janiszewski
fonte
2

No meu caso, esse problema persistiu quando criei e salvei o svg usando o Photoshop. O que ajudou foi abrir o arquivo no Illustrator e depois exportar o svg.

Niels Vanhorenbeeck
fonte
O que mudou no código SVG real? Não estou usando Photoshop nem Illustrator, preciso consertar um arquivo SVG existente.
Jānis Elmeris
Neste caso, tente a resposta @Sharif!
Mattia Rasulo
1

Exportei meu svg do Photoshop CC inicialmente e tive que adicionar manualmente

version="1.1"na <svg>etiqueta

para exibi-lo no Chrome.

Andy Nguyen
fonte
1

O tipo de conteúdo no cabeçalho HTTP do servidor era o problema para mim. Eu tenho um servidor node.js, adicionado:

if( pageName.substring(pageName.lastIndexOf('.')) == '.svg' ) {
  res.writeHead(200, { "Content-Type": "image/svg+xml" });
}

pageName é minha variável local para o que é solicitado.

Meu palpite é que esse é um problema comum! Estou usando a versão atual do Chrome (março de 2020).

Badman Goodman
fonte
1

Para mim, definir largura / altura para o img funcionou. <asp:Image runat="server" ID="Icon" Style="max-width: 50px; max-height: 50px; position: relative;" />

psicopitton
fonte
0

Tive o mesmo problema. Se o servidor está configurado corretamente e .htacces não é a resposta, você pode querer olhar a fonte svg que você está incorporando. Os meus foram criados com editor de texto, renderizados bem no Chrome e Safari dentro do código html5, uma vez embutido, nada ficava visível. Adicionada versão correta, dimensões etc. ao código SVG e funciona perfeitamente. Além disso, todos os estilos embutidos.

Ie

<svg version="1.1" baseProfile="full" width="24" height="24" xmlns="http://www.w3.org/2000/svg"> 
  <rect x="0" y="0" rx="2" ry="2" width="24" height="24" style="fill:#fbc800;width:24px;height:24px;"  />  
</svg>
Uku
fonte
0

Eu também tive o mesmo problema com o cromo, depois de adicioná- DOCTYPElo funciona como esperado

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Antes

    <?xml version="1.0" encoding="iso-8859-1"?>
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     width="792px" height="792px" viewBox="0 0 792 792" style="enable-background:new 0 0 792 792;" xml:space="preserve">
    <g fill="none" stroke="black" stroke-width="15">
  ......
  ......
  .......
  </g>
</svg>

Depois de

    <?xml version="1.0" encoding="iso-8859-1"?>
<!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="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     width="792px" height="792px" viewBox="0 0 792 792" style="enable-background:new 0 0 792 792;" xml:space="preserve">
    <g fill="none" stroke="black" stroke-width="15">
  ......
  ......
  .......
  </g>
</svg>
Madan Bhandari
fonte
Qual é a diferença entre esses dois trechos de código? Eu não estou vendo isso.
rgilligan
@rgilligan, meu mal, o primeiro deveria sem doctype
Madan Bhandari
0

Tenha cuidado para não ter propriedade css de transição para imagens SVG

Não sei o porquê, mas se você fizer: "transição: todas as facilidades 0.3s" para a imagem SVG no Chrome, as imagens não aparecem

por exemplo:

* {
   transition: all ease 0.3s
  }

Chrome não renderiza SVG.

Remova qualquer propriedade css de transição e tente novamente

wilo087
fonte
0

Em caso de problemas, tente abrir as imagens primeiro com um programa capaz de ler imagens svg.
Se isso falhar, a imagem svg está de alguma forma corrompida.

Eu tive esse caso e copiei os caminhos-svg em uma nova imagem-svg e ajustei todos os detalhes das tags-svg.

Nunca testei o motivo de não ser renderizado, mas suponho que alguns sinais especiais invisíveis causaram o erro de renderização. Às vezes, obtive arquivos editados no Mac. Já tive esse problema em outro contexto.

David
fonte
0

Eu estava tendo o mesmo problema com uma imagem SVG incluída por meio da tag IMG. Descobri que o Chrome não gostava que houvesse uma linha em branco diretamente no topo do arquivo.

Removi a linha em branco e meu SVG imediatamente começou a renderizar.

pwbred
fonte
0

Certifico-me de adicionar o estilo da imagem . Funcionou para mim

style= "width:320; height:240"

pensebien
fonte
0
Just replace <img> tag to <object> tag for SVG image.

<object data="assets/twitter-wrap.svg" type="image/svg+xml"></object>
Jay Supeda
fonte
0

Lighttpd

Meu problema era que estava faltando um manipulador de mime para svgarquivos no arquivo de configuração lighttpd. Adicioná-los ao seu lighttpd.confpode resolver seu problema:

mimetype.assign             = (
  ".pdf"          =>      "application/pdf",
  ".sig"          =>      "application/pgp-signature",
  ".spl"          =>      "application/futuresplash",
  ".class"        =>      "application/octet-stream",
  ".ps"           =>      "application/postscript",
  ".torrent"      =>      "application/x-bittorrent",
  ".dvi"          =>      "application/x-dvi",
  ".gz"           =>      "application/x-gzip",
  ".pac"          =>      "application/x-ns-proxy-autoconfig",
  ".swf"          =>      "application/x-shockwave-flash",
  ".tar.gz"       =>      "application/x-tgz",
  ".tgz"          =>      "application/x-tgz",
  ".tar"          =>      "application/x-tar",
  ".zip"          =>      "application/zip",
  ".mp3"          =>      "audio/mpeg",
  ".m3u"          =>      "audio/x-mpegurl",
  ".wma"          =>      "audio/x-ms-wma",
  ".wax"          =>      "audio/x-ms-wax",
  ".ogg"          =>      "application/ogg",
  ".wav"          =>      "audio/x-wav",
  ".gif"          =>      "image/gif",
  ".jpg"          =>      "image/jpeg",
  ".jpeg"         =>      "image/jpeg",
  ".png"          =>      "image/png",
  ".svg"          =>      "image/svg+xml",
  ".xbm"          =>      "image/x-xbitmap",
  ".xpm"          =>      "image/x-xpixmap",
  ".xwd"          =>      "image/x-xwindowdump",
  ".css"          =>      "text/css",
  ".html"         =>      "text/html",
  ".htm"          =>      "text/html",
  ".js"           =>      "text/javascript",
  ".asc"          =>      "text/plain",
  ".c"            =>      "text/plain",
  ".cpp"          =>      "text/plain",
  ".log"          =>      "text/plain",
  ".conf"         =>      "text/plain",
  ".text"         =>      "text/plain",
  ".txt"          =>      "text/plain",
  ".spec"         =>      "text/plain",
  ".dtd"          =>      "text/xml",
  ".xml"          =>      "text/xml",
  ".mpeg"         =>      "video/mpeg",
  ".mpg"          =>      "video/mpeg",
  ".mov"          =>      "video/quicktime",
  ".qt"           =>      "video/quicktime",
  ".avi"          =>      "video/x-msvideo",
  ".asf"          =>      "video/x-ms-asf",
  ".asx"          =>      "video/x-ms-asf",
  ".wmv"          =>      "video/x-ms-wmv",
  ".bz2"          =>      "application/x-bzip",
  ".tbz"          =>      "application/x-bzip-compressed-tar",
  ".tar.bz2"      =>      "application/x-bzip-compressed-tar",
  ".odt"          =>      "application/vnd.oasis.opendocument.text", 
  ".ods"          =>      "application/vnd.oasis.opendocument.spreadsheet", 
  ".odp"          =>      "application/vnd.oasis.opendocument.presentation", 
  ".odg"          =>      "application/vnd.oasis.opendocument.graphics", 
  ".odc"          =>      "application/vnd.oasis.opendocument.chart", 
  ".odf"          =>      "application/vnd.oasis.opendocument.formula", 
  ".odi"          =>      "application/vnd.oasis.opendocument.image", 
  ".odm"          =>      "application/vnd.oasis.opendocument.text-master", 
  ".ott"          =>      "application/vnd.oasis.opendocument.text-template",
  ".ots"          =>      "application/vnd.oasis.opendocument.spreadsheet-template",
  ".otp"          =>      "application/vnd.oasis.opendocument.presentation-template",
  ".otg"          =>      "application/vnd.oasis.opendocument.graphics-template",
  ".otc"          =>      "application/vnd.oasis.opendocument.chart-template",
  ".otf"          =>      "application/vnd.oasis.opendocument.formula-template",
  ".oti"          =>      "application/vnd.oasis.opendocument.image-template",
  ".oth"          =>      "application/vnd.oasis.opendocument.text-web",

# make the default mime type application/octet-stream.
  ""              =>      "application/octet-stream",
)

Referências

Alternativa de AddType em lighthttpd

Tio Patinhas
fonte