Làm cách nào để ẩn Biểu tượng bị hỏng Biểu tượng chỉ sử dụng CSS / HTML?


193

Làm thế nào tôi có thể ẩn biểu tượng hình ảnh bị hỏng? Ví dụ : Thí dụ

Tôi có một hình ảnh với lỗi src:

<img src="Error.src"/>

Giải pháp phải hoạt động trong tất cả các trình duyệt.


1
Tôi đã cố gắng đặt alt = "" và đặt thành img teg nền ném CSS trực tiếp: {nền: url (src), width: ...; chiều cao: ..} nhưng nó không đúng Thẻ img của tôi phải ẩn sau đó src bị hỏng.
Geray Suinov

Xem một giải pháp khả thi tại đây - stackoverflow.com/questions/18484753/ dù nhưng cần JS. Bạn không thể làm điều này với CSS một mình.
JohanVdR

Xem w3schools.com/jsref/event_onerror.asp thuộc tính "onerror"
Amy.js

Câu trả lời:


273

CSS / HTML không có cách nào để biết hình ảnh có bị hỏng liên kết hay không, vì vậy bạn sẽ phải sử dụng JavaScript cho dù thế nào đi nữa

Nhưng đây là một phương pháp tối thiểu để ẩn hình ảnh hoặc thay thế nguồn bằng bản sao lưu.

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

hoặc là

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

Cập nhật

Bạn có thể áp dụng logic này cho nhiều hình ảnh cùng một lúc bằng cách làm như thế này:

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">

Cập nhật 2

Để biết tùy chọn CSS, hãy xem câu trả lời của michalzub bên dưới. Bạn không thể ẩn toàn bộ hình ảnh, nhưng bạn thay đổi giao diện của biểu tượng bị hỏng.


3
Bạn chỉ có thể làm điều đó với HTML bằng cách sử dụng thẻ đối tượng vì nó có thể được sử dụng để hiển thị hình ảnh giống như thẻ img và không hiển thị một liên kết bị hỏng nếu hình ảnh không tồn tại, nó hoạt động trong tất cả các trình duyệt và ngược lại Như IE8, bạn thậm chí có thể sử dụng hình ảnh mặc định với phương pháp này, tôi đã đăng một câu trả lời với chi tiết bên dưới.
Nick Steele

1
Điều này làm việc cho tôi thay vì cách tiếp cận <object> vì tôi cần hình ảnh có lề được khai báo, nhưng chỉ khi tìm thấy hình ảnh hợp lệ, nếu không tôi cần nó để chiếm không gian. <object> không có sự kiện onerror, vì vậy đó không phải là một lựa chọn ở đó. Một quy tắc kiểu để loại bỏ lề, sử dụng một lớp giả: trống, không bao giờ được kích hoạt trên đối tượng.
John Hatton

Tôi có một câu hỏi. có cách nào để cung cấp tập lệnh chung để áp dụng cho mọi thẻ hình ảnh trên trang thay vì đưa ra dòng kịch bản cụ thể này trong mỗi thẻ hình ảnh. cảm ơn bạn @Kevin jantzer
Lemdor

1
@Lemdor - vâng, bạn sẽ cần tìm hình ảnh khi tải và gắn chức năng chung cho từng cái. Bạn có thể sử dụng jQuery hoặc vanilla JS để thực hiện điều này (Tôi đã cập nhật câu trả lời của mình bằng một ví dụ)
Kevin Jantzer

Trong ReacJs rất dễ dàng để làm điều đó, nguyên tắc tương tự được áp dụng ở đó. Tìm thấy hướng dẫn này ở đây - youtu.be/90P1_xCaim4 . Đồng thời thêm trình tải trước ( youtu.be/GBHBjv6xfY4 ) cho hình ảnh che giấu quá trình chuyển đổi và giúp cung cấp UX tốt.
Prem

143

Bất chấp những gì mọi người đang nói ở đây, bạn hoàn toàn không cần JavaScript, thậm chí bạn không cần CSS !!

Nó thực sự rất khả thi và đơn giản chỉ với HTML. Bạn thậm chí có thể hiển thị một hình ảnh mặc định nếu một hình ảnh không tải . Đây là cách ...

Điều này cũng hoạt động trên tất cả các trình duyệt, thậm chí từ IE8 (trong số hơn 250.000 khách truy cập vào các trang web tôi lưu trữ vào tháng 9 năm 2015, người ZERO đã sử dụng một cái gì đó tồi tệ hơn IE8, có nghĩa là giải pháp này hoạt động cho mọi thứ theo nghĩa đen ).

Bước 1: Tham chiếu hình ảnh dưới dạng đối tượng thay vì img . Khi các đối tượng thất bại, chúng không hiển thị các biểu tượng bị hỏng; họ không làm gì cả Bắt đầu với IE8, bạn có thể sử dụng các thẻ Object và Img thay thế cho nhau. Bạn có thể thay đổi kích thước và làm tất cả những thứ tuyệt vời bạn có thể với hình ảnh thông thường. Đừng sợ thẻ đối tượng; nó chỉ là một thẻ, không có gì to lớn và cồng kềnh được tải và nó không làm chậm bất cứ điều gì. Bạn sẽ chỉ sử dụng thẻ img theo tên khác. Một bài kiểm tra tốc độ cho thấy chúng được sử dụng giống hệt nhau.

Bước 2: (Tùy chọn, nhưng tuyệt vời) Dán hình ảnh mặc định bên trong đối tượng đó. Nếu hình ảnh bạn muốn thực sự tải trong đối tượng , hình ảnh mặc định sẽ không hiển thị. Vì vậy, ví dụ bạn có thể hiển thị danh sách hình đại diện người dùng và nếu ai đó chưa có hình ảnh trên máy chủ, nó có thể hiển thị hình ảnh giữ chỗ ... không yêu cầu javascript hoặc CSS, nhưng bạn có được các tính năng của những gì mất hầu hết mọi người JavaScript.

Đây là mã ...

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

... Vâng, nó đơn giản.

Nếu bạn muốn triển khai hình ảnh mặc định bằng CSS, bạn có thể làm cho nó đơn giản hơn trong HTML của mình như thế này ...

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

... và chỉ cần thêm CSS từ câu trả lời này -> https://stackoverflow.com/a/32928240/3196360


6
Bằng cách nào đó tôi đã hoàn toàn bỏ lỡ ý tưởng này, khi nó quá rõ ràng khi nhìn lại! Thật không may, tôi không nghĩ thẻ đối tượng có thể xử lý một cách duyên dáng các hình ảnh phản hồi như chúng ta bắt đầu thấy trên thuộc tính img.srcset :(
Windgazer

2
Ý tưởng tuyệt vời, cảm ơn bạn vì điều đó! Bên cạnh đó, thẻ đối tượng đang chặn bánh xe cuộn (ít nhất là trong triển khai của tôi) ... nếu điều này xảy ra với bạn, chỉ cần sử dụng object { pointer-events: none; }trong CSS của bạn (Nguồn: stackoverflow.com/a/16534300 )
DHainzl

4
Điều này không phá vỡ ngữ nghĩa của thẻ hình ảnh, mặc dù. Tôi không biết liệu công cụ tìm kiếm có thích bạn sử dụng <object>thẻ thay vì <img>thẻ không. Cách tiếp cận này có tuân thủ HTML5 và được hiển thị chính xác bởi tất cả các trình duyệt chính không?
Pieter

6
Đây là tuân thủ HTML4 (tuân thủ từ năm 1997) và được hiển thị chính xác bởi tất cả các trình duyệt chính kể từ IE8 / 2009 (các trình duyệt khác đã làm điều đó nhiều, sớm hơn nhiều). Nếu một công cụ tìm kiếm không hiểu một vật thể có loại hình ảnh là một hình ảnh, thì đã có 19 năm để bắt kịp thông số kỹ thuật, vì vậy nó có thể không phải là một công cụ rất tốt ... Thanh thiếu niên đang lái xe ô tô bây giờ không thậm chí được hình thành khi giải pháp này đáp ứng thông số kỹ thuật ... Bạn muốn đi bao xa? :) Đây là một giải pháp vững chắc.
Nick Steele

6
@MonsterMMORPG vì nó không sử dụng JavaScript và bạn không được phép (ví dụ như trong phần thân của một email).
ForNeVeR

63

Tìm thấy một giải pháp tuyệt vời tại https://bitsofco.de/stomme-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">


1
Giải pháp tuyệt vời hoàn toàn sử dụng CSS nên là câu trả lời được chấp nhận. Bài viết được liên kết đến đã lỗi thời, vì hiện tại hỗ trợ trình duyệt là 97,87%: caniuse.com/#feat=css-gencontent .
holm50

1
Các bài viết liên quan có một lời giải thích tuyệt vời về cách trình duyệt xử lý hình ảnh, nhưng hãy nhớ rằng giải pháp này chỉ hoạt động nếu bạn có một nền tảng vững chắc và bạn muốn che tất cả mọi thứ với một hộp màu rắn giống nhau, hoặc với hình ảnh khác. Giải pháp này không thực sự loại bỏ hoặc ẩn biểu tượng hình ảnh bị hỏng, nó chỉ che nó.
Claudio Floreani

3
Trên Chrome 70, nó hiển thị con chim + biểu tượng hình ảnh bị hỏng :(
Simon Arnold

2
^ Tương tự trên Firefox 63
dailysleaze

1
@dailysleaze - Trên Firefox 64+, điều này đã chuyển sang img[alt]::before. Bạn có thể sử dụng display:inline-blocknếu bạn thích, vì nó gần với bản gốc hơn.
Adam Katz

40

Nếu bạn sẽ thêm alt với văn bản alt = "abc", nó sẽ hiển thị hình thu nhỏ bị hỏng và thông báo alt abc

<img src="pic_trulli.jpg" alt="abc"/>

1

Nếu bạn không thêm alt, nó sẽ hiển thị hình thu nhỏ bị hỏng

<img src="pic_trulli.jpg"/>

lần 2

Nếu bạn muốn ẩn cái bị hỏng, chỉ cần thêm alt = "" nó sẽ không hiển thị hình thu nhỏ bị hỏng và bất kỳ thông báo alt nào (không sử dụng js)

<img src="pic_trulli.jpg" alt=""/>

Nếu bạn muốn ẩn cái bị hỏng, chỉ cần thêm alt = "" & onerror = "this.style.display = 'none'", nó sẽ không hiển thị hình thu nhỏ bị hỏng và bất kỳ thông báo alt nào (với js)

<img src="pic_trulli.jpg" alt="abc" onerror="this.style.display='none'"/>

Cái thứ 4 hơi nguy hiểm (không chính xác), nếu bạn muốn thêm bất kỳ hình ảnh nào trong sự kiện onerror, nó sẽ không hiển thị ngay cả khi Image tồn tại dưới dạng style.display giống như thêm. Vì vậy, sử dụng nó khi bạn không yêu cầu bất kỳ hình ảnh thay thế nào để hiển thị.

display: 'none'; // in css

Nếu chúng tôi cung cấp nó trong CSS, thì mục đó sẽ không hiển thị (như hình ảnh, iframe, div như thế).

Nếu bạn muốn hiển thị hình ảnh & bạn muốn hiển thị không gian trống hoàn toàn nếu có lỗi, thì bạn có thể sử dụng, nhưng hãy cẩn thận, điều này sẽ không chiếm bất kỳ khoảng trống nào. Vì vậy, bạn cần giữ nó trong một div có thể

Liên kết https://jsfiddle.net/02d9yshw/


2
ĐÚNG! Chỉ cần thêm alt=""! Đó là nghĩa đen của nó! Cảm ơn bạn. Rất vui vì tôi đã cuộn xuống cuối trang. Tôi đang sử dụng tải lười biếng và các hình ảnh trong khung chưa được tải (vì trình duyệt nhầm tưởng rằng chế độ xem chưa cuộn đến chúng) hiển thị dưới dạng hình ảnh bị hỏng. Một cuộn nhỏ, và chúng xuất hiện trở lại. Mặc dù vậy, những hình ảnh bị hỏng ở vị trí của chúng rất xấu xí
velkoon

25

Tôi nghĩ cách dễ nhất là ẩn biểu tượng hình ảnh bị hỏng bởi thuộc tính văn bản thụt lề.

img {
    text-indent: -10000px
}

Rõ ràng là nó không hoạt động nếu bạn muốn xem thuộc tính "alt".


1
Cách dễ nhất.
theerasan tonthongkam

16

Tôi thích câu trả lời của Nick và đã chơi xung quanh với giải pháp này. Tìm thấy một phương pháp sạch hơn. Vì :: trước / :: sau khi giả không hoạt động trên các phần tử được thay thế như img và đối tượng, chúng sẽ chỉ hoạt động nếu dữ liệu đối tượng (src) không được tải. Nó giữ cho HTML sạch hơn và sẽ chỉ thêm giả nếu đối tượng không tải.

object {
  position: relative;
  float: left;
  display: block;
  width: 200px;
  height: 200px;
  margin-right: 20px;
  border: 1px solid black;
}
object::after {
  position: absolute;
  top: 0;
  left: 0;
  display: block;
  width: 100%;
  height: 100%;
  content: '';
  background: red url("http://placehold.it/200x200");
}
<object data="http://lorempixel.com/200/200/people/1" type="image/png"></object>

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


16

trong trường hợp bạn muốn giữ / cần hình ảnh như một trình giữ chỗ, bạn có thể thay đổi độ mờ thành 0 bằng một trình khởi chạy và một số CSS để đặt kích thước hình ảnh. Bằng cách này, bạn sẽ không thấy liên kết bị hỏng, nhưng trang tải như bình thường.

<img src="<your-image-link->" onerror="this.style.opacity='0'" />

img {
    width: 75px;
    height: 100px;
}

9

Nếu bạn vẫn cần để hộp chứa hình ảnh hiển thị do nó được điền vào sau này và không muốn làm phiền với việc hiển thị và ẩn nó, bạn có thể dán hình ảnh trong suốt 1x1 bên trong src:

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

Tôi đã sử dụng điều này cho mục đích chính xác này. Tôi đã có một thùng chứa hình ảnh sẽ có một hình ảnh được tải vào nó thông qua Ajax. Vì hình ảnh lớn và mất một chút để tải, nên nó yêu cầu thiết lập hình nền trong CSS của thanh tải Gif.

Tuy nhiên, vì src của trống, biểu tượng hình ảnh bị hỏng vẫn xuất hiện trong các trình duyệt sử dụng nó.

Đặt Gif 1x1 trong suốt khắc phục sự cố này một cách đơn giản và hiệu quả mà không cần thêm mã thông qua CSS hoặc JavaScript.


câu trả lời duy nhất có hiệu quả với tất cả những người khác để lại một phác thảo màu trắng
futurelucas4502

8

Chỉ sử dụng CSS là khó, nhưng bạn có thể sử dụng CSS background-imagethay vì<img> thẻ ...

Một cái gì đó như thế này:

HTML

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

CSS

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

}

Đây là một fiddle làm việc .

Lưu ý: Tôi đã thêm đường viền trong CSS trên fiddle chỉ để chứng minh hình ảnh sẽ ở đâu.


Thật tốt, nhưng giải pháp này không dành cho tôi :) Thẻ img bị ẩn sau đó src bị hỏng, div - không :(
Geray Suinov

@GeraySuinov Sau đó, bạn có thể phải sử dụng Javascript
Dryden Long


3

Từ năm 2005 , các trình duyệt Mozilla như Firefox đã hỗ trợ :-moz-brokenlớp giả CSS không chuẩn có thể thực hiện chính xác yêu cầu này:

td {
  min-width:64px; /* for display purposes so you can see the empty cell */
}

img[alt]:-moz-broken {
  display:none;
}
<table border="1"><tr><td>
  <img src="error">
</td><td>
  <img src="broken" alt="A broken image">
</td><td>
  <img src="https://images-na.ssl-images-amazon.com/images/I/218eLEn0fuL.png"
       alt="A bird" style="width: 120px">
</td></tr></table>

img[alt]::beforecũng hoạt động trong Firefox 64 (mặc dù đã có một thời gian img[alt]::afternên điều này không đáng tin cậy). Tôi không thể khiến một trong hai người đó hoạt động trong Chrome 71.


Thật thú vị ... bạn có biết Chrome có lớp giả tương tự không?
1000Gbps

1
@ 1000Gbps - Tôi không thể tìm thấy câu trả lời khi tôi đưa ra câu trả lời đó và không thể tìm thấy ngay bây giờ, ít nhất là với các truy vấn web nhanh và bằng cách xem xét lỗi mozilla 11011 . Bạn thực sự có thể yêu cầu một thứ như vậy trong Chromium (thượng nguồn cho Chrome) nếu bạn muốn, nhưng vì nó không đạt tiêu chuẩn, nên không có gì đảm bảo họ sẽ làm điều đó.
Adam Katz

Tôi rất nghi ngờ họ sẽ làm điều đó trong thời gian ngắn, xem xét rằng họ đã gặp khó khăn khi xử lý một số lỗi khó chịu mà tôi đã báo cáo ở đó ... Bất kể thực tế là các lớp giả được tích hợp như thế này sẽ loại bỏ khỏi khung rất nhiều mã JS được viết cho cùng một lý do
1000Gbps

2

Bạn có thể đi theo con đường này như một giải pháp css

img {
        width:200px;
        height:200px;
        position:relative
   }
img:after {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        width: inherit;
        height: inherit;
        background: #ebebeb url('http://via.placeholder.com/300?text=PlaceHolder') no-repeat center;
        color: transparent;
    }
<img src="gdfgd.jpg">


Đầu tiên tôi đã nghĩ rằng đây là một giải pháp tốt nhưng nó không hoạt động trên IE. Cũng không phải khi thêm khối hiển thị vào sau css
Glenn Franquet

1

Thiếu hình ảnh sẽ không hiển thị gì hoặc hiển thị [? ] hộp kiểu khi nguồn của họ không thể được tìm thấy. Thay vào đó, bạn có thể muốn thay thế nó bằng một hình ảnh "thiếu hình ảnh" mà bạn chắc chắn tồn tại để có phản hồi trực quan tốt hơn rằng có gì đó không đúng. Hoặc, bạn có thể muốn ẩn nó hoàn toàn. Điều này là có thể, bởi vì những hình ảnh mà trình duyệt không thể phát hiện ra sự kiện JavaScript "lỗi" mà chúng ta có thể xem.

    //Replace source
    $('img').error(function(){
            $(this).attr('src', 'missing.png');
    });

   //Or, hide them
   $("img").error(function(){
           $(this).hide();
   });

Ngoài ra, bạn có thể muốn kích hoạt một số loại hành động Ajax để gửi email đến quản trị viên trang khi điều này xảy ra.


1

Thủ thuật với img::afterlà một công cụ tốt, nhưng có ít nhất 2 nhược điểm:

  1. không được hỗ trợ bởi tất cả các trình duyệt (ví dụ: không hoạt động trên Edge https://codepen.io/dsheiko/pen/VgYErm )
  2. bạn không thể ẩn hình ảnh một cách đơn giản, bạn che nó đi - vì vậy sẽ không hữu ích khi bạn hiển thị hình ảnh mặc định trong trường hợp nào

Tôi không biết một giải pháp phổ quát mà không có JavaScript, nhưng đối với Firefox chỉ có một giải pháp hay:

img:-moz-broken{
  opacity: 0;
}

-3

Một cách cơ bản và rất đơn giản để làm điều này mà không cần bất kỳ mã nào được yêu cầu là chỉ cung cấp một câu lệnh alt trống. Trình duyệt sau đó sẽ trả lại hình ảnh là trống. Nó sẽ trông giống như nếu hình ảnh không có ở đó.

Thí dụ:

<img class="img_gal" alt="" src="awesome.jpg">

Hãy thử nó để xem! ;)


10
Điều đó phụ thuộc vào trình duyệt. Trong Chrome, bạn vẫn sẽ có viền hình ảnh và biểu tượng hình ảnh bị hỏng ngoài văn bản thay thế (ở đây trống).
panzi

Nếu hình ảnh mang tính trang trí và không bắt buộc đối với nội dung thì một alt trống sẽ ổn. Trong thực tế, nó được khuyến khích không có alt nào cả. Mặt khác, điều này là rất khó tin. Một hình ảnh bị hỏng là một hình ảnh không thể nhìn thấy, nhưng nếu nó có thẻ alt thì ít nhất nó vẫn có thể được nghe thấy. Nếu bạn lấy đi thẻ alt, nó không thể được nhìn thấy HOẶC nghe thấy.
JP DeVries

2
@panzi Tôi đã thử nghiệm giải pháp và có vẻ như Chrome đã thay đổi hành vi của nó. Nó sẽ không hiển thị biểu tượng hình ảnh bị hỏng nếu alt="". Firefox cũng vậy.
Philipp Mitterer

-4

Đối với các nhân viên Google trong tương lai, năm 2016 có một trình duyệt CSS an toàn để ẩn hình ảnh trống bằng cách sử dụng bộ chọn thuộc tính:

img[src="Error.src"] {
    display: none;
}

Chỉnh sửa: Tôi đã trở lại - đối với những người làm việc trong tương lai, vào năm 2019, có một cách để định kiểu văn bản thay thế thực tế và hình ảnh văn bản thay thế trong Shadow Dom, nhưng nó chỉ hoạt động trong các công cụ dành cho nhà phát triển. Vì vậy, bạn không thể sử dụng nó. Lấy làm tiếc. Nó sẽ rất đẹp.

#alttext-container {
    opacity: 0;
}
#alttext-image {
    opacity: 0;
}
#alttext {
    opacity: 0;
}

1
img[src=''] { display: none; } Điều này trở nên có liên quan một lần nữa với các mẫu chỉ dành cho html của eBay
imos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.