Come nascondere l'icona rotta dall'immagine usando solo CSS / HTML?


194

Come posso nascondere l'icona dell'immagine rotta? Esempio : Esempio

Ho un'immagine con errore src:

<img src="Error.src"/>

La soluzione deve funzionare in tutti i browser.


1
Ho provato a impostare alt = "" e impostato su img teg background per lanciare CSS live: {background: url (src), larghezza: ...; altezza: ..} ma non è vero. Il mio tag img deve nascondere quindi src è rotto.
Geray Suinov,

Vedi una possibile soluzione qui - stackoverflow.com/questions/18484753/… ma necessita comunque di JS. Non puoi farlo solo con CSS.
JohanVdR,

Vedi l' attributo " onerror " di w3schools.com/jsref/event_onerror.asp
Amy.js

Risposte:


274

Non c'è modo per CSS / HTML di sapere se l'immagine è un link non funzionante, quindi dovrai usare JavaScript a prescindere

Ma ecco un metodo minimo per nascondere l'immagine o sostituire l'origine con un backup.

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

o

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

Aggiornare

Puoi applicare questa logica a più immagini contemporaneamente facendo una cosa del genere:

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

Aggiornamento 2

Per un'opzione CSS vedere la risposta di michalzuber di seguito. Non puoi nascondere l'intera immagine, ma cambi l'aspetto dell'icona rotta.


3
Puoi farlo con HTML solo usando il tag object poiché può essere usato per visualizzare immagini proprio come il tag img, e non mostra un link non funzionante se l'immagine non esiste, funziona in tutti i browser e fin da lontano dato che IE8 da solo, puoi anche usare immagini predefinite con questo metodo, ho pubblicato una risposta con i dettagli di seguito.
Nick Steele,

1
Questo ha funzionato per me invece dell'approccio <object> perché avevo bisogno che l'immagine avesse un margine dichiarato, ma solo se era stata trovata un'immagine valida, altrimenti ne avevo bisogno per occupare spazio zero. <object> non ha l'evento onerror, quindi quella non era un'opzione lì. Una regola di stile per rimuovere il margine, usando una pseudo classe: vuota, non è mai stata attivata sull'oggetto.
John Hatton,

Ho una domanda. esiste un modo per dare lo script comune da applicare per ogni tag immagine nella pagina invece di dare questa particolare riga di script in ogni tag immagine. grazie @Kevin jantzer
Lemdor,

1
@Lemdor - sì, dovresti trovare le immagini caricate e allegare la funzione comune a ognuna. Per farlo, potresti usare jQuery o JS vaniglia (ho aggiornato la mia risposta con un esempio)
Kevin Jantzer,

In reazioni è molto facile farlo, lo stesso principio si applica lì. Ho trovato questo tutorial qui - youtu.be/90P1_xCaim4 . L'aggiunta di un preloader ( youtu.be/GBHBjv6xfY4 ) per l'immagine nasconde la transizione e aiuta a fornire una buona UX.
Prem

143

Nonostante ciò che la gente dice qui, non hai bisogno di JavaScript, non hai nemmeno bisogno di CSS !!

In realtà è molto fattibile e semplice solo con HTML. Puoi anche mostrare un'immagine predefinita se un'immagine non viene caricata . Ecco come...

Questo funziona anche su tutti i browser, anche fino a IE8 (su oltre 250.000 visitatori di siti che ho ospitato a settembre 2015, le persone di ZERO hanno usato qualcosa di peggio di IE8, il che significa che questa soluzione funziona letteralmente per tutto ).

Passaggio 1: fare riferimento all'immagine come oggetto anziché come img . Quando gli oggetti falliscono, non mostrano icone rotte; non fanno proprio niente. A partire da IE8, è possibile utilizzare i tag Object e Img in modo intercambiabile. Puoi ridimensionare e fare tutte le cose gloriose che puoi anche con le immagini normali. Non aver paura del tag object; è solo un tag, non viene caricato nulla di grosso e voluminoso e non rallenta nulla. Utilizzerai il tag img con un altro nome. Un test di velocità mostra che vengono utilizzati in modo identico.

Passaggio 2: (opzionale, ma fantastico) Stick un'immagine predefinita all'interno di quell'oggetto. Se l'immagine desiderata viene effettivamente caricata nell'oggetto , l'immagine predefinita non verrà visualizzata. Quindi, ad esempio, potresti mostrare un elenco di avatar utente e se qualcuno non ha ancora un'immagine sul server, potrebbe mostrare l'immagine del segnaposto ... nessun javascript o CSS richiesto, ma ottieni le funzionalità di ciò prende la maggior parte delle persone JavaScript.

Ecco il codice ...

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

... Sì, è così semplice.

Se vuoi implementare immagini predefinite con CSS, puoi renderlo ancora più semplice nel tuo HTML in questo modo ...

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

... e aggiungi il CSS da questa risposta -> https://stackoverflow.com/a/32928240/3196360


6
In qualche modo mi è mancata completamente questa idea, quando è così ovvio in retrospettiva! Sfortunatamente, non credo che il tag oggetto possa gestire con grazia immagini reattive come stiamo iniziando a vedere sulla proprietà img.srcset :(
Windgazer

2
Ottima idea, grazie per quello! Su un lato nota, l'oggetto-tag sta bloccando la rotellina di scorrimento (nella mia realizzazione, almeno) ... se questo accade a te, basta usare object { pointer-events: none; }nel CSS (Fonte: stackoverflow.com/a/16534300 )
DHainzl

4
Questo però interrompe la semantica dei tag immagine. Non so se ai motori di ricerca piacerà l'utilizzo dei <object>tag anziché dei <img>tag. Questo approccio è conforme a HTML5 e reso correttamente da tutti i principali browser?
Pieter,

6
Questo è conforme a HTML4 (conforme dal 1997) e reso correttamente da tutti i principali browser da IE8 / 2009 (altri browser lo hanno fatto molto, molto prima). Se un motore di ricerca non capisce un oggetto con un tipo di immagine è un'immagine, ci sono voluti 19 anni per raggiungere le specifiche, quindi probabilmente non è un ottimo motore ... Gli adolescenti che sono sulla strada alla guida di auto ora non lo erano anche concepito quando questa soluzione ha incontrato le specifiche ... Quanto indietro vuoi andare? :) Questa è una soluzione solida come una roccia.
Nick Steele,

6
@MonsterMMORPG perché non utilizza JavaScript e non ti è sempre permesso (ad esempio in un corpo di un messaggio di posta elettronica).
ForNeVeR,

63

Ho trovato un'ottima soluzione su 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">


1
Soluzione eccezionale che utilizza semplicemente CSS che dovrebbe essere la risposta accettata. L'articolo collegato è obsoleto, poiché il supporto del browser ora è del 97,87%: caniuse.com/#feat=css-gencontent .
holm50,

1
L' articolo collegato ha un'eccellente spiegazione su come i browser gestiscono le immagini, ma tieni presente che questa soluzione funziona solo se hai uno sfondo solido e vuoi coprire tutto con un'altra scatola dello stesso colore solido o con un'altra immagine. Questa soluzione non sta davvero rimuovendo o nascondendo l'icona dell'immagine rotta, ma solo coprendola.
Claudio Floreani,

3
Su Chrome 70, mostra l'uccello + un'icona con l'immagine rotta :(
Simon Arnold,

2
^ Lo stesso su Firefox 63
dsturbid

1
@dailysleaze: su Firefox 64+, questo è stato spostato su img[alt]::before. display:inline-blockSe lo desideri, puoi usarlo perché è più vicino all'originale.
Adam Katz,

41

Se aggiungerai alt con il testo alt = "abc" mostrerà la miniatura corrotta mostra e il messaggio alt abc

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

1 °

Se non aggiungerai alt, verrà mostrata la miniatura dello show corrotto

<img src="pic_trulli.jpg"/>

2 °

Se vuoi nascondere quello rotto basta aggiungere alt = "" non mostrerà la miniatura corrotta e nessun messaggio alt (senza usare js)

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

Se vuoi nascondere quello rotto aggiungi semplicemente alt = "" & onerror = "this.style.display = 'none'" non mostrerà la miniatura corrotta e nessun messaggio alt (con js)

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

Il quarto è un po 'pericoloso (non esattamente), se si desidera aggiungere un'immagine all'evento onerror, non verrà visualizzato anche se l'immagine esiste come style.display è come aggiungere. Quindi, usalo quando non hai bisogno di alcuna immagine alternativa per la visualizzazione.

display: 'none'; // in css

Se lo diamo in CSS, l'elemento non verrà visualizzato (come immagine, iframe, div così).

Se si desidera visualizzare l'immagine e si desidera visualizzare uno spazio totalmente vuoto in caso di errore, è possibile utilizzare, ma anche fare attenzione a non occupare spazio. Quindi, è necessario tenerlo in un div potrebbe essere

Link https://jsfiddle.net/02d9yshw/


2
SÌ! Aggiungi alt=""! Questo è letteralmente! Grazie. Per fortuna ho fatto scorrere fino alla fine della pagina. Sto usando il caricamento lazy e le immagini in-frame che non sono ancora state caricate (perché il browser pensa erroneamente che il viewport non sia ancora passato a quelle) mostrate come immagini rotte. Un piccolo rotolo e riappaiono. Le immagini rotte al loro posto erano così brutte però
velkoon

25

Penso che il modo più semplice sia nascondere l'icona dell'immagine spezzata dalla proprietà indentazione del testo.

img {
    text-indent: -10000px
}

Ovviamente non funziona se vuoi vedere l'attributo "alt".


1
La via più facile.
theerasan tonthongkam,

17

nel caso in cui ti piace mantenere / necessitare l'immagine come segnaposto, puoi modificare l'opacità su 0 con un onerror e alcuni CSS per impostare la dimensione dell'immagine. In questo modo non vedrai il link interrotto, ma la pagina si carica normalmente.

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

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

16

Mi è piaciuta la risposta di Nick e stavo giocando con questa soluzione. Trovato un metodo più pulito. Poiché gli pseudos :: before / :: after non funzionano su elementi sostituiti come img e object funzioneranno solo se i dati dell'oggetto (src) non vengono caricati. Mantiene l'HTML più pulito e aggiungerà lo pseudo solo se l'oggetto non riesce a caricare.

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>


9

Se hai ancora bisogno di avere il contenitore dell'immagine visibile perché è stato compilato in un secondo momento e non vuoi preoccuparti di mostrarlo e nasconderlo, puoi attaccare un'immagine trasparente 1x1 all'interno di src:

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

L'ho usato per questo preciso scopo. Avevo un contenitore di immagini che avrebbe caricato un'immagine tramite Ajax. Poiché l'immagine era di grandi dimensioni e richiedeva un po 'di caricamento, era necessario impostare un'immagine di sfondo nel CSS di una barra di caricamento Gif.

Tuttavia, poiché l'src dell'elemento era vuoto, l'icona delle immagini rotte appariva ancora nei browser che la utilizzano.

L'impostazione di 1x1 Gif trasparente risolve questo problema in modo semplice ed efficace senza aggiunte di codice tramite CSS o JavaScript.


unica risposta che ha funzionato tutti gli altri hanno lasciato un contorno bianco
futurelucas4502

8

Usare solo CSS è difficile, ma potresti usare CSS background-imageinvece di <img>tag ...

Qualcosa come questo:

HTML

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

CSS

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

}

Ecco un violino funzionante .

Nota: ho aggiunto il bordo nel CSS sul violino solo per dimostrare dove sarebbe stata l'immagine.


È buono, ma questa soluzione non fa per me :) Il tag img è nascosto, quindi src è rotto, div - no :(
Geray Suinov,

@GeraySuinov Quindi potresti dover utilizzare Javascript
Dryden Long,


3

Dal 2005 , i browser Mozilla come Firefox supportano la :-moz-brokenpseudo-classe CSS non standard in grado di soddisfare esattamente questa richiesta:

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]::beforefunziona anche con Firefox 64 (anche se una volta era img[alt]::aftercosì non è affidabile). Non riesco a far funzionare nessuno di questi in Chrome 71.


Interessante ... sai se Chrome ha una pseudo-classe simile?
1000Gbps

1
@ 1000Gbps - Non sono riuscito a trovarne uno quando ho fatto quella risposta e non riesco a trovarne uno ora, almeno con query Web rapide e guardando il bug 11011 di Mozilla . In realtà potresti richiedere una cosa del genere in Chromium (l'upstream per Chrome) se lo desideri, ma poiché non è standard, non c'è certezza che lo faranno.
Adam Katz,

Dubito fortemente che lo faranno in breve tempo, tenendo conto del fatto che hanno avuto difficoltà a gestire alcuni bug cattivi che ho segnalato lì ... Non importa il fatto che le pseudo-classi integrate come questa rimuoveranno da inquadra un sacco di codice JS scritto per lo stesso motivo
1000Gbps

2

Puoi seguire questo percorso come soluzione 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">


In primo luogo stavo pensando che questa è una buona soluzione ma non funziona su IE. Inoltre, quando si aggiunge il blocco display nel dopo css
Glenn Franquet,

1

Le immagini mancanti non visualizzeranno nulla o visualizzeranno un [? ] box di stile quando non è possibile trovare la loro fonte. Invece potresti voler sostituire quello con un'immagine "immagine mancante" che sei sicuro che esista, quindi c'è un miglior feedback visivo che qualcosa non va. Oppure, potresti volerlo nascondere del tutto. Questo è possibile perché le immagini che un browser non riesce a trovare generano un evento JavaScript "errore" che possiamo guardare.

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

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

Inoltre, potresti voler attivare una sorta di azione Ajax per inviare un'email a un amministratore del sito quando ciò si verifica.


1

Il trucco con img::afterè una buona roba, ma ha almeno 2 aspetti negativi:

  1. non supportato da tutti i browser (ad es. non funziona su Edge https://codepen.io/dsheiko/pen/VgYErm )
  2. non puoi semplicemente nascondere l'immagine, la copri, quindi non è utile quando mostri un'immagine predefinita nel caso

Non conosco una soluzione universale senza JavaScript, ma solo per Firefox ce n'è una bella:

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

0

La stessa idea descritta da altri funziona in React come segue:

<img src='YOUR-URL' onError={(e) => e.target.style.display='none' }/>

-3

Un modo semplice e molto semplice per farlo senza alcun codice richiesto sarebbe quello di fornire semplicemente un'istruzione alt vuota. Il browser restituirà quindi l'immagine come vuota. Sembrerebbe che l'immagine non ci fosse.

Esempio:

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

Provalo per vedere! ;)


10
Dipende dal browser. In Chrome avrai anche il bordo dell'immagine e l'icona dell'immagine rotta oltre al testo alt (qui vuoto).
Panzi,

Se l'immagine è decorativa e non è indispensabile per il contenuto, un altro vuoto va bene. In realtà è consigliato su nessun alt affatto. Altrimenti, questo è altamente sconsigliabile. Un'immagine rotta è un'immagine che non può essere vista, ma se ha un tag alt può almeno essere ascoltata. Se porti via il tag alt, non può essere visto O sentito.
JP DeVries

2
@panzi Ho testato la soluzione e sembra che Chrome abbia cambiato comportamento. Se non verrà visualizzata l'icona dell'immagine rotta alt="". Lo stesso vale per Firefox.
Philipp Mitterer,

-4

Per i futuri googler, nel 2016 esiste un modo CSS sicuro per browser per nascondere immagini vuote utilizzando il selettore di attributi:

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

Modifica: sono tornato - per i futuri googler, nel 2019 c'è un modo per modellare il testo alt e l'immagine del testo alt in Shadow Dom, ma funziona solo con strumenti di sviluppo. Quindi non puoi usarlo. Scusate. Sarebbe così bello

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

1
img[src=''] { display: none; } Ciò è tornato a essere rilevante con i modelli html di eBay
imos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.