Die meisten Bilder im Web sind überflüssig. Wenn ich mal ein wenig frech sein darf, 99% davon sind nicht einmal wirklich hilfreich (obwohl es seltene Ausnahmen gibt). Das liegt daran, dass Bilder den Text, den sie eigentlich unterstützen sollen, oft nicht ergänzen, sondern die Nutzer *belasten*, indem sie ewig zum Laden brauchen und Datenvolumina sprengen wie eine Art Performance-Steuer.
Glücklicherweise ist dies heute größtenteils ein Designproblem, denn Bilder performanter und benutzerfreundlicher zu gestalten ist so viel einfacher als früher. Wir haben bessere Bildformate wie WebP (und bald vielleicht JPEG XL). Wir haben natürlich die Magie von responsiven Bildern. Und es gibt unzählige großartige Tools wie ImageOptim, sowie Ressourcen wie Addy Osmans neues Buch.
Aber vielleicht ist meine Lieblingsmethode zur Verbesserung der Bildperformance das Lazy Loading
<img href="image.webp" alt="Image description" loading="lazy">
Dieses Bild wird erst geladen, wenn der Nutzer nach unten scrollt und es sichtbar wird – was es vom anfänglichen Seitenaufbau ausklammert und das ist einfach großartig! Die anfängliche Ladezeit einer Webseite blitzschnell zu machen, ist eine große Sache.
Aber vielleicht gibt es Bilder, die *nie* geladen werden sollten. Vielleicht gibt es Situationen, in denen es besser wäre, wenn eine Person sich dafür entscheiden könnte, sie zu sehen. Hier ist ein Beispiel: Nehmen Sie die reine Textversion von NPR und klicken Sie sich ein wenig durch. Ist sie nicht… einfach nur großartig?! Sie ist lesbar! Da ist kein Durcheinander überall, sie respektiert mich als Nutzer und – Himmel sei Dank – sie ist *schnell*.

Also! Was wäre, wenn wir Bilder auf einer Website anzeigen könnten, aber erst, wenn sie angeklickt oder angetippt werden? Wäre es nicht nett, wenn wir einen Platzhalter anzeigen und diesen beim Klick durch das echte Bild ersetzen könnten? So etwas wie hier
Nun, ich hatte hier zwei Gedanken, wie man diesen Kerl bauen kann (die goldene Regel ist, dass es nie nur eine Möglichkeit gibt, etwas im Web zu bauen).
Methode #1: Verwenden von <img> ohne src-Attribut
Wir können das src-Attribut eines <img>-Tags entfernen, um ein Bild zu verbergen. Wir könnten die Bilddatei dann in ein Attribut legen, wie z.B. data-src oder so ähnlich, genau wie hier
<img data-src="image.jpg" src="" alt="Photograph of hot air balloons by Musab Al Rawahi. 144kb">
Standardmäßig zeigen die meisten Browser ein defektes Bildsymbol, das Ihnen wahrscheinlich vertraut ist
Okay, es ist also irgendwie barrierefrei. Ich schätze? Sie können den alt-Tag automatisch auf dem Bildschirm angezeigt sehen, aber mit einem leichten Schuss JavaScript können wir dann das src mit diesem Attribut austauschen
document.querySelectorAll("img").forEach((item) => {
item.addEventListener("click", (event) => {
const image = event.target.getAttribute("data-src");
event.target.setAttribute("src", image);
});
});
Jetzt können wir einige Stile hinzufügen und ugh, oh nein
Ugh. In einigen Browsern wird unten ein kleines defektes Bildsymbol angezeigt, wenn das Bild nicht geladen wurde. Das Problem hier ist, dass Browser Ihnen keine Möglichkeit bieten, das defekte Bildsymbol mit CSS zu entfernen (und wir sollten es wahrscheinlich sowieso nicht dürfen). Es ist auch ein wenig nervig, den alt-Text zu gestalten. Aber wenn wir das alt-Attribut komplett entfernen, dann ist das defekte Bildsymbol weg, obwohl dies das <img> ohne JavaScript unbrauchbar macht. Das Entfernen dieses alt-Textes ist also ein No-Go.
Wie ich sagte: *Ugh*. Ich glaube nicht, dass es einen Weg gibt, diese Methode zum Laufen zu bringen (obwohl beweisen Sie mir bitte das Gegenteil!).
Methode #2: Verwenden von Links zur Erstellung eines Bildes
Die andere Option, die wir haben, ist, mit dem bescheidenen Hyperlink zu beginnen, so wie hier
<a href="image.jpg">Photograph of hot air balloons by Musab Al Rawahi. 144kb<a>
Was, ja, bisher ist nichts Besonderes passiert – das wird einfach einen Link zu einem Bild rendern
Das funktioniert doch von der Barrierefreiheit her, oder? Wenn wir kein JavaScript haben, dann haben wir nur einen Link, auf den die Leute optional klicken können. Was die Performance angeht, kann es nicht schneller sein als einfacher Text!
Aber von hier aus können wir zu JavaScript greifen, um das Laden des Links beim Klicken zu stoppen, das href-Attribut innerhalb dieses Links zu holen, ein Bildelement zu erstellen und schließlich dieses Bild auf die Seite zu werfen und den alten Link zu entfernen, wenn wir fertig sind
document.querySelectorAll(".load-image").forEach((item) => {
item.addEventListener("click", (event) => {
const href = event.target.getAttribute("href");
const newImage = document.createElement("img");
event.preventDefault();
newImage.setAttribute("src", href);
document.body.insertBefore(newImage, event.target);
event.target.remove();
});
});
Wir könnten diesen Platzhalter-Link wahrscheinlich so gestalten, dass er etwas schöner aussieht als das, was ich unten habe. Aber das ist nur ein Beispiel. Klicken Sie ruhig auf den Link, um das Bild erneut zu laden
Und da haben Sie es! Es ist nichts Bahnbrechendes oder so etwas, und ich bin sicher, jemand hat das schon einmal gemacht. Aber wenn wir bei der Performance über die erste Anzeige und den anfänglichen Ladevorgang hinaus extrem radikal sein wollen, dann denke ich, ist das eine einigermaßen gute Lösung. Wenn wir eine reine Textwebsite erstellen, dann ist das meiner Meinung nach definitiv der richtige Weg.
Vielleicht könnten wir auch eine Webkomponente daraus machen, oder sogar erkennen, ob jemand prefers-reduced-data verwendet und dann Bilder nur laden, wenn jemand genug Daten hat oder so etwas. Was denken Sie?
Das ist wirklich interessant! Ich werde vielleicht so etwas auf meinem Blog implementieren.
Dafür brauchen Sie kein JavaScript, Sie können einfach den klassischen Checkbox-Hack verwenden (oder Radio, Fokus usw., je nachdem, welche Benutzeroberfläche Sie anstreben). Browser, die loading=lazy unterstützen, sollten das Richtige tun.
Um das mit einem Beispiel zu ergänzen
Fügen Sie ein winziges und transparentes 1x1px GIF in den zuvor leeren
src-Wert ein (z.B.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"und Sie erhalten kein defektes Bildsymbol. Die Performance-Auswirkung sollte vernachlässigbar sein, selbst wenn der data-uri-String mehrmals im Dokument wiederholt wird, dann sollte jede Komprimierung wie Gzip oder Brotli dies mildern.Betreff: mein vorheriger Kommentar…
Ich habe den Artikel gerade noch einmal gelesen und festgestellt, dass mein Vorschlag nicht gut ist, da dann der
alt-Text nicht angezeigt würde! Dumm von mir :) Ich dachte an nicht-native Lazy-Loading-Bibliotheken, bei denen die Verwendung eines data-uri wie diesem ein gängiger Trick ist, um das defekte Bildsymbol zu vermeiden, aber natürlich müssen sie den alternativen Text nicht visuell anzeigen…Ich frage mich, ob die Verwendung eines Inline-SVGs (mit einer Aufforderung "Zum Laden klicken") funktionieren würde? Sie würden den alternativen Text verlieren, es sei denn, Sie könnten ein serverseitiges Tool oder JavaScript verwenden, um die SVG-Markup dynamisch zu generieren und den alternativen Text darin einzuschließen.
Das würde helfen, wenn ich entweder Bandbreite sparen oder einfach einen interaktiven Bereich erstellen möchte. Ich mag es.
Erinnert mich an den Lesemodus von Firefox. Er versucht, den Artikel von allem Unnötigen zu bereinigen.
Die JS-Sachen einzubauen führt irgendwie zu einer weiteren Verzögerung (für diejenigen, die auf Geschwindigkeit und Performance fixiert sind), zuerst, weil sie etwas anklicken müssen und dann zur JS-Ausführung. Ich weiß, es ist schnell, aber trotzdem sichtbar störend.
Ich würde lieber eine automatische Ladefunktion nach wenigen Sekunden nach dem Laden der Seite verwenden (vielleicht auch mit defer), wie beim Lazy Loading, aber nicht nach dem Scrollen.
Die Leute müssen dann nichts anklicken, das visuelle Erlebnis ist nicht unterbrochen (sie sehen also nie eine schlechte Startseite), aber oberhalb des sichtbaren Bereichs könnte der Alt-Text etwas wie "Bild hier" anzeigen.
Allerdings ist die gesamte Logik fehlerhaft: Kein Entwickler würde seine *eigenen* Bilder als so störend empfinden, dass er sie hinter einem Klick versteckt, meiner Meinung nach.
Und warum nicht ein pixelgroßes transparentes Bild mit einem einfachen Code wie diesem einfügen
onclick="this.src='realimage.jpg'"anstatt all des komplizierten JS-Codes zuvor. Manchmal versuchen wir, ein nicht existierendes Problem zu lösen :)
Ein weiterer Ansatz ist die Verwendung von details/summary: https://codepen.io/dannievinther/pen/e9e49d946cffa57ba96d76b207a840fa zusammen mit
loading="lazy"Gute Idee, Robert! Eine andere Idee wäre, ein superleichtes Platzhalter-SVG zu rendern, das das echte Bild beim Klicken abruft. Dann könnten Sie Layout-Shifts vermeiden, indem Sie das SVG genauso groß wie das richtige Bild machen. Das ist aber etwas mehr Overhead als Ihre Beispiele!
Vielen Dank für diese Beiträge. Ist es möglich, das nur mit CSS zu machen? Das Bild per CSS zu laden und dann nach dem Klicken auf einen Button das Bild erscheinen zu lassen?