¿Cuál es la forma válida de incluir una imagen sin src?

234

Tengo una imagen que poblaré dinámicamente con un src más tarde con javascript, pero para mayor facilidad quiero que la etiqueta de la imagen exista en la carga de la página, pero no mostrar nada. Sé <img src='' />que no es válido, ¿cuál es la mejor manera de hacer esto?

jhchen
fuente
44
Esta es una pregunta relativamente antigua, pero vale la pena considerar que una imagen sin src carece esencialmente de sentido y es por eso que la especificación dice que la imagen debe tener un src que apunte a algún recurso incrustado en primer lugar. Si está pensando en la validez y / o la semántica, es mucho mejor que omita la imagen por completo y la agregue después del hecho, ya que HTML no proporciona una forma de especificar una imagen de marcador de posición que se completará con datos más adelante.
BoltClock
1
Al utilizar el complemento jQuery de carga diferida de Mika Tuupola, utiliza el marcado '<img class = "lazy" data-original = "img / example.jpg" width = "640" height = "480">', por lo que, en cierto sentido, usted necesita apuntar a una fuente, pero no tiene que hacerse con el atributo src.
iWillGetBetter
Puede usar el elemento div en lugar de él, consulte esto => stackoverflow.com/a/5513934/1395101
Amin Ghaderi

Respuestas:

237

Aunque no existe una forma válida para omitir la fuente de una imagen, no son fuentes que no causará golpes servidor. Recientemente tuve un problema similar con iframesy decidí //:0ser la mejor opción. ¡No realmente!

Comenzar con //(omitir el protocolo) hace que se use el protocolo de la página actual, evitando advertencias de "contenido inseguro" en las páginas HTTPS. No es necesario omitir el nombre de host, pero lo hace más corto. Finalmente, un puerto de :0asegura que no se pueda realizar una solicitud del servidor (no es un puerto válido, según las especificaciones).

Esta es la única URL que encontré que no causó aciertos del servidor ni mensajes de error en ningún navegador. La opción habitual - javascript:void(0)causará una advertencia de "contenido inseguro" en IE7 si se usa en una página servida a través de HTTPS. Cualquier otro puerto provocó un intento de conexión del servidor, incluso para direcciones no válidas. (Algunos navegadores simplemente realizan la solicitud no válida y esperan a que se agote el tiempo de espera).

Esto se probó en Chrome, Safari 5, FF 3.6 e IE 6/7/8, pero espero que funcione en cualquier navegador, ya que debería ser la capa de red que mata cualquier intento de solicitud.

Ben Blank
fuente
16
Esta respuesta puede hacer que su firewall le advierta sobre el acceso al puerto 0, por ejemplo. O podría causar un registro de seguridad del servidor. La respuesta que aconseja about:blankes probablemente una mejor solución.
Florian Margaine
10
Esto está causando que se muestre un icono de imagen rota para mí. ¿Alguien más está viendo esto? Estoy usando la última versión de Firefox (27).
dmikester1
10
Esto también falla el validador w3c: valor incorrecto //: 0 para el atributo src en el elemento img: host no válido: host vacío.
ysrb
Esto no funciona: tengo una aplicación ASP.NET MVC 4 que contiene un complemento de galería de imágenes llamado clearing. El complemento crea las imágenes dinámicamente y pone el //: 0 del src hasta que la imagen se recupere realmente. Esto estaba haciendo que la acción de índice de mi controlador doméstico se llamara dos veces. Así que ten cuidado.
jpgrassi
2
En Firefox 38, este enfoque activa el onerrorcontrolador de la imagen .
Nate Whittaker
221

Otra opción es incrustar una imagen en blanco. Cualquier imagen que se adapte a su propósito funcionará, pero el siguiente ejemplo codifica un GIF de solo 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="" />

Editar según el comentario a continuación:

Por supuesto, debe considerar los requisitos de soporte de su navegador. No hay soporte para IE7 o menos es notable. http://caniuse.com/datauri

Isius
fuente
14
¡Gran idea! Para mí, sin embargo, esto mata el elemento de imagen: si alguien necesita otros aspectos del imgelemento para mostrar, por ejemplo, el fondo y el borde, intente src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="tomarlo de un gif transparente de 1px x 1px que hice I Photoshop empujó a través de base64-image.de
user56reinstatemonica8
44
Es posible que desee pensar dos veces antes de incluir sus recursos con URI de datos: mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan
1
La viabilidad de esta opción depende de qué navegadores debe admitir: caniuse.com/datauri
Jeff Clemens
66
Aquí hay un PNG transparente de 1 píxel:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon
2
URL de imagen transparente que funcionó para mí -data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao
34

En estos días, en mi humilde opinión, la mejor manera corta, sensata y válida para un src de img vacío es así:

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

El segundo ejemplo muestra "Texto alternativo" (más el icono de imagen rota en Chrome e IE).

"data:,"es un URI válido Un tipo de medio vacío predeterminado es text/plain. Por lo tanto, representa un archivo de texto vacío y es equivalente a"data:text/plain,"


OT: Todos los navegadores entienden claramente alt. Puede omitir ="", está implícito según las especificaciones HTML.

jj
fuente
1
No hay error de HTML con la verificación del validador W3C. No hay solicitud innecesaria. 👍 Parece ser la forma válida de cómo hacerlo.
Kai Noack
¡Mejor! Una cosa más, si desea que se valide en un srcset, usesrcset="data:,x"
Lucian Davidescu
18

Recomiendo agregar dinámicamente los elementos, y si usa jQuery u otra biblioteca de JavaScript, es bastante simple:

También mira prependy append. De lo contrario, si tiene una etiqueta de imagen como esa y desea validarla, puede considerar usar una imagen ficticia, como un gif o png transparente de 1 px.

nonopolaridad
fuente
77
+1 Esta es la mejor respuesta. Si la fuente de la imagen se configura dinámicamente de todos modos, todo el elemento debe agregarse dinámicamente. Si no quiere que sea visible hasta que se establezca el src, no puedo pensar en ninguna buena razón por la cual el elemento debería estar allí antes de eso.
Andrew Ensley
15

No he hecho esto en mucho tiempo, pero tuve que pasar por lo mismo una vez.

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

Es mi favorito: el //:0 primero implica que intentará establecer una conexión HTTP / HTTPS con el servidor de origen en el puerto cero (¿el puerto tcpmux?), Que probablemente sea inofensivo, pero prefiero no hacerlo de todos modos. Diablos, el navegador puede ver el puerto cero y ni siquiera enviar una solicitud. Pero aún así prefiero que no se especifique de esa manera cuando probablemente eso no sea lo que quieres decir.

De todos modos, la representación de about:blankes realmente muy rápida en todos los navegadores que probé. Simplemente lo tiré al validador W3C y no se quejó, por lo que incluso podría ser válido.

Editar : no hagas eso; no funciona en todos los navegadores (mostrará un icono de 'imagen rota' como se señala en los comentarios para esta respuesta). Use la <img src='data:...solución a continuación. O si no le importa la validez, pero aún así quiere evitar solicitudes superfluas a su servidor, puede hacerlo <img alt="" />sin ningún atributo src. Pero eso es inválido HTML VÁLIDO, así que selecciónalo con cuidado.

Página de prueba que muestra un montón de métodos diferentes: http://desk.nu/blank_image.php , que se sirve con todo tipo de diferentes tipos de contenido y doctypes. - como se menciona en los comentarios a continuación, use la nueva página de prueba de Mark Ormston en: http://memso.com/Test/BlankImage.html

Uberbrady
fuente
Eso parece más limpio que dejar que la capa de red emita un error.
Denys Séguret
Al menos estás seguro de que un estúpido firewall no pedirá permiso para llamar al puerto 0 ...
Denys Séguret
1
Vale la pena mencionar que esto muestra el icono de 'imagen rota' en Chrome (y probablemente también en otros navegadores)
user56reinstatemonica8
1
Es peor de lo que pensaba, incluso con el doctype html5 no parece funcionar en Safari o Chrome. Tengo una página de prueba abierta que hará girar el tipo de contenido y el tipo de documento de una página, y hasta ahora mi favorito es: <img />- una etiqueta de imagen sin el atributo src. Esto no es válido (por lo que tampoco tiene sentido poner la etiqueta alt vacía allí). Continúo jugando con él y actualizaré mi respuesta (o tachado) en consecuencia.
Uberbrady
2
Tomé su página de prueba y la actualicé para que sea mucho más obvio cuando las imágenes no funcionan correctamente. La antigua imagen en blanco se incluye como un ejemplo de "Siempre funciona", así como una breve descripción de lo que está viendo: memso.com/Test/BlankImage.html Esto me lleva a darme cuenta de que el gif válido de datos en blanco es el único reutilizable opción para navegadores modernos, que no sea la imagen GIF en blanco antigua (que todavía se requiere para IE7 anterior y anteriores)
Mark Ormston
12

Como está escrito en los comentarios, este método es incorrecto.

No encontré esta respuesta antes, pero según la etiqueta vacía válida de W3 Specssrc sería un enlace de anclaje #.

Ejemplo: src="#",src="#empty"

La página se valida con éxito y no se realiza ninguna solicitud adicional.

iGidas
fuente
1
¿Hay algún argumento en contra de este enfoque? ¿Cómo es a través de los navegadores?
temblorosa
18
He visto que tanto Firefox como Chrome hacen una segunda solicitud al usar este enfoque, por lo que no lo recomendaría.
Marius
55
Firefox, Chrome hacer una segunda petición, incluso JMeter analiza el src img, lo que resulta en cargas de la página recursivas (hasta que se alcanza la profundidad máxima)
burna
1
En FF, debe presionar el botón de retroceso de los navegadores dos veces si desea hojear la página porque la URL cambia misteriosamente ..
Kalaschni
3
Esto es completamente incorrecto. Cualquiera que suceda a leer comentarios - No utilice este
Asistente de sombra es el oído para usted
11

Descubrí que simplemente establecer el src en una cadena vacía y agregar una regla a su CSS para ocultar el icono de imagen rota funciona bien.

[src=''] {
    visibility: hidden;
}
Shawn Walton
fuente
[ng-src = ''] {visibilidad: oculto; } si está utilizando la directiva ng-src en angularjs
Ivan Paredes
1
Tenga en cuenta que el src debe establecerse en '', no debe estar indefinido.
Vincent Hoch-Drei
Si no me equivoco, aún se realizará una solicitud
Nico
9

si mantiene el atributo src vacío, el navegador enviará una solicitud a la URL de la página actual, siempre agregue 1 * 1 img transparente en el atributo src si no desea ninguna url

src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="
Prathamesh Rasam
fuente
1
Esto se mostrará como un punto negro en algunos navegadores.
tomasz86
IE8 seguro y versiones anteriores de Firefox de acuerdo con stackoverflow.com/questions/9126105/…
tomasz86
1
este src data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==funcionó sin embargo
Max Yari
9

He encontrado que usando:

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

no hará una solicitud y valida correctamente.

Los navegadores simplemente bloquearán el acceso al sistema de archivos local.

Pero podría aparecer un error en el registro de la consola en Chrome, por ejemplo:

Not allowed to load local resource: file://null/
tenkod
fuente
2
¿Te importaría explicar el voto negativo? Tenga en cuenta que no estoy recomendando usar este método, solo proporciono un caso para la discusión. Y satisface los requisitos de la pregunta para validar correctamente y no realizar solicitudes adicionales.
tenkod
8

Utilice un SVG realmente en blanco, válido y altamente compatible, basado en este artículo :

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

Su tamaño predeterminado será de 300x150px como lo hace cualquier SVG, pero puede trabajar con eso en los imgestilos predeterminados de su elemento, como posiblemente necesitaría en cualquier caso en la implementación práctica.

mystrdat
fuente
Gracias por actualizar su respuesta, pero sospecho que la compatibilidad es aún peor para esto, que la otra solución de uri de datos, dado que usa svg que no era compatible hasta IE9. Afortunadamente, ha pasado un tiempo desde que tuve que soportar IE heredado, pero todavía es relevante para algunas personas.
funkylaundry
¿Pero esto no sufre los mismos problemas que en este artículo? dev.mobify.com/blog/data-uris-are-slow-on-mobile . Estoy pensando que la opción <img src = "about: blank"> con css img [src = "about: blank"] {opacity: 0} es la mejor. O, si ese nivel de selector CSS no es compatible con navegadores más antiguos, simplemente asigne a la etiqueta img una clase como "cargar", o algo así. Mejor aún, dele la clase, use JavaScript para intercambiar el data-src, y luego configure una función de carga en la imagen para que se desvanezca con la carga. También puede configurar una flecha giratoria para que se muestre mientras se carga. Se ve muy profesional.
Jordan Carter
@JordanCarter Claro, si el rendimiento detallado es una preocupación. Como nota al margen, diría que visibility: hiddenes un poco más adecuado que opacity: 0para los selectores de atributos que está sugiriendo.
mystrdat
6

Partiendo de la respuesta de Ben Blank, la única forma en que obtuve esto para validar en el validador w3 fue así:

<img src="/./.:0" alt="">`
John Duncan
fuente
Valida, pero da como resultado una imagen rota en Firefox, incluso con un altatributo vacío .
James Wright
4

Personalmente uso about:blank srcy trato con el icono de imagen rota configurando la opacidad del imgelemento en 0.

Miguel
fuente
77
¡Ahora eso está sucio!
mystrdat
@mystrdat: ¿Te importa elaborar por qué está sucio? La respuesta aceptada, usando "//: 0" todavía me dio el icono de imagen rota más una extraña solicitud interminable en Firefox. La alternativa png de un solo píxel base64, también con muchos votos, me dio problemas al usar el <img> como marcador de posición, con y sin especificar la altura y el ancho. Esta es la forma más limpia que encontré para lograr mi objetivo sin solicitudes innecesarias y pasando todas las listas y validaciones.
Miguel
Todas las soluciones anteriores son muy tontas, la aceptada incluida, haré una nueva respuesta una vez que tenga más tiempo.
mystrdat
@mystrdat: ¿Todavía estaría feliz de saber lo que tienes que decir sobre esto?
funkylaundry
1
@funkylaundry Pido disculpas por hacer grandes reclamos y desaparecer, publiqué mi respuesta ahora. También admito que no he notado las otras soluciones de URI de datos antes, con lo que sí estoy de acuerdo, pero creo que la mía es superior en la sintaxis de todos modos.
mystrdat
4
<img src="invis.gif" />

Donde invis.gif es un gif transparente de un solo píxel. Esto no se romperá en futuras versiones del navegador y ha estado funcionando en navegadores heredados desde los años 90.

png también debería funcionar, pero en mis pruebas, el gif tenía 43 bytes y el png tenía 167 bytes, por lo que ganó el gif.

ps no olvides una etiqueta alt, a los validadores también les gustan.

franki
fuente
-1

Simplemente, así:

<img id="give_me_src"/>
anmml
fuente
44
No es una buena idea según las especificaciones : el atributo src debe estar presente y debe contener una URL válida ...
Michael Litvin
1
Tal vez funcione bien en cromo, pero SE generan errores en html validación y que no es un HTML válido W3 ...
EhsanT