UPDATE: Das ist ziemlich alt. Wenn Sie heutzutage Bilder mit Lazy Loading laden möchten, empfehle ich Ihnen, sich Folgendes anzusehen:
- Der vollständige Leitfaden zum Lazy Loading von Bildern
- Native Lazy Load für die Webplattform
- Tips for rolling your own lazy loading
Verwenden Sie ein blank.gif als src für Bilder und geben Sie width und height des endgültigen Bildes an.
<img src="blank.gif" class="lazy" data-src="/images/full-size.jpg" width="240" height="152">
/* lazyload.js (c) Lorenzo Giuliani
* MIT License (http://www.opensource.org/licenses/mit-license.html)
*
* expects a list of:
* `<img src="blank.gif" data-src="my_image.png" width="600" height="400" class="lazy">`
*/
!function(window){
var $q = function(q, res){
if (document.querySelectorAll) {
res = document.querySelectorAll(q);
} else {
var d=document
, a=d.styleSheets[0] || d.createStyleSheet();
a.addRule(q,'f:b');
for(var l=d.all,b=0,c=[],f=l.length;b<f;b++)
l[b].currentStyle.f && c.push(l[b]);
a.removeRule(0);
res = c;
}
return res;
}
, addEventListener = function(evt, fn){
window.addEventListener
? this.addEventListener(evt, fn, false)
: (window.attachEvent)
? this.attachEvent('on' + evt, fn)
: this['on' + evt] = fn;
}
, _has = function(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
;
function loadImage (el, fn) {
var img = new Image()
, src = el.getAttribute('data-src');
img.onload = function() {
if (!! el.parent)
el.parent.replaceChild(img, el)
else
el.src = src;
fn? fn() : null;
}
img.src = src;
}
function elementInViewport(el) {
var rect = el.getBoundingClientRect()
return (
rect.top >= 0
&& rect.left >= 0
&& rect.top <= (window.innerHeight || document.documentElement.clientHeight)
)
}
var images = new Array()
, query = $q('img.lazy')
, processScroll = function(){
for (var i = 0; i < images.length; i++) {
if (elementInViewport(images[i])) {
loadImage(images[i], function () {
images.splice(i, i);
});
}
};
}
;
// Array.prototype.slice.call is not callable under our lovely IE8
for (var i = 0; i < query.length; i++) {
images.push(query[i]);
};
processScroll();
addEventListener('scroll',processScroll);
}(this);
See the Pen
Lazy Loading Images von Chris Coyier (@chriscoyier)
auf CodePen.
Haben Sie eine Demo?
Der obige Link heißt "Referenz-URL"
Habe es auf meiner Website getestet. Funktioniert einwandfrei.
Hier ist eine Demo, von dieser großartigen verwandten Bibliothek (die hier noch nicht verlinkt ist): http://afarkas.github.io/lazysizes/
Mehr Code dort, keine Ahnung, was sonst noch behandelt wird, aber es funktioniert einfach perfekt!
Schau es dir an.
https://css-tricks.de/examples/LazyLoading/
Mein Fehler. Funktioniert es nicht auf dem iPad, oder? Auf meinem iPad2 passiert nichts.
Dasselbe hier auf dem iPad 3 – nichts passiert, kein Fallback, selbst mit der letzten aktualisierten Version vom 23. Februar 2014...
Damit dies auf dem iPad funktioniert, müssen Sie nur Folgendes ändern:
addEventListener(‘scroll’,processScroll);
zu
addEventListener(‘touchmove’,processScroll);
Ich weiß, das ist veraltet, aber ich hatte dieses Problem auch. Auf Touch-Geräten wartet es, bis das Scrollen abgeschlossen ist, was auf dem iPhone ein leeres Bild für einige Sekunden bedeutet, während es langsam stoppt. Die Art, wie ich es mit dem Vorschlag von Matt behoben habe, war, Folgendes hinzuzufügen:
Und dann eine weitere Funktion schreiben, die, anstatt zu prüfen, ob es sich im Viewport befindet, Bilder einfach beim ersten Scrollen lädt.
Hat für meinen Fall funktioniert! Hoffentlich hilft es.
Chris, was passiert mit No-JS-Nutzern? Das klingt nicht nach einer guten Idee... wie man auf dem iPad etc. sehen kann ;)
@Anselm: iPad ist kein No-JS-Nutzer. Es ist ein Touch-/Mobilnutzer (anderes Scroll-Ereignis vielleicht?).
Ich denke, wir sind lange über die Station hinaus, an der wir Fallbacks für Nicht-JS (Standard-)Nutzer bauen sollten. Besonders bei Bildern.
Sie können einen einfachen Fallback im Markup verwenden
und in CSS mit modernizr.js
@Robin, Sie sollten immer einen Fallback für Benutzer ohne JavaScript-Unterstützung bereitstellen.
Sie könnten auch eine Funktion hinzufügen, die das DOM parst, um die Datenquelle nach dem Laden der Seite zu erstellen, die das src-Attribut dynamisch ersetzt.
Ich baue seit einiger Zeit einen schnellen, eigenständigen und robusten Lazy Loader.
Sie finden ihn hier: https://github.com/fasterize/lazyload
Warum nicht Kräfte bündeln? :)
Es gibt viele Anwendungsfälle, die Ihr Lazyloader nicht abdeckt, wie z.B. onload-inviewport-Bilder (also kein Scroll-Ereignis). Usw. (siehe Test/)
Es war großartig, Ihren Code zu lesen und zu vergleichen.
Vielen Dank
Ich habe Ihren Code ein paar Tage nach dem Schreiben meines hier auf dailyjs vorgestellten Codes gesehen. Wenn ich Patches habe, sende ich Ihnen einen Pull-Request.
Hier habe ich einen aktualisierten Gist: 2171438, ich kann mich nicht erinnern, was sich zwischen der eingereichten Version und dem Gist geändert hat.
Hallo Vincent! Funktioniert dieses Plugin mit der background-image Eigenschaft anstelle der Verwendung von Tags? Danke!
Das funktioniert nicht vollständig in meinem Blog...
Bitte helfen Sie mir bitte. . .
Ich stelle wahrscheinlich eine dumme Frage, aber... Wozu nützlich sein? Um Bilder langsamer zu laden, als sie sollten? Warum?
Bitte, ich versuche nicht, hart zu sein, ich verstehe das einfach nicht.
Es geht darum, unnötiges Laden von Bildern zu verhindern und die Bandbreitennutzung zu optimieren.
Wenn ein Benutzer Ihre Seiten durchklickt, warum sollten Sie Bandbreite für dieses Bild am Ende Ihres Beitrags verschwenden, wenn der Benutzer nie dorthin gescrollt hat, um es zu sehen?
Es geht darum, Bandbreite zu sparen. Auf einer Website mit hohem Traffic, sagen wir, 2 Millionen von 5 Millionen Benutzern besuchen einen Blog-Beitrag mit vielen Bildern, scrollen aber nie nach unten. Unterhalb der sichtbaren Fläche befinden sich 750 MB Bilder. Das spart Ihnen eine Menge Bandbreite (1,5 Millionen Megabyte...)
Es geht darum, sicherzustellen, dass die Leute online bleiben, während sie den Artikel lesen. Wenn ein Laptop-Benutzer stattdessen "schlau" sein und die Seite in einem Tab über WLAN zu Hause laden, in den Bus steigen und offline weiterlesen möchte, kann er die Bilder nicht sehen.
Hallo, für die beste Punktzahl bei PageSpeed Insights. Aber für ein besseres Erlebnis mit dem Handy...
Aber es funktioniert nicht mit Firefox und strikten Datenschutzeinstellungen :-(
Lazy Loading von Bildern dient dazu, das Laden von Bildern außerhalb des Browser-Viewports zu verzögern. Die Idee ist, dass diese Bilder keine Bandbreite beanspruchen müssen, bis kurz bevor sie benötigt werden, wodurch Platz für andere Ressourcen geschaffen wird, die schneller geladen werden können.
Letztendlich führt dies zu einer schnelleren Ladezeit der Webseite.
um ein Aufhängen des Servers aufgrund mehrerer schwerer Lastanfragen zu vermeiden
Ich gebe Ihnen.....
Eine jQuery-Version desselben Dings!
Schauen Sie es sich an, kritisieren Sie es gerne oder schlagen Sie Verbesserungen vor.
http://jsfiddle.net/g8THY/6/
Es ist kleiner als das Original, macht aber dasselbe, was gut sein kann, wenn Sie bereits jQuery verwenden...
Persönlich gefällt mir, wie diese Website es macht
http://www.nomachetejuggling.com/2011/11/11/the-star-wars-saga-suggested-viewing-order/
(Schnell nach unten scrollen.)
Ich mag, wie in diesem die img-Tags normale src-Attribute verwenden. Es ist viel einfacher zu implementieren, ohne spezielles Markup oder JS-Fallbacks für jedes Bild.
Leider scheint dies den gesamten Zweck von Lazy Loading zu verfehlen. Wenn man sich einen Netzwerk-Inspektor ansieht, habe ich gesehen, dass jedes Bild beim Laden der Seite geladen wird und beim Herunterscrollen ein zweites Mal geladen wird. Das vorübergehende Ausblenden der Bilder kann einige Leistungsvorteile haben, wie z. B. in Umgebungen mit wenig Speicher, wie älteren iPhones, aber es verhindert nicht den unnötigen Netzwerkverkehr, wie die Lösung von Coyier es tut.
Es wäre großartig, wenn wir das Beste aus beiden Welten bekommen könnten – normale Markups und echtes Lazy Image Loading – aber ich bezweifle, dass es möglich ist. Die Verwendung echter src-Attribute garantiert im Grunde, dass die Bilder zu laden beginnen, bevor JS eingreifen kann.
Ja, dieses funktioniert besonders gut.
Auf FF11, nach unten gescrollt, nichts passiert :\
Der vorherige Kommentar wurde nicht angezeigt (vielleicht Spam-Ordner ¿?)
Ihr Skript hat ein Problem mit Nebenläufigkeit. Während Sie das Bild mit Lazy Loading laden und wenn sich der Platzhalter noch im Cliprechteck befindet und Sie scrollen, fordern Sie das Bild immer wieder an, bis das Bild vollständig geladen ist. Sie müssen die Callback-Funktion verschieben, um das Bild aus dem Array zu entfernen, wenn Sie es zum ersten Mal angefordert haben.
Ich habe Schwierigkeiten, das in IE (große Überraschung) mit WordPress zum Laufen zu bringen und die Bilder über PHP zu laden. Irgendwelche Ideen, wie ich das zum Laufen bringen könnte?
Hallo Chris,
Ich wollte nur erwähnen, dass ich glaube, dass ein Fehler im Code ist. Ich denke, Sie verwenden die splice-Methode in der processScroll-Funktion falsch – der zweite Parameter sollte '1' statt 'i' sein. Ich hatte einige seltsame Ergebnisse mit splice(i, i) (natürlich).
Liege ich falsch?
Grüße
Dominique
Das ist nicht alles. Ich denke, es gibt mehrere Fehler
splice(i,1) statt (i,i), wie Dominique erwähnt hat.
Die Lambda-Funktion bindet nicht an das i der aktuellen Iteration – sie wird gleich dem abschließenden i. Das heißt, i==images.length. Deshalb bricht splice(i,i) nichts – Sie sagen immer splice(images.length, images.length), was eine Nulloperation ist.
Selbst wenn Sie eine lokale Kopie von i erstellen, damit die Lambda die richtige Indexnummer erhält, ist es immer noch der Index zum Zeitpunkt der Ausführung der Schleife. Wenn Sie mehrere Lambda-Funktionen ausführen, wird eine ausgeführt, und plötzlich können die Indizes der anderen falsch sein, da das Array darunter mutiert wurde.
Ich habe schließlich images in ein Objekt umgewandelt, mit den Indizes als Eigenschaften. Auf diese Weise werden die Indizes nicht ungültig, wenn Dinge entfernt werden.
Suchmaschinen werden diese Bilder nicht finden können, oder?
Hallo! Suchmaschinen lesen das alt-Tag des Bildelements. Wenn Sie die alt-Tags angegeben haben, findet die Suchmaschine die Bilder.
Das glaube ich nicht... Was ist mit der Bildersuche?? Wird die Suchmaschine die Bild-URL aus dem data-src-Attribut extrahieren?
Nein, werden sie nicht... Ich kann mir auch keine gute Möglichkeit vorstellen, sie auf andere Weise einzubetten, damit SE sie sehen. Sie könnten eine alternative, Standard-HTML-Seite bereitstellen, auf der die Bilder für SEs nicht mit Lazy Loading geladen werden (fangen Sie sie ab und leiten Sie sie um oder stellen Sie einfach einen Link unten/oben auf der Seite bereit).
Hallo, wahrscheinlich mehr Arbeit, als Leute mögen, aber eine Möglichkeit ist, den User-Agent zu prüfen, ob es sich um eine der beliebten Suchmaschinen handelt, dann, wenn es so ist, einfach die Bilder wie gewohnt laden. Ich bin mir jedoch nicht sicher, ob dies eine rote Flagge auslöst. Ich stelle mir vor, dass es auch möglich ist, dass sie alternative User-Agents an eine Website senden und Inhalte vergleichen, um potenzielle SE-Manipulationen zu erkennen. Nur ein Gedanke.
Chris: "Es geht darum, Bandbreite zu sparen."
Verringert es nicht auch die Ladezeit der Seite, was ein SEO-Faktor sein kann (wenn es schlecht genug ist)? Und ein Benutzerfreundlichkeitsfaktor, da es so aussieht, als ob einige Seitenfunktionalitäten nicht funktionieren, bis das DOM geladen ist (nervt mich bei unserer Lokalzeitungsseite – die Seite ist "eingefroren", bis ihr fehlerhafter Server alle Anzeigen geladen hat).
Danke für das Skript. Gibt es eine einfache Möglichkeit, einen Effekt hinzuzufügen? Wie ein Einblenden oder Verzögern?
Noch nicht ausprobiert, aber meiner Meinung nach wäre ein Ansatz für eine elegante Verschlechterung (und wahrscheinlich SEO-freundlicher) Links zu vollständigen Bildern.
Sie könnten einige Bilddaten (
width,height,alt/title) alsdata-Attribute im Link einfügenDann, über JS, Sie
1) Erstellen Sie das
<img />Tag. Imsrc-Attribut verwenden Sie einblank.gifund imdata-srcfügen Sie die URL zum vollständigen Bild ein (die Sie aus demhref-Attribut desa-Elements erhalten). Optional: für eine bessere Benutzererfahrung setzen Sie auchwidth,height,alt&title, die Sie ausdata-Attributen, ebenfalls auf dema-Element, erhalten.2) Sie laden diese wie üblich mit Lazy Loading, wenn der Benutzer die Seite scrollt.
Die Scraper/Spider/Bots lösen normalerweise die meisten JS-Ereignisse nicht aus, sodass keine dieser Attribute jemals ausgelöst würde.
Es gibt etwas, das Sie meiner Meinung nach übersehen haben.
Wenn JavaScript deaktiviert ist, werden überhaupt keine Bilder angezeigt, was aus Benutzersicht nicht gut ist.
Manche Leute ziehen es vor, ohne aktivierte JavaScript zu browsen, und Websites sollten ihre Funktionalität entsprechend zurückentwickeln.
In diesem Fall ist es besser, alle Bilder anzuzeigen, wenn JavaScript deaktiviert ist.
Auch wenn es mehr Bandbreite kostet, aber zumindest wird der Benutzer mit einer lesbaren Seite versorgt.
Nur Webentwickler finden Lazy Loading cool. (Die gleichen Leute, die früher dachten, Ajax sei cool... und davor Frames... was auch immer die Design-Mode-Du-Jour ist)
Das Problem mit Lazy Loading ist, dass es das schnelle Scannen durch das menschliche Auge verhindert. Tatsächlich geht Lazy Loading davon aus, dass das menschliche Auge nicht in der Lage ist, Bilder zu scannen.
Google hat seine Bildersuche mit Lazy Load zerstört.
Warum mögen so viele Webentwickler die einfache Navigation DEVOLVIEREN?
Versuchen Sie, hundert Bilder auf einer einzigen Seite anzuzeigen, selbst kleine.
Es geht nicht um Design, es glättet visuell-intensive Seiten.
Ja, und Google denkt auch, dass seine Bildersuche in Ordnung ist.
Monkey Engineers
Lazy Load funktioniert auf der Startseite, aber nicht auf anderen Seiten. Was könnte das Problem sein?
Wenn ich ein Framework oder ein CMS verwende, wie kann ich dieses Skript verwenden?
Crawlen Suchmaschinen den Link im "data-src"-Attribut?
Danke für die Inspiration. Ich weiß, dass es ein paar Lazy Load Image-Skripte gibt, aber ich habe mein eigenes erstellt: https://github.com/dinbror/blazy, das meiner Meinung nach einfacher zu verwenden ist und mehr Funktionen wie horizontales Lazy Loading, Multi-Serve-Bilder je nach Größe, Callback usw. bietet.
Ich würde mich sehr über Feedback dazu freuen.
Ich habe Ihren JS kopiert und eingefügt, und es funktionierte nicht, aber das Skript von Ihrer Demoseite funktionierte!
In der letzten Zeile
Hier ist es:-
addEventListener(‘scroll’,processScroll);
}(this); ——————————–> das funktionierte nicht
Und auf Ihrer Demoseite:-
addEventListener(‘scroll’,processScroll);
Ich bin Anfänger. Für mich funktionierten die meisten Ihrer Antworten nicht beim ersten Mal :/
Habe dasselbe Problem, hast du jemals eine Lösung gefunden?
Ich auch.
Hallo, hast du den Code im "strict" Modus ausgeführt?
Ich hatte dasselbe Problem. Und ich stellte fest, dass es im Non-Strict-Modus in Ordnung war.
Ich hoffe, das hilft Ihnen.
Danke dafür.
Ich habe 4 Versionen von Lazyload installiert und dieses spezielle Skript erzielt die besten Testergebnisse für die Seite.
Eine Frage, die ich habe, ist, wie ich Hintergrundbilder per Lazy Loading laden kann. Ich habe viele davon auf meiner Website.
Entschuldigung, was ist ein Lazy Loader?
Ich muss gestehen, ich bin ein Webentwickler, der Lazy Load nicht so toll findet (RE: Harlowe Thrombey's Kommentar), aus einem Grund: es verursacht Seitenruckeln. Wenn die Bilder nicht schnell genug laden, während Sie scrollen, friert Ihr Browser ein und Sie haben ein schreckliches, frustrierendes Seitenruckeln. Ich warte lieber ein paar zusätzliche Sekunden am Anfang des Seitenladens und kann reibungslos bis zum Ende scrollen, als anzufangen zu scrollen und alle 300 Pixel hängen zu bleiben.
Ich habe gesehen, dass es gut gemacht wurde, und wenn ein Effekt hinzugefügt wird und es kein Ruckeln gibt, sieht es ziemlich gut aus – Kunden scheinen es zu lieben und fragen oft danach.
Ich bemerkte Ruckeln, als ich zum ersten Mal die Referenz-URL in diesem Beitrag betrachtete... Gibt es eine Möglichkeit, abgesehen vom Vorladen, das den Zweck vereitelt, um sicherzustellen, dass es kein Ruckeln gibt? Liegt es an langsamen Verbindungen oder zu großen Bildern, die das Problem verursachen?
Übrigens, danke für all Ihre Arbeit, Chris! Ich denke, einige der Kommentare zu diesem Beitrag waren unnötig und unpassend – auch wenn ich kein Fan von Lazy Load bin, verwende ich Ihre Beiträge oft als Referenz und schätze Ihre Arbeit.
Sie werden es erst nützlich finden, wenn Sie eine Website haben, die wegen Bildern zu viel Bandbreite verbraucht.
Hallo, ist der schließende 'a'-Tag am Ende des img-HTML-Codes nur ein Fehler < / a > ?
Ja, das war ein Fehler, behoben, danke!
Hat jemand Lösungen für Lazy Load gefunden, die das data-src-Attribut nicht benötigen und einfach für alle img-Tags funktionieren? Ich habe mehrere Websites mit vielen Bildern, aber sie verwenden alle ein CMS, und ich möchte keine 5 Jahre alten Bilder neu eingeben, die über WYSIWYG-Inhalte eingegeben wurden.
Bild-Tags in der Datenbank parsen.
Seien Sie stattdessen faul ;)
https://github.com/dinbror/blazy
Einige von Ihnen könnten diese Lösung interessant finden.
http://codepen.io/Merri/pen/IiqEu
Kein data-src-Attribut, nur umschlossene img-Tags. Macht auch kein Lazyloading in IE9 und darunter, sodass Sie bei IE8 kein Seitenruckeln bekommen, das bei JS alles anhält. Und funktioniert auch gut auf dem iPad.
Ich möchte Lazy Loader für alle Divs auf meiner Website anwenden. Wie kann ich das machen?
Diese Technik funktioniert sehr gut für Inline-Bilder, aber wäre es möglich, sie anzupassen, um mit Bildern zu arbeiten, die per CSS geladen werden, oder, in meiner speziellen Neugier, von Drittanbietern mit JS?
Es wäre sehr schön, eine solche Funktion integriert oder kompatibel mit ResponsiveSlides zu haben.
Oder vielleicht mit Supersized, das zwar das Definieren von Bildern in einer JSON-Struktur erlaubt (was großartig für API-Konsumenten ist), aber diese unnötigerweise vorlädt, IMHO.
Funktioniert gut.
Danke!
Es funktioniert auf dem iPad – http://www.mr-box.com
Wie lade ich Bilder, kurz bevor sie in Sichtweite kommen? Wenn ich möchte, dass ein Bild 200 Pixel vor seinem Erscheinen im Viewport geladen wird, kann ich dann
rect.top >= 0zurect.top >= 200ändern?Danke. Funktioniert wie ein Zauber.
Funktioniert das nur mit PNG? Funktioniert es mit JPG? Meine sind leer.
Ich habe einen Lazy Loader geschrieben, der mit etwa 80% weniger Code als dieser auf alle Elemente angewendet werden kann. Er lädt auch wesentlich schneller und belastet die Website nicht.
Ein klassischer Fall von "Code oder es ist nicht passiert". Über diesen magischen Code zu sprechen, der einfach Wunder wirkt, bringt nichts.
Bilder sind auf blank.gif gesetzt, werden möglicherweise nicht von Google indiziert. Wie kann man dies so nutzen und suchmaschinenfreundlich gestalten? Irgendeine Idee? Danke!
Hallo
Eine weitere Lösung
Während JavaScript Bilder scannt, kann es `src` durch ein Lade-GIF ersetzen und dann, wenn das Bild ausgelöst wird, ersetzt es das Lade-GIF durch die URL (wie die erste) im `title`-Attribut, oder?
Für ein auf Isotope/Packery basierendes Layout, das Lazy Loading mit flexiblen Bildern mit einem variierenden Seitenverhältnis kombiniert, sehe ich keine andere Möglichkeit, als Inline-Padding-Bottom anzuwenden (wie in diesem Thread erwähnt, auf dem Server von PHP berechnet)
https://stackoverflow.com/questions/23416880/lazy-loading-with-responsive-images-unknown-height/23417812#23417812
Es funktioniert gut, aber die Anwendung von Inline-CSS scheint eine schlechte Praxis zu sein. Eine Alternative wäre, diese Informationen in ein Datenattribut zu packen und das Inline-CSS mit JavaScript anzuwenden, bevor das Packery/Isotope-Layout aufgerufen wird. Gedanken dazu?
Gibt es eine Möglichkeit, dies ohne Größenänderung und ohne Angabe von `width`- und `height`-Attributen für jeden Bild-Tag zu erreichen?
Ja, gibt es.
Ich habe einen kurzen Beitrag verfasst, der erklärt, wie: http://afroleft.com/lazy-loading-responsive-images/
Erstaunlich, vielen Dank!
Habe das gerade auf meiner Website implementiert, es funktioniert wie ein Zauber :)
Hallo, Entschuldigung
bedeutet `data-src=""` nicht, dass das Bild nicht angezeigt wird?
bedeutet `data-src=""` nicht, dass das Bild nicht angezeigt wird?
Hallo,
Ein kleines Problem mit diesem Code ist, dass die Funktion „_has“ definiert ist, aber nie verwendet wird.
Danke, es funktioniert großartig
Hallo,
Ich möchte Ihnen ein Update zeigen, das den Code SEO-freundlich macht. Unter http://ivopetkov.com/b/lazy-load-responsive-images/ sehen Sie, dass ich das `src`-Attribut beibehalten habe, wie es sein sollte (pfad/zum/bild.jpg), und ich habe ein `srcset` mit einem speziellen Wert hinzugefügt, der das Laden verhindert. Der Code ist unter https://github.com/ivopetkov/responsively-lazy verfügbar.
Das ist cool, aber mein einziges Problem ist, dass der Inhalt springt. Anders ausgedrückt: Das Platzhalterbild wird nicht in der richtigen Größe gerendert, dann wird das Original per Lazy Loading geladen und der Inhalt um das Bild herum verschiebt sich.
Gibt es eine Lösung für dieses Problem? Ich könnte die Klasse „.lazy“ nur auf Bilder beschränken, die unterhalb der Sichtlinie erscheinen, aber da meine Seiten Vorlagen sind, wäre das schwer zu automatisieren.
Kick, ich habe vor ein paar Jahren einen Leitfaden dazu geschrieben: http://afroleft.com/lazy-loading-responsive-images/
Ich hoffe, das hilft dir :)
Ich habe diesen Code verwendet und er funktioniert gut, aber nicht für versteckte Bilder. Können Sie mir bitte einen Hinweis geben, wie ich ihn für versteckte Bilder implementieren kann?
Vielen Dank im Voraus
Warum verwendet dieser Code `el.parent` anstelle von `el.parentNode`? Die Eigenschaft `el.parent` scheint in allen Browsern, die ich für Ihre Demoseite ausprobiert habe (IE11, Firefox, Chrome, Edge), undefiniert zu sein. Daher verwendet das Skript nie die Option `.replaceChild()`, was mich fragen lässt, warum sie überhaupt vorhanden ist.
Ich behaupte nicht, dass meine Version besser ist, aber sie ist etwas prägnanter. Ich berücksichtige keine älteren Browser, außer einem Fallback, der warten muss, bis jQuery geladen ist.
Irgendeine Idee mit einem einfachen JavaScript-Code bitte? Zu viel verbraucht meinen Denkprozessor, um den Code zu lesen. Lol :D
Ich habe ein sehr einfaches Lazyload-Skript geschrieben, das auch das `noscript`-Tag verwendet, damit Nicht-JS-Benutzer Bilder sehen können. Ich habe es erstellt, nachdem ich verschiedene Skripte ausprobiert und getestet hatte (aber keines davon gefiel mir zu 100%), und beschloss, die guten Aspekte all dieser Skripte zu vereinen. Holen Sie sich mein Skript hier und lassen Sie mich wissen: https://jsfiddle.net/nhed5ojy/3/
Tolles Skript, aber es gibt ein Problem, auf das ich gestoßen bin: Es ersetzt das Bild bei jedem Scroll-Ereignis durch `data-src`. Das bedeutet, dass das Bild wiederholt ersetzt wird, während Sie daran vorbeiscrollen. Bei einem statischen Bild nicht bemerkbar, aber bei einem GIF ist es ein großes Problem. Ein kleines Update der `loadImage()`-Funktion stellt sicher, dass das Bild nicht bereits geladen ist, bevor der Wechsel erfolgt.
Danke Matt K,
das macht das Scrollen viel flüssiger!
Danke! Aber ich habe ein Problem: Wenn sich Bilder in absoluter Position befinden, funktioniert es nicht. Hier ist ein Screenshot: http://joxi.ru/VrwogogCO4bdpr
Die Ladezeit von Online-Seiten ist entscheidend. Eine Möglichkeit, diesen Aspekt zu verbessern, ist die Verwendung von Lazy Load, das darin besteht, einen Inhalt erst dann zu laden, wenn er benötigt wird! In diesem DevCast sprachen wir über die Entwicklungszeit von DevMedia, die diese Technik kürzlich eingesetzt hat und in diesem Video vorstellt, was dafür benötigt wurde.
http://www.devmedia.com.br/adoramos-ajax/37919
Hallo, können Sie ein Update für `background: url();` machen?
Ich brauche das
Grüße
:)
Sehr hilfreich, ich schätze die Vanilla-JS-Lösung.
Nur eine kurze allgemeine Frage. Gibt es einen Vorteil, ein neues `Image()` in der `loadImage()`-Funktion zu erstellen und es dann zum Ersetzen des `
`-Tags im Markup zu verwenden, wie es der bereitgestellte Code tut, im Gegensatz zum direkten Überschreiben der Quelle des `
`-Tags im Markup (z. B. `el.src = el.getAttribute('data-src');`)?
Funktioniert dieses Beispiel, wenn Sie `srcset=""` und `sizes=""` innerhalb des `img`-Tags haben?
Ich habe hier mehrere Anfragen gesehen, dieses Plugin mit Hintergrundbildern funktionsfähig zu machen, und ich brauchte diese Funktion auch, also habe ich Ihr Plugin angepasst und die Funktion hinzugefügt.
Schön!
Hallo, haben Sie eine Demo?
Mit freundlichen Grüßen
Ja! Hier ist eine:
https://css-tricks.de/examples/LazyLoading/
Eine Frage: Werden Bilder mit Lazy Load von Google indiziert?
Wie funktioniert das für eine beliebige Anzahl von Bildern aus einem Verzeichnis? Sagen wir, Sie verwenden ein PHP-Skript, um die Liste der Bilder zu generieren, zum Beispiel. Bisher hat es bei mir nicht funktioniert.
Hallo, danke fürs Teilen von Snippets wie diesem :-)
Ich verwende oft einen anderen Ansatz, der für einige von Interesse sein könnte: https://medium.com/@iliketoplay/lazy-loading-a-flexible-and-performant-approach-5a46b97ef60f
Vielen Dank für den tollen Artikel. Wenn Sie hier React verwenden, habe ich eine Komponente entwickelt, die sehr einfach zu verwenden und zu integrieren ist.
Schauen Sie sich die Demo hier an
https://react-simple-img.now.sh/
Sollten Sie nicht jetzt den Intersection Observer verwenden? Ich habe gelesen, dass er deutlich besser ist als die manuelle Berechnung mit `getBoundingRect`.
Sehr hilfreich, ich stoße da normalerweise auf Probleme. Danke.
Hier ist eine Änderung, die ich für meine Website vorgenommen habe: Sie müssen nicht mehr die Klasse "lazy" hinzufügen, nur "data-src". Sie fügt auch "data-background" für `background-image` CSS anstelle von `src` hinzu.
images.splice(i, i);
Finden Sie nicht, dass das hier falsch ist.
Sie splitten 'i' Elemente in jeder Iteration.
Ändert das Splitten nicht die Indizes beim Schleifen?
Endlich Lazy Loading auf meiner Website implementiert. Danke Mann