Qual é a maneira válida de incluir uma imagem sem src?

234

Eu tenho uma imagem que preencherei dinamicamente com um src posteriormente com javascript, mas para facilitar, quero que a tag de imagem exista no carregamento de página, mas não exiba nada. Eu sei que <img src='' />é inválido, então qual é a melhor maneira de fazer isso?

jhchen
fonte
4
Esta é uma pergunta relativamente antiga, mas vale a pena considerar que uma imagem sem src é essencialmente sem sentido e é por isso que a especificação diz que a imagem deve ter um src apontando para algum recurso incorporado em primeiro lugar. Se você está pensando em validade e / ou semântica, é muito melhor omitir a imagem completamente e adicioná-la após o fato, pois o HTML não fornece uma maneira de especificar uma imagem de espaço reservado que será preenchida com dados posteriormente.
BoltClock
1
Ao usar o plug-in jQuery de carregamento lento de Mika Tuupola, ele usa a marcação '<img class = "preguiçoso" data-original = "img / example.jpg" width = "640" height = "480">', então, em certo sentido, você precisa apontar para uma fonte, mas isso não precisa ser feito com o atributo src.
IWillGetBetter 05/10/19
Você pode usar o elemento div em vez disso consulte este => stackoverflow.com/a/5513934/1395101
Amin Ghaderi

Respostas:

237

Embora não exista uma forma válida para omitir fonte de uma imagem, não são fontes que não irá causar acertos do servidor. Recentemente, tive um problema semelhante com se iframedeterminado //:0a ser a melhor opção. Não mesmo!

Iniciar com //(omitir o protocolo) faz com que o protocolo da página atual seja usado, impedindo avisos de "conteúdo não seguro" nas páginas HTTPS. Ignorar o nome do host não é necessário, mas o torna mais curto. Finalmente, uma porta :0garante que uma solicitação do servidor não possa ser feita (não é uma porta válida, de acordo com as especificações).

Este é o único URL que encontrei que não causou ocorrências no servidor ou mensagens de erro em nenhum navegador. A escolha usual - javascript:void(0)- causará um aviso de "conteúdo não seguro" no IE7 se usado em uma página veiculada via HTTPS. Qualquer outra porta causou uma tentativa de conexão com o servidor, mesmo para endereços inválidos. (Alguns navegadores simplesmente fazem a solicitação inválida e aguardam o tempo limite.)

Isso foi testado no Chrome, Safari 5, FF 3.6 e IE 6/7/8, mas espero que funcione em qualquer navegador, pois deve ser a camada de rede que mata qualquer tentativa de solicitação.

Ben Blank
fonte
16
Esta resposta pode fazer com que seu firewall avise sobre o acesso à porta 0, por exemplo. Ou pode causar um log de segurança do servidor. A resposta aconselhada about:blanké provavelmente uma solução melhor.
Florian Margaine
10
Isso está fazendo com que um ícone de imagem corrompida seja exibido para mim. Alguém mais está vendo isso? Estou usando o Firefox mais recente (27).
dmikester1
10
Isso também falha no validador w3c: Valor inválido //: 0 para o atributo src no elemento img: Host inválido: host vazio.
ysrb
Isso não funciona: eu tenho um aplicativo ASP.NET MVC 4 que contém um plug-in da galeria de imagens chamado clearing. O plugin cria as imagens dinamicamente e coloca //: 0 o src até que a imagem seja realmente obtida. Isso estava fazendo com que a ação de índice do meu controlador de casa fosse chamada duas vezes. Então cuidado.
Jspgrassi
2
No Firefox 38, essa abordagem aciona o onerrormanipulador da imagem .
Nate Whittaker
221

Outra opção é incorporar uma imagem em branco. Qualquer imagem que se adapta ao seu propósito vai fazer, mas o exemplo a seguir codifica uma GIF que é apenas 26 bytes - de http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever

<img src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=" width="0" height="0" alt="" />

Edite com base no comentário abaixo:

Obviamente, você deve considerar os requisitos de suporte do navegador. Nenhum suporte para o IE7 ou menos é notável. http://caniuse.com/datauri

Isius
fonte
14
Boa ideia! Para mim, no entanto, isso mata o elemento de imagem - se alguém precisar de outros aspectos do imgelemento para mostrar, por exemplo, plano de fundo e borda, tente o src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="que é tirado de um gif transparente de 1px x 1px que fiz no Photoshop através do arquivo base64-image.de
user56reinstatemonica8
4
Você pode querer pensar duas vezes sobre inlining seus recursos com dados URIs: mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan
1
A viabilidade desta opção depende de quais navegadores você deve apoiar: caniuse.com/datauri
Jeff Clemens
6
Aqui está um PNG transparente de 1 pixel:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon
2
Url transparente imagem que funcionou para mim -data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao
34

Atualmente, a IMHO, a melhor maneira curta, sã e válida para um img src vazio é a seguinte:

<img src="data:," alt>
or
<img src="data:," alt="Alternative Text">

O segundo exemplo exibe "Texto alternativo" (mais o ícone de imagem quebrada no Chrome e IE).

"data:,"é um URI válido. O tipo de mídia vazio é padronizado como text/plain. Portanto, representa um arquivo de texto vazio e é equivalente a"data:text/plain,"


OT: Todos os navegadores entendem claramente alt. Você pode omitir ="", está implícito por especificação de HTML.

jj
fonte
1
Nenhum erro de HTML com a verificação do validador do W3C. Nenhum pedido desnecessário. Be Parece ser a maneira válida de como fazê-lo.
Kai Noack
Melhor! Só mais uma coisa, se você quiser para validar em um srcset, usosrcset="data:,x"
Lucian Davidescu
18

Eu recomendo adicionar dinamicamente os elementos e, se estiver usando jQuery ou outra biblioteca JavaScript, é bastante simples:

também olhe prepende append. Caso contrário, se você tiver uma tag de imagem assim e quiser validá-la, considere usar uma imagem fictícia, como um gif transparente de 1px ou png.

falta de polaridade
fonte
7
+1 Esta é a melhor resposta. Se a fonte da imagem estiver sendo configurada dinamicamente de qualquer maneira, todo o elemento deverá ser adicionado dinamicamente. Se você não o quer visível até que o src esteja definido, não consigo pensar em nenhuma boa razão para o elemento estar lá antes disso.
Andrew Ensley
15

Não faço isso há algum tempo, mas tive que passar pela mesma coisa uma vez.

<img src="about:blank" alt="" />

É o meu favorito - o //:0que implica que você tentará fazer uma conexão HTTP / HTTPS com o servidor de origem na porta zero (a porta tcpmux?) - que provavelmente é inofensiva, mas prefiro não fazer isso. Caramba, o navegador pode ver a porta zero e nem mesmo enviar uma solicitação. Mas eu ainda prefiro que não seja especificado dessa maneira quando provavelmente não é isso que você quer dizer.

De qualquer forma, a renderização about:blanké realmente muito rápida em todos os navegadores que testei. Acabei de jogá-lo no validador W3C e ele não reclamou, portanto pode até ser válido.

Edit : Não faça isso; ele não funciona em todos os navegadores (mostrará um ícone de 'imagem quebrada', conforme apontado nos comentários para esta resposta). Use a <img src='data:...solução abaixo. Ou, se você não se importa com a validade, mas ainda deseja evitar solicitações supérfluas para o servidor, pode fazer isso <img alt="" />sem nenhum atributo src. Mas isso é HTML INVÁLIDO, então escolha com cuidado.

Página de teste mostrando vários métodos diferentes: http://desk.nu/blank_image.php - servido com todos os tipos de diferentes tipos de documentos e tipos de conteúdo. - conforme mencionado nos comentários abaixo, use a nova página de teste de Mark Ormston em: http://memso.com/Test/BlankImage.html

Uberbrady
fonte
Isso parece mais limpo do que deixar a camada de rede emitir um erro.
Denys Séguret
Pelo menos você está certo de um firewall estúpido não vai pedir a permissão para a porta chamada 0 ...
Denys Séguret
1
Vale a pena mencionar que este exibe o ícone 'imagem quebrada' no Chrome (e provavelmente outros navegadores também)
user56reinstatemonica8
1
É pior do que eu pensava - mesmo com o doctype html5, ele parece não funcionar no Safari ou no Chrome. Eu tenho uma página de teste acima que irá mexer no tipo de conteúdo e no tipo de documento de uma página, e até agora o meu favorito é: <img />- uma marca de imagem sem o atributo src. Isso não é válido (então não faz sentido colocar a tag alt vazia lá). Continuo brincando e atualizo minha resposta (ou passo a passo) de acordo.
Uberbrady
2
Peguei sua página de teste e atualizei-a para que fique bem mais óbvio quando as imagens não funcionam corretamente. A imagem em branco antiga é incluída como um exemplo "Sempre funciona", bem como uma breve descrição do que você está vendo: memso.com/Test/BlankImage.html Isso me levou a perceber que o gif de dados em branco válido é o único reutilizável opção para navegadores modernos, exceto a antiga imagem gif em branco (que ainda é necessária para o IE7 antigo e abaixo)
Mark Ormston
12

Conforme escrito nos comentários, esse método está errado.

Eu não encontrei essa resposta antes, mas de acordo com a tag vazia válida do W3 Specssrc seria um link de âncora #.

Exemplo: src="#",src="#empty"

A página valida com sucesso e nenhuma solicitação extra é feita.

iGidas
fonte
1
Existem argumentos contra essa abordagem? Como é isso nos navegadores?
tremby
18
Vi o Firefox e o Chrome fazer uma segunda solicitação ao usar essa abordagem, por isso não a recomendo.
Marius
5
Firefox, Chrome fazer um segundo pedido, mesmo JMeter analisa o src img, o que resulta em cargas de página recursiva (até a profundidade máxima é atingido)
burna
1
Em FF você deve apertar o botão de volta Browsers duas vezes se você quiser folha a página porque o url muda misteriosamente ..
Kalaschni
3
Isso está completamente errado. Qualquer um que ler comentários - NÃO USE ESTE
Shadow Wizard is Ear For You
11

Eu descobri que simplesmente definir o src como uma string vazia e adicionar uma regra ao seu CSS para ocultar o ícone da imagem quebrada funciona muito bem.

[src=''] {
    visibility: hidden;
}
Shawn Walton
fonte
[ng-src = ''] {visibilidade: oculto; } se você estiver usando a diretiva ng-src no angularjs
Ivan Paredes
1
Observe que o src deve estar definido como '', não deve estar indefinido.
Vincent Hoch-Drei
Se não me engano, uma solicitação ainda será realizada
Nico
9

se você mantiver o atributo src, o navegador vazio enviará uma solicitação para o URL da página atual, adicione sempre 1 * 1 img transparente no atributo src, se não desejar nenhum URL

src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="
Prathamesh Rasam
fonte
1
Isso será exibido como um ponto preto em alguns navegadores.
tomasz86
IE8, com certeza, e versões mais antigas do Firefox de acordo com o stackoverflow.com/questions/9126105/…
tomasz86
1
este src data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==funcionou embora
Max Yari 25/11
9

Eu descobri que usando:

<img src="file://null">

não fará uma solicitação e valida corretamente.

Os navegadores simplesmente bloquearão o acesso ao sistema de arquivos local.

Mas pode haver um erro exibido no log do console no Chrome, por exemplo:

Not allowed to load local resource: file://null/
tenkod
fonte
2
Importa-se de explicar o voto negativo? Observe que não estou recomendando o uso desse método, apenas fornecendo um caso para discussão. E está atendendo aos requisitos da pergunta para validar corretamente e não fazer solicitações adicionais.
tenkod
8

Use um SVG verdadeiramente em branco, válido e altamente compatível, com base neste artigo :

src="data:image/svg+xml;charset=utf8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%3E%3C/svg%3E"

O tamanho padrão será 300x150px, como qualquer SVG, mas você pode trabalhar com isso nos imgestilos padrão do elemento, como seria possível em qualquer caso na implementação prática.

mystrdat
fonte
Obrigado por atualizar sua resposta, mas suspeito que a compatibilidade seja ainda pior para isso, do que a outra solução de dados-uri, já que você usa svg que não era compatível até o IE9. Felizmente, já faz um tempo desde que eu tive que apoiar o IE legado, mas ainda é relevante para algumas pessoas.
funkylaundry
Mas isso não sofre os mesmos problemas que neste artigo? dev.mobify.com/blog/data-uris-are-slow-on-mobile . Estou pensando que a opção <img src = "about: blank"> com css img [src = "about: blank"] {opacidade: 0} é a melhor solução. Ou, se esse nível de seletor de CSS não for suportado em navegadores antigos, basta atribuir à tag img uma classe como "carregamento" ou algo assim. Melhor ainda, forneça a classe, use JavaScript para trocar o data-src e defina uma função de carregamento para a imagem para torná-la mais leve. Você também pode definir um botão giratório para ser mostrado enquanto estiver carregando. Parece realmente profissional.
Jordan Carter
@JordanCarter Claro, se o desempenho detalhado é uma preocupação. Como nota de rodapé, eu diria que visibility: hiddené um pouco mais adequado do que opacity: 0para os seletores de atributos que você está sugerindo.
mystrdat
6

Com base na resposta de Ben Blank, a única maneira que consegui validar isso no validador w3 era assim:

<img src="/./.:0" alt="">`
John Duncan
fonte
Ele valida, mas resulta em imagem quebrada no Firefox, mesmo com um altatributo vazio .
James Wright
4

Eu pessoalmente uso about:blank srce lida com o ícone de imagem quebrada, definindo a opacidade do imgelemento como 0.

Miguel
fonte
7
Agora está sujo!
mystrdat
@mystrdat: Gostaria de explicar por que está sujo? A resposta aceita, usando "//: 0", ainda me deu o ícone de imagem quebrada, além de uma solicitação estranha e interminável no Firefox. A alternativa de pixel único base64 png, também com muitos votos, me causou problemas ao usar o <img> como espaço reservado, com e sem especificar a altura e a largura. Essa é a maneira mais limpa que encontrei para atingir minha meta sem solicitações desnecessárias e sem passar em todas as linhas e validações.
Miguel
Todas as soluções acima são muito tolas e as aceitas estão incluídas; darei uma nova resposta assim que tiver mais tempo.
mystrdat
@mystrdat: Eu ainda ficaria feliz em saber o que você tem a dizer sobre isso?
Funkylaundry
1
@funkylaundry Peço desculpas por fazer grandes reclamações e desaparecer, postei minha resposta agora. Também admito que não notei as outras soluções de Data URI antes, com as quais concordo, mas acredito que a minha seja superior na sintaxe de qualquer maneira.
Mystrdat 26/05
4
<img src="invis.gif" />

Onde invis.gif é um gif transparente de um único pixel. Isso não será interrompido nas versões futuras dos navegadores e funciona em navegadores herdados desde os anos 90.

O png também deve funcionar, mas nos meus testes, o gif era de 43 bytes e o png era de 167 bytes.

ps não esqueça uma tag alt, validadores como eles também.

Franki
fonte
-1

Simplesmente, assim:

<img id="give_me_src"/>
anmml
fonte
4
Não é uma boa ideia de acordo com a especificação : O atributo src deve estar presente e deve conter uma URL válida ...
Michael Litvin
1
Talvez ele funciona bem no Chrome, mas vai jogar erros em html validação e não é um html válido W3 ...
EhsanT