Es gibt einige verschiedene „traditionelle“ Wege, um Bilder per Lazy Loading zu laden. Sie alle erfordern, dass JavaScript ermittelt, ob ein Bild gerade im sichtbaren Bereich des Browsers oder nicht. Traditionelle Ansätze könnten sein:
- Abhören von
scroll- undresize-Ereignissen auf demwindow - Verwendung eines Timers wie
setInterval
Beides hat Leistungsprobleme.
Wenn Sie derzeit Lazy Loading zu den Medien Ihrer Website hinzufügen möchten, ist Lozad.js keine schlechte Wahl, aber native Unterstützung wird bald erfolgen, was bei Ihren Markup-Plänen berücksichtigt werden sollte.
Warum traditionelle Ansätze nicht performant sind?
Beide oben genannten Ansätze sind problematisch, da sie *wiederholt* *arbeiten* und ihre Funktion **erzwungene Layouts auslöst, während die Position des Elements in Bezug auf den Viewport berechnet wird, um zu prüfen, ob sich das Element innerhalb des Viewports befindet oder nicht.
Um diese Leistungsprobleme zu bekämpfen, *drosseln* einige Bibliotheken die Funktionsaufrufe, die diese Dinge tun, und begrenzen die Anzahl der Ausführungen.
Selbst dann verbrauchen wiederholte Layout-/Reflow-auslösende Operationen wertvolle Zeit, während ein Benutzer mit der Website interagiert, und verursachen "Junk" (dieses träge Gefühl bei der Interaktion mit einer Website, das niemand mag).
Es gibt einen anderen Ansatz, den wir verwenden könnten, der eine neue Browser-API nutzt, die speziell dafür entwickelt wurde, uns bei Dingen wie Lazy Loading zu helfen: die Intersection Observer API.
Genau das nutzt meine eigene Bibliothek, Lozad.js.

Was macht Lozad.js performant?
Intersection Observers sind die Hauptzutat. Sie ermöglichen die Registrierung von Callback-Funktionen, die aufgerufen werden, wenn ein überwachtes Element ein anderes Element (oder den Viewport selbst) betritt oder verlässt.
Während Intersection Observers nicht die genauen Pixel liefern, die sich überlappen, ermöglichen sie das Lauschen auf Ereignisse, die uns erlauben zu beobachten, ob Elemente Elemente um X% (konfigurierbar) betreten, *dann* wird der Callback ausgelöst. Das ist genau unser Anwendungsfall bei der Verwendung von Intersection Observers für Lazy Loading.
Schnelle Fakten zu Lozad.js
- Leichtgewichtig: nur 535 Bytes minifiziert & gzipped
- Keine Abhängigkeiten
- Verwendet die IntersectionObserver API
- Ermöglicht Lazy Loading von dynamisch hinzugefügten Elementen (nicht nur Bildern), allerdings mit einer benutzerdefinierten Ladefunktion
Verwendung
Installieren von npm
yarn add lozad
oder über CDN
<script src="https://cdn.jsdelivr.net/npm/lozad"></script>
Fügen Sie in Ihrem HTML einer beliebigen Bildklasse, die Sie per Lazy Loading laden möchten, eine Klasse hinzu. Die Klasse kann über die Konfiguration geändert werden, aber „lozad“ ist der Standard.
<img class="lozad" data-src="image.png">
Beachten Sie auch, dass wir das src-Attribut des Bildes entfernt und durch data-src ersetzt haben. Dies verhindert, dass das Bild geladen wird, bevor das JavaScript ausgeführt wird und feststellt, dass es geladen werden sollte. Es liegt an Ihnen, die Auswirkungen zu berücksichtigen. Mit diesem HTML werden Bilder erst angezeigt, wenn das JavaScript ausgeführt wird. Sie werden auch nicht in Kontexten wie RSS oder anderer Syndizierung angezeigt. Möglicherweise möchten Sie Ihr HTML filtern, um dieses Markup-Muster nur auf Ihrer eigenen Website zu verwenden und nicht anderswo.
Initialisieren Sie Lozad in JavaScript mit den Optionen
const observer = lozad(); // lazy loads elements with default selector as ".lozad"
observer.observe();
Lesen Sie hier über die vollständige Liste der verfügbaren Optionen in der Lozad.js API.
Demo
Sehen Sie den Pen oGgxJr von Apoorv Saxena (@ApoorvSaxena) auf CodePen.
Browser-Unterstützung
Die Browserunterstützung ist begrenzt, da die Funktion relativ neu ist. Verwenden Sie den offiziellen IntersectionObserver Polyfill, um die eingeschränkte Unterstützung dieser API zu überwinden.
„Die Browserunterstützung ist begrenzt, da die Funktion relativ neu ist. Verwenden Sie den offiziellen IntersectionObserver Polyfill, um die eingeschränkte Unterstützung dieser API zu überwinden.“
Bedeutet das, dass wir ihn selbst implementieren müssen, oder macht Lozad das automatisch?
Es klingt so, als ob wir es selbst tun müssen, aber wenn die Browserunterstützung begrenzt ist, denke ich, dass viele Leute ihn begehren werden. Vielleicht könnten Sie ihn in eine „fat-lozad“-Version aufnehmen?
Das ist ein guter Vorschlag, obwohl es ratsam wäre, den Polyfill von polyfill.io zu laden, so dass er nur in Browsern geladen wird, die die IntersectionObserver API nicht unterstützen, und auf diese Weise Browser, die die Funktion bereits unterstützen, keinen zusätzlichen Code laden müssen.
Ich mag diese Idee wirklich, aber wie würden Sie das in WordPress oder einem anderen CMS implementieren?
Sie müssten etwas Magie hinzufügen, um Bilder zu manipulieren, die „jetzt“ angezeigt werden sollen, aber später per Lazy Loading geladen werden sollen.
Als ich zum ersten Mal die Intersection API sah, war dies genau der Anwendungsfall, den ich mir vorstellte. Brauche nur noch ein paar Teile des Puzzles, um das hier fertigzustellen.
Können Sie alle „src“-Attributwerte mit einem Async/Defer-Trick beim Laden in JS entfernen? Ich habe das nicht ausprobiert, aber es *könnte* funktionieren… Aber es scheint hackisch zu sein (was ich im Allgemeinen ablehne…)
Ich habe ein grobes WordPress-Plugin erstellt, das eine angepasste Version von Lozad.js verwendet, um Bilder per Lazy Loading zu laden. Es fehlen einige Einstellungen, aber es funktioniert, es gibt eine Alternative für den Fall, dass JS deaktiviert ist, und Sie können wählen, den Polyfill im Backend hinzuzufügen. Sie finden das Plugin hier https://github.com/aderaaij/wp-image-preload
Funktioniert es für Hintergrundbilder, die über background-image geladen werden?
Ja, es funktioniert auch für das Lazy Loading von Hintergrundbildern. Fügen Sie das Attribut
data-background-imagezum per Lazy Loading zu ladenden Element hinzu, wie in der Anleitung erwähnt.Interessante Methode zum Lazy Loading von Bildern. Sie sollten vorsichtig mit dem Lotad-Bild in Ihrem Banner sein. Nintendo war in letzter Zeit nicht sehr nett zu Entwicklern, die ihr geistiges Eigentum nutzen.
Sicher, ich werde das bald beheben.
Danke für dieses Skript! Ich hoffe, es bald als WordPress-Plugin implementiert zu sehen! :)
Es sieht nicht so aus, als wäre es mit dem Picture-Element kompatibel?
Lozad.js unterstützt das Lazy Loading von responsiven Bildern. Öffnen Sie ein Issue auf Github, wenn es einen bestimmten Fall gibt, den Sie hervorheben möchten.
…mit der Website und verursacht „Junk“ (dieses träge Gefühl…
Ich denke, es sollte „Jank“ statt „Junk“ heißen.
http://jankfree.org/
Es macht mich fassungslos, dass so wenige Lazy Loader ein No-JS-Fallback und Unterstützung für das Picture-Element und srcset haben. Hier ist das Beste, das ich kenne und das dies tut (verwendet noch keine Intersection Observer): https://github.com/tvler/lazy-progressive-enhancement
Lozad.js FAQs erwähnt das No-JS-Fallback. Außerdem unterstützt es das Lazy Loading von responsiven Bildern. Lesen Sie hier.
Großartig!! Entschuldigung, ich wollte nicht andeuten, dass Ihre Lösung diese Unterstützung nicht hat. Ich habe nur auf einen anderen Kommentar bezüglich
<picture>reagiert. Danke für die Antwort und das Plugin, ich freue mich darauf, es auszuprobieren.Ich stimme zu. Ein WordPress-Plugin mit der Option, den Polyfill einzubinden, wäre großartig!
Das ist gut. Ich habe vor kurzem
IntersectionObserver-Unterstützung zu meinem eigenen Lazy Loading Skript hinzugefügt (https://github.com/malchata/yall.js), aber ich falle immer noch auf drosselnde Scroll-Event-Listener zurück. Ich bin froh, dass LeuteIntersectionObserververwenden, um dies zu erreichen, denn es hilft wirklich, Jank zu reduzieren. Weiter so, Mann.Wie wirkt sich das auf die SEO-Unterstützung aus? Werden Google die per Lazy Loading geladenen Bilder sehen?
Die FAQs beantworten Ihre Frage.
Hey, das ist großartig. Ich würde es gerne in IE9 funktionieren sehen. Selbst mit den Polyfills funktioniert es nicht. Ihre Demo funktioniert auch nicht: https://apoorv.pro/lozad.js/demo/
Es wäre großartig, hier eine Lösung zu haben!
Vielen Dank,
Sebastian
Bitte öffnen Sie ein Issue auf Github, und es wird priorisiert.
Apoorv, ich liebe die Bibliothek. Ich kann das Papyrus in Ihrem Logo jedoch nicht ertragen. Ernsthaft, ich werde Ihnen sogar kostenlos ein Logo machen.
Ich habe mir dasselbe gedacht
Danke, dass Sie Ihre Hilfe anbieten, Michael. Ich werde mich sicher bei Ihnen melden, um ein Logo für Lozad.js 2.0 zu entwerfen :)
Großartig Apoorv, ich meine es absolut ernst. Ich würde gerne helfen
Ich wollte Sie nur wissen lassen. Ich bin ein Freund der Leistung und sehe keine Vorteile (zumindest in meinem Projekt), dies in alten IE-Browsern zu haben. Hier ist der Code
Würde Lozad mit React und Virtual DOM funktionieren?
Ich habe das auf npm gefunden, aber es scheint ein leeres Repo zu sein https://www.npmjs.com/package/react-lozad
Ich versuche derzeit, ein Problem mit zu vielen Anfragen beim Seitenaufruf zu lösen und wollte Ihr Skript nutzen, aber aufgrund der Natur von React scheint es nicht zu funktionieren.
Any suggestions?
Danke!
Ja, es funktioniert mit React ohne die Verwendung anderer Module. Schauen Sie sich diesen https://codepen.io/PezCoder/pen/mBaOer an.
Was passiert, wenn src kaputt ist? Ich erhalte data-src vom Backend und habe einen Platzhalter in src, aber der Platzhalter wird ersetzt, auch wenn der Link vom Backend nicht existiert. Wie verhindere ich, dass Lozad den Platzhalter in src durch die URL in data-src ersetzt, wenn keine URL vorhanden ist?
PS. In den Entwicklertools erhalte ich src(unknown) data-loaded=“true“.
Bild-Slider mit Lozad von Travis McGeehan