問題描述

如何隱藏破碎的圖像圖標?例:

我有一個錯誤 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇