包含没有src的图像的有效方法是什么?


234

我有一个图片,稍后会使用javascript用src动态填充,但是为了简便起见,我希望image标记在页面加载时存在,但不显示任何内容。我知道这<img src='' />是无效的,那么最好的方法是什么?


4
这是一个相对较老的问题,但是值得考虑的是,没有src的映像本质上是没有意义的,这就是为什么规范说明该映像必须首先具有指向某些嵌入式资源的src的原因。如果您正在考虑有效性和/或语义,则最好完全省略图像并在事后添加图像,因为HTML不能提供一种指定以后将填充数据的占位符图像的方法,因此更好地为您服务。
BoltClock

1
在使用Mika Tuupola的延迟加载jQuery插件时,它使用标记'<img class =“ lazy” data-original =“ img / example.jpg” width =“ 640” height =“ 480”>',因此从某种意义上讲,您需要指向一个源,但是不必使用src属性来完成。
iWillGetBetter

您可以使用div元素代替它,请参阅此=> stackoverflow.com/a/5513934/1395101
Amin Ghaderi,2018年

Answers:


237

虽然没有有效的方法来忽略图像的来源,但是有些来源不会导致服务器命中。我最近与iframes 遇到了类似的问题,并决定//:0将其作为最佳选择。不完全是!

从开始//(省略协议)开始,将使用当前页面的协议,从而防止HTTPS页面中出现“内容不安全”警告。无需跳过主机名,但可以使其更短。最后,端口:0确保不能发出服务器请求(根据规范,它不是有效的端口)。

这是我发现的唯一URL,在任何浏览器中均未引起服务器故障或错误消息。javascript:void(0)如果在通过HTTPS服务的页面上使用,通常的选择- 将在IE7中引起“内容不安全”警告。任何其他端口都导致尝试建立服务器连接,即使是无效地址也是如此。(某些浏览器会简单地发出无效请求,并等待它们超时。)

这已经在Chrome,Safari 5,FF 3.6和IE 6/7/8中进行了测试,但是我希望它可以在任何浏览器中使用,因为它应该是杀死任何尝试请求的网络层。


16
例如,此答案可能会使您的防火墙警告您有关访问端口0的信息。否则可能会导致服务器安全日志。建议答案about:blank可能是一个更好的解决方案。
Florian Margaine 2013年

10
这会导致显示破碎的图像图标。还有其他人看到吗?我正在使用最新的Firefox(27)。
dmikester1 2014年

10
这也会使w3c验证程序失败:元素img上的属性src的错误值//:0:无效的主机:空主机。
ysrb 2014年

这不起作用:我有一个ASP.NET MVC 4应用程序,其中包含一个名为clearing的图像插件。该插件动态创建图像,并将//://放置在src中,直到实际获取图像为止。这使我的家庭控制器的索引动作被调用了两次。所以要当心。
jpgrassi 2014年

2
在Firefox 38中,此方法触发图像的onerror处理程序。
内特·惠特克

221

另一种选择是嵌入空白图像。任何适合您目的的图像都可以,但是以下示例对GIF进行了编码,该GIF仅26个字节-来自http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever

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

根据以下评论进行编辑:

当然,您必须考虑您的浏览器支持要求。值得注意的是,不支持IE7或更低版​​本。http://caniuse.com/datauri


14
好想法!但是对我而言,这会杀死图像元素-如果有人需要该img元素的其他方面来显示背景和边框,请尝试src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="使用1px x 1px透明gif进行拍摄,我是由Photoshop通过base64-image.de推送的
user56reinstatemonica8

4
您可能需要三思而后行,使用数据URI内联资源:mobify.com/blog/data-uris-are-slow-on-mobile
shawnjan 2013年

1
该选项的可行性取决于您必须支持的浏览器:caniuse.com/datauri
Jeff Clemens

6
这是一个透明的1像素PNG:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=
Keavon 2014年

2
对我data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
Vikram Rao

34

如今,恕我直言,对于空img src来说,最好的简短,理智和有效的方法是这样的:

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

第二个示例显示“替代文本”(以及Chrome和IE中的破损图像图标)。

"data:,"是有效的URI。空的媒体类型默认为text/plain。因此它代表一个空的文本文件,等效于"data:text/plain,"


OT:所有浏览器都能理解alt。您可以忽略="",每个HTML规范都隐含了它。


1
W3C验证程序检查没有HTML错误。没有不必要的请求。👍似乎是这样做的有效方法。
凯诺克

最好!还有一件事,如果您想让它在srcset中进行验证,请使用srcset="data:,x"
Lucian Davidescu,

18

我建议动态添加元素,如果使用jQuery或其他JavaScript库,则非常简单:

还看prependappend。否则,如果您具有这样的图像标签,并且想要对其进行验证,则可以考虑使用虚拟图像,例如1px透明gif或png。


7
+1这是最好的答案。如果无论如何都要动态设置图像源,则应动态添加整个元素。如果您不希望在设置src之前看到它,那么我想不出为什么在此之前该元素应该存在的任何很好的理由。
2014年

15

我已经有一段时间没有这样做了,但是我不得不经历一次同样的事情。

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

我的最爱- //:0一个暗示您将尝试在零端口(tcpmux端口?)上建立到原始服务器的HTTP / HTTPS连接-可能无害,但我还是不愿意这样做。哎呀,浏览器可能看到端口零,甚至没有发送请求。但是,我仍然宁愿不以这种方式指定它,因为那可能不是您的意思。

无论如何,在about:blank我测试过的所有浏览器中,渲染的速度实际上都非常快。我只是将它扔到W3C验证器中,它并没有抱怨,所以它甚至可能是有效的。

编辑:不要那样做;并非在所有浏览器上都起作用(它会显示“残破的图像”图标,如该答案的注释中所指出)。使用<img src='data:...下面的解决方案。或者,如果您不关心有效性,但仍然希望避免对服务器的多余请求,则可以不<img alt="" />使用src属性。但这是无效的 HTML,因此请谨慎选择。

测试页显示了许多不同的方法:http : //desk.nu/blank_image.php-提供各种不同的doctype和content-types。-如以下评论中所述,请使用Mark Ormston的新测试页,网址为:http ://memso.com/Test/BlankImage.html


这似乎比让网络层发布错误更干净。
DenysSéguret13年

至少您确定愚蠢的防火墙不会要求允许呼叫端口0 ...
DenysSéguret2013年

1
值得一提的是,这会在Chrome(可能还有其他浏览器)上显示“残破的图像”图标
user56reinstatemonica8 2013年

1
它比我想象的还要糟糕-即使使用html5 doctype,它似乎也无法在Safari或Chrome中运行。我有一个测试页面,可以绕过页面的Content-type和Doctype,到目前为止,我最喜欢的是:<img />- 没有 src属性的图像标签。这是不是有效的(所以没有点把在那里空ALT标记,要么)。我将继续使用它,并将相应地更新我的答案(或删除它)。
2013年

2
我带了您的测试页并对其进行了更新,因此当图像无法正常工作时,它会更加明显。包含旧的空白图片作为“始终有效”示例,以及对所看到内容的简要描述:memso.com/Test/BlankImage.html 这使我认识到,有效的空白数据gif是唯一可重复使用的用于现代浏览器的选项,而不是旧的空白gif图像(旧的IE7及更低版本仍需要)
Mark Ormston 2014年

12

如评论中所写,此方法是错误的。

我之前没有找到这个答案,但是根据W3 Specs有效的空src标记将是一个锚链接#

范例:src="#"src="#empty"

页面验证成功,没有额外的请求。


1
是否有反对这种方法的论点?跨浏览器如何?
tremby

18
使用这种方法时,我已经看到Firefox和Chrome都提出了第二个请求,所以我不建议这样做。
Marius

5
Firefox,Chrome发出第二个请求,甚至JMeter解析了img src,这也会导致递归页面加载(直到达到最大深度)
burna 2015年

1
在FF您必须两次,如果你想叶页面击中浏览器后退按钮,因为URL神秘变化..
Kalaschni

3
这是完全错误的。任何碰巧阅读评论的人-请勿使用
影子巫师为您而耳

11

我发现只需将src设置为空字符串并向CSS添加规则以隐藏损坏的图像图标即可正常工作。

[src=''] {
    visibility: hidden;
}

[ng-src =''] {可见性:隐藏;}如果您在angularjs中使用ng-src指令
Ivan Paredes

1
请注意,必须将src设置为'',并且不能未定义。
文森特·霍克·德雷

如果我没记错的话,仍然会执行请求
Nico

9

如果您保留src属性为空,浏览器将向当前页面网址发送请求,如果不需要任何网址,请始终在src属性中添加1 * 1透明img

src="data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAA="

1
在某些浏览器中,它将显示为黑点。
tomasz86


1
这SRC data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==工作虽然
马克斯亚里

9

我发现使用:

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

不会发出请求并正确验证。

浏览器将简单地阻止对本地文件系统的访问。

但是在Chrome的控制台日志中可能会显示错误,例如:

Not allowed to load local resource: file://null/

2
关心解释下降投票吗?请注意,我不建议仅使用这种方法进行讨论。而且它满足了问题的要求,可以正确验证并且不提出其他要求。
tenkod

8

根据本文,使用真正空白,有效和高度兼容的SVG :

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

与任何SVG一样,它的大小默认为300x150px,但是您可以在img元素默认样式中使用它,因为在实际实现中无论如何都需要。


感谢您更新答案,但是我怀疑兼容性比其他data-uri解决方案还要差,因为您使用的是直到IE9才兼容的svg。幸运的是,自从我不得不支持旧版IE以来已经有一段时间了,但是它仍然与某些人相关。
funkylaundry

但这难道没有遇到与本文相同的问题吗?dev.mobify.com/blog/data-uris-are-slow-on-mobile。我认为CSS img [src =“ about:blank”] {opacity:0}的<img src =“ about:blank”>选项是最好的。或者,如果较旧的浏览器不支持该级别的CSS选择器,则只需为img标签提供一个诸如“ load-in”之类的类。更好的是,给它一个类,使用JavaScript交换data-src,然后为图像设置加载函数以使其在加载时淡入。您还可以设置微调器在加载时显示。看起来真的很专业。
约旦·卡特

@JordanCarter当然,如果需要详细的表现。附带一提,我想说的visibility: hidden是比opacity: 0您建议的属性选择器更合适。
mystrdat

6

基于Ben Blank的答案,我在w3验证器中进行验证的唯一方法是:

<img src="/./.:0" alt="">`

它可以验证,但即使alt属性为空,它也会在Firefox中导致图像损坏。
詹姆斯·赖特

4

我个人使用about:blank src,通过将img元素的不透明度设置为来处理损坏的图像图标0


7
现在很脏!
mystrdat 2014年

@mystrdat:想详细说明为什么它很脏?接受的答案使用“ //:0”仍然给了我残破的图像图标,以及一个关于Firefox的永无休止的奇怪请求。使用<img>作为占位符时,无论是否指定高度和宽度,单一像素的base64 png替代方案也获得了很多选票,这给我带来麻烦。这是我发现自己的目标的最干净的方法,它没有任何不必要的请求,并且通过了所有的linter和验证。
Miguel 2015年

上述所有解决方案都非常愚蠢,只接受其中一种,一旦获得更多时间,我将做出新的答复。
mystrdat 2015年

@mystrdat:我仍然很高兴得知您对此有何评论?
funkylaundry's

1
@funkylaundry我很抱歉提出了很多要求并消失了,现在发布我的答案。我也承认我之前没有注意到其他Data URI解决方案,但我确实同意,但是我确实相信我的语法在任何方面都比较出色。
mystrdat '16

4
<img src="invis.gif" />

其中invis.gif是单个像素的透明gif。自90年代以来,这不会在未来的浏览器版本中中断,并且已在旧版浏览器中运行。

png也应该工作,但是在我的测试中,gif为43字节,而png为167字节,因此gif胜出了。

ps不要忘记alt标签,验证器也喜欢它们。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.