问题描述

如何隐藏破碎的图像图标?例:

我有一个错误 src 的图像:

<img src="Error.src"/>

该解决方案必须适用于所有浏览器。

只使用 CSS 或 HTML,而不是 JS 。

最佳解决方案

CSS /HTML 无法知道图像是否断开链接,所以您将不得不使用 JavaScript

但是这里是隐藏图像或用备份替换源的最小方法。

<img src="Error.src" onerror="this.style.display='none'"/>

要么

<img src="Error.src" onerror="this.src='fallback-img.jpg'"/>

Update

您可以通过执行以下操作一次将此逻辑应用于多个图像:



document.addEventListener("DOMContentLoaded", function(event) {
   document.querySelectorAll('img').forEach(function(img){
  	img.onerror = function(){this.style.display='none';};
   })
});
<img src="error.src">
<img src="error.src">
<img src="error.src">
<img src="error.src">

更新 2

对于 CSS 选项,请参阅下面的 michalzuber’s answer 。您无法隐藏整个图像,但您可以更改破损图标的外观。

次佳解决方案

尽管人们在说这里,你根本不需要 JavaScript,甚至不需要 CSS!

它实际上是非常可行和简单的仅 HTML 。如果图像未加载,您甚至可以显示默认图像。就是这样…

这也适用于所有浏览器,甚至远远超过 IE8(在 2015 年 9 月份托管的网站的 25 万以上的访问者中,ZERO 人使用的东西比 IE8 差,意味着此解决方案适用于所有内容) 。

步骤 1:将图像引用为对象而不是 img 。当对象失败时,它们不会显示破损的图标; 他们什么都不做。从 IE8 开始,可以互换使用 Object 和 Img 标签。你可以调整大小并做所有光荣的东西,你可以与常规的图像。不要怕对象标签; 它只是一个标签,没有什么大和笨重的加载,它不会减慢任何东西。您只需使用另一个名称的 img 标签。速度测试显示它们的使用相同。

步骤 2 :(可选,但很棒) 在该对象内粘贴默认图像。如果要在对象中实际加载的图像,则默认图像将不显示。所以例如,您可以显示一个用户头像的列表,如果有人在服务器上没有图像,它可以显示占位符图像… 根本不需要 JavaScript 或 CSS,但是您获得了什么的功能需要大多数人的 JavaScript 。

这是代码…

<object data="avatar.jpg" type="image/jpg">
    <img src="default.jpg" />
</object>

是的,很简单

如果你想用 CSS 实现默认图像,你可以使它更简单的 HTML 像这样…

<object class="avatar" data="user21.jpg" type="image/jpg"></object>

… 而且只需从这个答案中添加 CSS – > https://stackoverflow.com/a/32928240/3196360

第三种解决方案

https://bitsofco.de/styling-broken-images/找到了一个很好的解决方案



img {
  position: relative;
}

/* style this to fit your needs */
/* and remove [alt] to apply to all images*/
img[alt]:after {
  display: block;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #fff;
  font-family: 'Helvetica';
  font-weight: 300;
  line-height: 2;
  text-align: center;
  content: attr(alt);
}
<img src="error">
<br>
<img src="broken" alt="A broken image">
<br>
<img src="https://images-na.ssl-images-amazon.com/images/I/218eLEn0fuL.png" alt="A bird" style="width: 120px">

第四种方案

仅使用 CSS 很困难,但您可以使用 CSS 的 background-image 而不是<img> 标签…

这样的事情

HTML

<div id="image"></div>

CSS

#image {
    background-image: url(Error.src);
    width: //width of image;
    height: //height of image;

}

这是一个工作小提琴:http://jsfiddle.net/xbK6g/

注意:我在框中的 CSS 中添加了边框,以显示图像的位置。

第五种方案

我喜欢 Nickanswer,并且正在玩这个解决方案。找到一个更干净的方法。因为:: before /:: 之后的 pseudoos 不能在替换元素 (如 img 和 object) 上工作,所以它们只有在没有加载对象数据 (src) 的情况下才会工作。它保持 HTML 更干净,只有在对象无法加载时才添加伪。

http://codepen.io/anon/pen/xwqJKQ

<object data="http://lorempixel.com/200/200/people/1" type="image/png"></object>

<object data="http://broken.img/url" type="image/png"></object>

object {
  position: relative;
  float: left;
  display: block;
  width: 200px;
  height: 200px;
  margin-right: 20px;
  border: 1px solid black;

  &::after {
    position: absolute;
    top: 0;
    left: 0;
    display: block;
    width: 100%;
    height: 100%;
    content: '';
    background: red url('http://placehold.it/200x200');
  }
}

第六种方案

我认为最简单的方法是隐藏 text-indent 属性破损的图像图标。

img {
    text-indent: -10000px
}

如果您想要查看”alt” 属性,那么它是不行的。

第七种方案

如果您仍然需要使图像容器可见,因为它稍后会被填写,并且不想打扰显示和隐藏它,您可以在 src 中粘贴 1×1 透明图像:

<img id="active-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"/>

我用这个确切的目的。我有一个图像容器,它将通过 Ajax 加载图像。因为图像很大,需要加载,所以需要在 Gif 加载栏的 CSS 中设置一个 background-image 。

然而,因为 src 是空的,故障图像图标仍然出现在使用它的浏览器中。

设置透明 1×1 Gif 可以简单有效地修复此问题,无需通过 CSS 或 JavaScript 添加代码。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛