Wie kann ich ein Symbol mit Bildbruch nur mit CSS / HTML ausblenden?

193

Wie kann ich das Symbol für defekte Bilder ausblenden? Beispiel : Beispiel

Ich habe ein Bild mit dem Fehler src:

<img src="Error.src"/>

Die Lösung muss in allen Browsern funktionieren.

Geray Suinov
quelle
1
Ich habe versucht, alt = "" zu setzen und img teg Hintergrund zu setzen, um CSS live zu werfen: {Hintergrund: URL (src), Breite: ...; Höhe: ..} aber es ist nicht wahr. Mein img-Tag muss sich verstecken, dann ist src kaputt.
Geray Suinov
Eine mögliche Lösung finden Sie hier - stackoverflow.com/questions/18484753/… , benötigt jedoch JS. Sie können dies nicht allein mit CSS tun.
JohanVdR
Siehe w3schools.com/jsref/event_onerror.asp "onerror" -Attribut
Amy.js

Antworten:

273

CSS / HTML kann nicht erkennen, ob das Bild fehlerhaft ist. Daher müssen Sie JavaScript verwenden, egal was passiert

Hier ist jedoch eine minimale Methode, um entweder das Image auszublenden oder die Quelle durch ein Backup zu ersetzen.

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

oder

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

Aktualisieren

Sie können diese Logik auf mehrere Bilder gleichzeitig anwenden, indem Sie Folgendes tun:

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

Update 2

Für eine CSS - Option sehen michalzuber Antwort unten. Sie können nicht das gesamte Bild ausblenden, aber Sie ändern das Aussehen des defekten Symbols.

Kevin Jantzer
quelle
3
Sie können dies mit HTML nur mit dem Objekt-Tag tun, da es zum Anzeigen von Bildern wie dem img-Tag verwendet werden kann und keinen fehlerhaften Link anzeigt, wenn das Bild nicht vorhanden ist. Es funktioniert in allen Browsern und so weit zurück Da IE8 für sich genommen sogar Standardbilder mit dieser Methode verwenden kann, habe ich unten eine Antwort mit Details gepostet.
Nick Steele
1
Dies funktionierte für mich anstelle des <Objekt> -Ansatzes, da das Bild einen deklarierten Rand haben musste, aber nur, wenn ein gültiges Bild gefunden wurde, andernfalls musste es keinen Platz beanspruchen. <Objekt> hat das Ereignis onerror nicht, daher war dies dort keine Option. Eine Stilregel zum Entfernen des Randes unter Verwendung einer: leeren Pseudoklasse wurde für ein Objekt nie ausgelöst.
John Hatton
Ich habe eine Frage. Gibt es eine Möglichkeit, das Skript so anzugeben, dass es für jedes Bild-Tag auf der Seite gilt, anstatt diese bestimmte Skriptzeile in jedem Bild-Tag anzugeben? danke @ Kevin jantzer
Lemdor
1
@ Lemdor - ja, Sie müssten Bilder beim Laden finden und jedem die gemeinsame Funktion zuordnen. Sie könnten jQuery oder Vanilla JS verwenden, um dies zu erreichen (ich habe meine Antwort mit einem Beispiel aktualisiert)
Kevin Jantzer
In Reaktionen ist das sehr einfach, das gleiche Prinzip gilt dort. Fand dieses Tutorial hier - youtu.be/90P1_xCaim4 . Durch Hinzufügen eines Preloaders ( youtu.be/GBHBjv6xfY4 ) für das Image wird der Übergang ausgeblendet und eine gute Benutzeroberfläche bereitgestellt .
Prem
143

Trotz allem, was die Leute hier sagen, brauchen Sie überhaupt kein JavaScript, Sie brauchen nicht einmal CSS !!

Es ist eigentlich nur mit HTML sehr machbar und einfach. Sie können sogar ein Standardbild anzeigen, wenn ein Bild nicht geladen wird . Hier ist wie...

Dies funktioniert auch auf allen Browsern, auch so weit zurück wie IE8 (von 250.000 Besuchern zu Seiten , die ich im September 2015 statt, ZERO Menschen für etwas schlechter als IE8, was bedeutet diese Lösung funktioniert verwendeten buchstäblich alles ).

Schritt 1: Referenzieren Sie das Bild als Objekt anstelle eines Bilds . Wenn Objekte versagen, werden keine defekten Symbole angezeigt. Sie tun einfach nichts. Ab IE8 können Sie die Tags Object und Img austauschbar verwenden. Sie können die Größe ändern und all die großartigen Dinge tun, die Sie mit normalen Bildern tun können. Haben Sie keine Angst vor dem Objekt-Tag. Es ist nur ein Tag, nichts Großes und Sperriges wird geladen und es verlangsamt nichts. Sie verwenden nur das img-Tag mit einem anderen Namen. Ein Geschwindigkeitstest zeigt, dass sie identisch verwendet werden.

Schritt 2: (Optional, aber fantastisch) Kleben Sie ein Standardbild in dieses Objekt. Wenn das gewünschte Bild tatsächlich in das Objekt geladen wird, wird das Standardbild nicht angezeigt. So könnten Sie beispielsweise eine Liste von Benutzeravataren anzeigen, und wenn jemand noch kein Bild auf dem Server hat, könnte es das Platzhalterbild anzeigen ... überhaupt kein Javascript oder CSS erforderlich, aber Sie erhalten die Funktionen von was nimmt die meisten Leute JavaScript.

Hier ist der Code ...

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

... Ja, so einfach ist das.

Wenn Sie Standardbilder mit CSS implementieren möchten, können Sie dies in Ihrem HTML-Code noch einfacher machen ...

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

... und fügen Sie einfach das CSS aus dieser Antwort hinzu -> https://stackoverflow.com/a/32928240/3196360

Nick Steele
quelle
6
Irgendwie habe ich diese Idee völlig verpasst, wenn es im Nachhinein so offensichtlich ist! Leider glaube ich nicht, dass das Objekt-Tag reaktionsschnelle Bilder verarbeiten kann, wie wir es in der Eigenschaft img.srcset sehen :(
Windgazer
2
Tolle Idee, danke dafür! Nebenbeiobject { pointer-events: none; }
bemerkt
4
Dies bricht jedoch die Semantik von Bild-Tags. Ich weiß nicht, ob Suchmaschinen die Verwendung von <object>Tags anstelle von <img>Tags mögen . Ist dieser Ansatz HTML5-kompatibel und wird er von allen gängigen Browsern korrekt wiedergegeben?
Pieter
6
Dies ist HTML4-kompatibel (kompatibel seit 1997) und wird seit IE8 / 2009 von allen gängigen Browsern korrekt wiedergegeben (andere Browser haben dies viel, viel früher getan). Wenn eine Suchmaschine nicht versteht, dass ein Objekt mit einem Bildtyp ein Bild ist, hatte sie 19 Jahre Zeit, um die Spezifikationen einzuhalten, sodass es wahrscheinlich keine sehr gute Maschine ist ... Jugendliche, die unterwegs sind und Autos fahren, waren es jetzt nicht sogar konzipiert, als diese Lösung den Spezifikationen entsprach ... Wie weit möchten Sie zurückgehen? :) Dies ist eine absolut solide Lösung.
Nick Steele
6
@MonsterMMORPG, weil kein JavaScript verwendet wird und Sie dies nicht immer dürfen (z. B. in einem Text einer E-Mail-Nachricht).
Für immer
63

Fand eine tolle Lösung bei https://bitsofco.de/styling-broken-images/ wurde

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

michalzuber
quelle
1
Tolle Lösung, die nur CSS verwendet und die akzeptierte Antwort sein sollte. Der verlinkte Artikel ist veraltet, da die Browserunterstützung jetzt 97,87% beträgt : caniuse.com/#feat=css-gencontent .
holm50
1
Der verlinkte Artikel enthält eine hervorragende Erklärung zum Umgang der Browser mit Bildern. Beachten Sie jedoch, dass diese Lösung nur funktioniert, wenn Sie einen festen Hintergrund haben und alles mit einem anderen Feld derselben Farbe oder mit einem anderen Bild abdecken möchten . Diese Lösung entfernt oder versteckt das Symbol für defekte Bilder nicht wirklich, sondern deckt es nur ab.
Claudio Floreani
3
Auf Chrome 70 zeigt es den Vogel + ein kaputtes Bildsymbol :(
Simon Arnold
2
^ Gleiches auf Firefox 63
Dailysleaze
1
@dailysleaze - Auf Firefox 64+ wurde dies verschoben img[alt]::before. Sie können verwenden, display:inline-blockwenn Sie möchten, da es näher am Original ist.
Adam Katz
40

Wenn Sie alt mit dem Text alt = "abc" hinzufügen , werden die Miniaturansichten der beschädigten Show und die alt-Nachricht abc angezeigt

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

1

Wenn Sie nicht alt hinzufügen, wird die Miniaturansicht der beschädigten Show angezeigt

<img src="pic_trulli.jpg"/>

2 ..

Wenn Sie das kaputte ausblenden möchten, fügen Sie einfach alt = "" hinzu. Es werden keine beschädigten Miniaturansichten und keine Alt-Meldungen angezeigt (ohne Verwendung von js).

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

Wenn Sie das kaputte ausblenden möchten, fügen Sie einfach alt = "" & onerror = "this.style.display = 'none'" hinzu. Es werden keine beschädigten Miniaturansichten und keine Alt-Meldung (mit js) angezeigt.

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

Das vierte ist ein wenig gefährlich (nicht genau). Wenn Sie ein Bild in einem Fehlerereignis hinzufügen möchten, wird es nicht angezeigt, selbst wenn das Bild als style.display vorhanden ist. Verwenden Sie es also, wenn Sie kein alternatives Bild für die Anzeige benötigen.

display: 'none'; // in css

Wenn wir es in CSS geben, wird das Element nicht angezeigt (wie Bild, Iframe, Div so).

Wenn Sie ein Bild anzeigen möchten und im Fehlerfall ein völlig leeres Leerzeichen anzeigen möchten, können Sie es verwenden, aber seien Sie auch vorsichtig, dass dies kein Leerzeichen beansprucht. Also, Sie müssen es in einem div halten, kann sein

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

P Satish Patro
quelle
2
JA! Einfach hinzufügen alt=""! Das ist es buchstäblich! Danke dir. Ich bin so froh, dass ich zum Ende der Seite gescrollt habe. Ich verwende das verzögerte Laden und In-Frame-Bilder, die noch nicht geladen wurden (weil der Browser fälschlicherweise glaubt, dass das Ansichtsfenster noch nicht zu ihnen gescrollt hat), wurden als fehlerhafte Bilder angezeigt. Eine kleine Schriftrolle, und sie erscheinen wieder. Die zerbrochenen Bilder an ihrer Stelle waren allerdings so hässlich
Velkoon
25

Ich denke, der einfachste Weg ist, das Symbol für defekte Bilder durch die Eigenschaft text-indent auszublenden.

img {
    text-indent: -10000px
}

Offensichtlich funktioniert es nicht, wenn Sie das Attribut "alt" sehen möchten.

Burnee
quelle
1
Der einfachste Weg.
Theerasan Tonthongkam
16

Ich mochte die Antwort von Nick und spielte mit dieser Lösung herum. Fand eine sauberere Methode. Da :: before / :: after-Pseudos bei ersetzten Elementen wie img und object nicht funktionieren, funktionieren sie nur, wenn die Objektdaten (src) nicht geladen sind. Es hält den HTML-Code sauberer und fügt das Pseudo nur hinzu, wenn das Objekt nicht geladen werden kann.

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>

Bartezz
quelle
16

Wenn Sie das Bild als Platzhalter behalten möchten / benötigen, können Sie die Deckkraft mit einem Fehler und etwas CSS auf 0 ändern, um die Bildgröße festzulegen. Auf diese Weise sehen Sie den defekten Link nicht, aber die Seite wird wie gewohnt geladen.

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

img {
    width: 75px;
    height: 100px;
}
Ewald Bos
quelle
9

Wenn Sie den Bildcontainer weiterhin sichtbar haben müssen, weil er später ausgefüllt wird, und sich nicht darum kümmern möchten, ihn ein- und auszublenden, können Sie ein transparentes 1x1-Bild in die src kleben:

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

Ich habe das genau für diesen Zweck verwendet. Ich hatte einen Bildcontainer, in den ein Bild über Ajax geladen werden sollte. Da das Bild groß war und das Laden etwas dauerte, musste ein Hintergrundbild in CSS einer Gif-Ladeleiste festgelegt werden.

Da die src von leer war, wurde das Symbol für fehlerhafte Bilder in Browsern, die es verwenden, weiterhin angezeigt.

Das Einstellen des transparenten 1x1-Gif behebt dieses Problem einfach und effektiv, ohne dass Code über CSS oder JavaScript hinzugefügt werden muss.

user2596313
quelle
Die einzige Antwort, die alle anderen funktionierte, hinterließ einen weißen Umriss
futurelucas4502
8

Nur CSS zu verwenden ist schwierig, aber Sie können background-imagestattdessen auch CSS verwenden<img> Tags verwenden ...

Etwas wie das:

HTML

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

CSS

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

}

Hier ist eine funktionierende Geige .

Hinweis: Ich habe den Rand im CSS auf der Geige hinzugefügt, um zu demonstrieren, wo sich das Bild befinden würde.

Lange trocknen
quelle
Es ist gut, aber diese Lösung nicht für mich :) img Tag versteckt dann src ist kaputt, div - nein :(
Geray Suinov
@ GeraySuinov Dann müssen Sie möglicherweise Javascript
Dryden Long
4

Verwenden Sie das Objekt-Tag. Fügen Sie alternativen Text zwischen den Tags wie folgt hinzu:

<object data="img/failedToLoad.png" type="image/png">Alternative Text</object>

http://www.w3schools.com/tags/tag_object.asp

ThomasAFink
quelle
3

Seit 2005 unterstützen Mozilla-Browser wie Firefox die nicht standardmäßige :-moz-brokenCSS-Pseudoklasse, die genau diese Anforderung erfüllen kann:

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]::beforefunktioniert auch in Firefox 64 (obwohl es einmal so war img[alt]::after, ist dies nicht zuverlässig). Ich kann keines davon in Chrome 71 zum Laufen bringen.

Adam Katz
quelle
Interessant ... wissen Sie, ob Chrome eine ähnliche Pseudoklasse hat?
1000 Gbit
1
@ 1000Gbps - Ich konnte keine finden, als ich diese Antwort gab, und kann jetzt keine finden, zumindest bei schnellen Webabfragen und beim Betrachten des Mozilla-Fehlers 11011 . Sie können so etwas tatsächlich in Chromium (dem Upstream für Chrome) anfordern, wenn Sie möchten, aber da es nicht dem Standard entspricht, gibt es keine Garantie dafür, dass sie es tun.
Adam Katz
Ich bezweifle sehr, dass sie es in kurzer Zeit tun werden, wenn man bedenkt, dass es ihnen schwer gefallen ist, mit einigen bösen Fehlern umzugehen, die ich dort gemeldet habe ... Unabhängig von der Tatsache, dass eingebaute Pseudoklassen wie diese entfernt werden Frameworks viel JS-Code aus dem gleichen Grund geschrieben
1000 Gbit
2

Sie können diesem Pfad als CSS-Lösung folgen

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

Cenk YAGMUR
quelle
Zuerst dachte ich, dass dies eine nette Lösung ist, aber dies funktioniert nicht im IE. Auch nicht beim Hinzufügen von Anzeigeblock in der After-CSS
Glenn Franquet
1

Fehlende Bilder zeigen entweder nur nichts an oder ein [? ] Stilfeld, wenn ihre Quelle nicht gefunden werden kann. Stattdessen möchten Sie diese möglicherweise durch eine Grafik mit "fehlendem Bild" ersetzen, von der Sie sicher sind, dass sie vorhanden ist, damit Sie besser visuell wissen, dass etwas nicht stimmt. Oder Sie möchten es möglicherweise vollständig ausblenden. Dies ist möglich, da Bilder, die ein Browser nicht finden kann, ein "Fehler" -JavaScript-Ereignis auslösen, auf das wir achten können.

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

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

Darüber hinaus möchten Sie möglicherweise eine Ajax-Aktion auslösen, um in diesem Fall eine E-Mail an einen Site-Administrator zu senden.

Ali Panahian
quelle
1

Der Trick mit img::afterist ein gutes Zeug, hat aber mindestens 2 Nachteile:

  1. wird nicht von allen Browsern unterstützt (z. B. funktioniert nicht unter Edge https://codepen.io/dsheiko/pen/VgYErm )
  2. Sie können das Bild nicht einfach ausblenden, Sie decken es ab - also nicht so hilfreich, wenn Sie ein Standardbild in dem Fall anzeigen möchten

Ich kenne keine universelle Lösung ohne JavaScript, aber nur für Firefox gibt es eine nette:

img:-moz-broken{
  opacity: 0;
}
Dmitry Sheiko
quelle
-3

Eine grundlegende und sehr einfache Möglichkeit, dies ohne Code zu tun, besteht darin, nur eine leere alt-Anweisung anzugeben. Der Browser gibt das Bild dann als leer zurück. Es würde genauso aussehen, wenn das Bild nicht da wäre.

Beispiel:

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

Probieren Sie es aus, um zu sehen! ;)

user45678
quelle
10
Das hängt vom Browser ab. In Chrome haben Sie neben dem (hier leeren) Alternativtext auch noch den Bildrand und das Symbol für fehlerhafte Bilder.
Panzi
Wenn das Bild dekorativ und für den Inhalt nicht zwingend erforderlich ist, ist eine leere Alt in Ordnung. In der Tat wird es über gar nicht alt empfohlen. Ansonsten ist dies nicht ratsam. Ein kaputtes Bild ist ein Bild, das nicht gesehen werden kann, aber wenn es ein Alt-Tag hat, kann es zumindest noch gehört werden. Wenn Sie das Alt-Tag entfernen, kann es weder gesehen noch gehört werden.
JP DeVries
2
@panzi Ich habe die Lösung getestet und es scheint, als hätte Chrome sein Verhalten geändert. Das Symbol für defekte Bilder wird nicht gerendert, wenn alt="". Gleiches gilt für Firefox.
Philipp Mitterer
-4

Für zukünftige Googler gibt es 2016 eine browsersichere reine CSS-Methode, um leere Bilder mithilfe der Attributauswahl auszublenden:

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

Bearbeiten: Ich bin zurück - für zukünftige Googler gibt es 2019 eine Möglichkeit, den tatsächlichen Alternativtext und das Alternativtextbild im Shadow Dom zu formatieren, dies funktioniert jedoch nur in Entwicklertools. Sie können es also nicht verwenden. Es tut uns leid. Es wäre so schön.

#alttext-container {
    opacity: 0;
}
#alttext-image {
    opacity: 0;
}
#alttext {
    opacity: 0;
}
VerticalGrain
quelle
1
img[src=''] { display: none; } Dies wurde wieder relevant mit eBay HTML nur Vorlagen
imos