Die meisten WordPress-Themes zeigen Benutzer- Gravatare in den Kommentar-Threads an. Es ist eine Möglichkeit, ein Bild mit dem Benutzer anzuzeigen, das mit der verwendeten E-Mail-Adresse verknüpft ist. Es ist eine nette Geste und heutzutage fast ein erwartetes Designmuster.
Jedes einzelne dieser Gravatare ist jedoch eine einzelne HTTP-Anfrage, wie jedes andere Bild auch. Ein Kommentar-Thread mit 50 Kommentaren bedeutet 50 HTTP-Anfragen, und das sind nicht immer besonders kleine Dateien. Igitt.
Lassen Sie sie Lazy Loaden.
Das Konzept
Lazy Loading ist die Idee, dass man das Bild gar nicht erst anfordert (keine HTTP-Anfrage), es sei denn, das Bild ist sichtbar. Das bedeutet, dass wir durch JavaScript festgestellt haben, dass das Bild sichtbar ist.

Um diese HTTP-Anfragen für noch nicht gesehene Bilder zu stoppen, müssen wir direkt am Markup ansetzen. Wenn sich ein <img src=""> im HTML befindet, gibt es im Grunde keine Möglichkeit, den Browser davon abzuhalten, dieses Bild so schnell wie möglich herunterzuladen, egal ob es sichtbar ist oder nicht. Wir müssen also das src entfernen und es wieder einfügen, wenn wir bereit sind.
Moment mal
Es lohnt sich, hier innezuhalten, denn wir haben uns in zwielichtige Gefilde begeben.
Indem wir das src dieser Bilder entfernen und es nur mit JavaScript wieder einfügen, haben wir uns entschieden, dass wir bereit sind, leicht ungültiges HTML auszuliefern und uns zu 100 % auf ein Skript zu verlassen, das heruntergeladen und ausgeführt wird, damit diese Bilder überhaupt sichtbar werden.
Damit bin ich einverstanden. Vor allem, weil Gravatare ohnehin nur eine Verbesserung darstellen. Es ist keine große Sache, wenn sie nie angezeigt werden. Ich bin kein Hardliner bei den meisten JavaScript-Debatten, aber dies scheint ein besonders klarer Fall zu sein, in dem wir uns ohne Bedenken auf JavaScript verlassen können.
Ändern des HTML
Das ist die Änderung, die wir vornehmen würden
<!-- Normal image. No beating the browser preloader. -->
<img src="https://gravatar.whatever..." alt="" />
<!-- Let's change to this, which won't download anything. -->
<img data-src="https://gravatar.whatever..." alt="" />
Obwohl ein fehlendes src im <img> technisch ungültiges HTML ist. Es ist höchstwahrscheinlich unwichtig, da es die Funktionsweise von nichts beeinträchtigt. Wenn das ungültige HTML stört, könnten Sie immer einen extrem minimalistischen, leeren GIF-Daten-URL einfügen, wie zum Beispiel:
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" ... />
Die Verwendung von width und height Attributen ist wahrscheinlich ebenfalls eine gute Idee, um das Layout beizubehalten und Reflows zu vermeiden, wenn und wann die Bilder geladen werden.
Ändern des HTML... in WordPress
Aber wie ändert man das HTML, das WordPress als Teil eines Kommentar-Threads ausgibt? Kommentare sind in WordPress etwas ungewöhnlich, da WordPress Core Ihnen das HTML liefert, es ist nicht Teil Ihres Themes wie die meisten anderen HTMLs.
Wahrscheinlich sehen Sie in Ihrer Datei `comments.php` diese Funktion
<?php wp_list_comments(); ?>
Welche einen Haufen <li>s mit Ihrem gesamten Kommentar-Thread ausgibt. Dort gibt es nicht viele Möglichkeiten, die Ausgabe von Bildern zu manipulieren. Außer, wir können es! Wir können dort eine Callback-Funktion angeben
<?php wp_list_comments('callback=csstricks_comment'); ?>
Dieser Callback ist der Name einer Funktion, die wir in unsere `functions.php`-Datei einfügen können. Hier ist ein Beispiel für diese Funktion, die ein <li> zurückgeben muss
function csstricks_comment($comment, $args, $depth) {
$GLOBALS['comment'] = $comment; ?>
<li <?php comment_class(); ?>">
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==" width="50" height="50" class="lazyload-gravatar" alt="User Avatar" data-src="<?php echo get_avatar_url(get_comment_author_email($comment_ID), array("size" => 160)); ?>">
<?php comment_text(); ?>
<?php # phantom </li> ?>
<?php }
Das ist sehr vereinfacht, aber Sie sehen, was wir getan haben. Wir haben das src durch das leere GIF ersetzt, wir haben einen class-Namen hinzugefügt, den wir schließlich in JavaScript für das Lazy Loading verwenden werden, wir haben ein data-src für das eigentliche Gravatar hinzugefügt und wir verwenden width und height Attribute für Platzhalter. Hier ist mein tatsächlicher vollständiger Callback, der aktuell auf CSS-Tricks live ist.
Wenn wir dies jetzt ohne jegliche JavaScript-Arbeit ausliefern würden, hätten wir immer noch einen perfekt funktionierenden Kommentar-Thread, nur mit Bildern, die nie laden.
Jetzt sind wir bereit für Lazy Loading
Der schwierige Teil ist vorbei. Wir sind jetzt perfekt für Lazy Loading vorbereitet. Wenn wir ein Skript schreiben würden, wäre es so
- Den sichtbaren Bereich des Browserfensters ermitteln
- Die Position auf der Seite für jedes Bild mit der Klasse
.lazyload-gravatarermitteln - Wenn eines dieser Bilder im sichtbaren Bereich liegt, den src-Wert durch den Wert von data-src ersetzen
- Wenn sich der sichtbare Bereich des Browserfensters auf irgendeine Weise ändert, das obige neu auswerten
Wir könnten uns daran machen, das selbst zu schreiben. Und wir könnten es schaffen! Aber, und ich bin sicher, das überrascht Sie nicht, es ist ein bisschen knifflig und nuanciert. Browserübergreifende Bedenken, Performance-Bedenken, funktioniert-das-auf-dem-Handy-Bedenken, um nur einige zu nennen. Das ist die Art von Ding, für die ich gerne auf die Arbeit anderer zurückgreife, anstatt sie selbst zu machen.
Auch hier keine Überraschung, es gibt jede Menge Optionen zur Auswahl. In meinem Fall verwende ich auf CSS-Tricks gerne jQuery und habe mich für eine jQuery-basierte Lösung entschieden, die für mich ziemlich gut aussah.

Die API ist denkbar einfach. Nachdem ich die Bibliothek mit den anderen verwendeten Bibliotheken gebündelt habe, rufe ich einfach auf
$('.lazyload-gravatar').Lazy();
Sehen Sie, wie gut das funktioniert!
Das sind eine ganze Menge gesparter HTTP-Anfragen und eine Menge gut für die Performance.
Man wünscht sich, dass sich Webstandards und Browser darauf einigen und es zu einer nativen Funktion machen.
Schöner Beitrag – Gravatare sind definitiv ein guter Kandidat für Lazy Loading, da manche Nutzer sie gar nicht zu sehen bekommen, was Ladezeit und Daten spart.
Eine Sache, die ich empfehlen würde, ist, anstatt src komplett zu entfernen, es durch einen Platzhalter zu ersetzen, wie zum Beispiel diesen – http://www.dfhtechnologies.com/images/user.png
So liefern Sie immer noch gültiges HTML aus, wenn das Skript fehlschlägt, ist zumindest etwas immer noch sichtbar und Sie können immer noch mit JavaScript verbessern. Das ist ein Gewinn für alle!
Er hat hierfür eine Daten-URL verwendet. Sieht weniger schick aus, aber wenn alles gut geht, sollte der Nutzer das Bild sowieso nie sehen.
Es spart auch eine HTTP-Anfrage.
Materie der Vorliebe, nehme ich an ;)
Stimmt, aber ich denke, wir sollten auch den Fall berücksichtigen, dass alles *nicht* gut läuft.
Langsame Datenverbindung, Browserunterstützung und Firewalls können alle dazu führen, dass eine JavaScript-Datei nicht reibungslos heruntergeladen und ausgeführt wird.
Siehe https://kryogenix.org/code/browser/everyonehasjs.html für mehr.
Durch die Verwendung eines Platzhalterbildes anstelle eines leeren GIFs sieht die Seite vollständig und nicht kaputt aus, selbst wenn das JavaScript fehlschlägt.
Und wenn das Sparen einer HTTP-Anfrage wichtig ist, können Sie das Platzhalterbild auch in eine Daten-URL umwandeln.
Ich hatte auf ein etwas intelligenteres Skript gehofft.
Momentan scrollen sie leer herein und brauchen eine halbe Sekunde, um angezeigt zu werden.
Könnten Sie den Bereich erweitern und sie abholen, wenn sie sich beispielsweise in 20vmax Nähe des sichtbaren Bereichs befinden?
Haben Sie die Option
thresholdgesehen, die Sie beim Initialisieren des Plugins einstellen können?Etwas wie das Folgende einzustellen, sollte den Trick tun. *Hinweis: Dies ist ungetestet*
Toller Artikel! Lazy Loading funktioniert in diesem Fall sehr gut und ist überraschenderweise ziemlich einfach.
Und ich stimme Adam Taylor zu, die Verwendung eines Platzhalters würde es Ihnen ermöglichen, gültiges HTML auszugeben, und es sähe besser aus als mit einem leeren GIF.
Tolle Abhandlung über das Warum und die möglichen Probleme.
Einige Vorschläge, die ich von einem Entwickler bei tweakers.net (niederländische Seite) gelernt habe und die ich gerne teilen würde, um einige der Probleme zu lösen.
Statt GIF (Adams Vorschlag ist ebenfalls großartig) könnten Sie data:svg verwenden. Sie können ihm die tatsächlichen Bildabmessungen geben.
Zweitens könnten Sie für Nicht-JS-Benutzer die echte Version des Bildes über ein noscript-Tag übergeben. Alles, was Sie brauchen, ist eine sehr einfache Prüfung, ob JS aktiviert ist, um die Version des Bildes anzuzeigen, die sich nicht im noscript-Tag befindet.
$tmpSrc = "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg'"
. " width='{$width}' height='{$height}'/%3E";
<noscript>
<img width='<?=$width?>' height='<?=$height?>' alt="<?=$alt?>" src="<?=$src?>">
</noscript>
<img width='<?=$width?>' height='<?=$height?>' alt="<?=$alt?>" src="<?=$tmpSrc?>" data-aym-lazy="<?=$src?>">
Und CSS
.no-js noscript + img {
display: none;
}
Die Variablen $width und $height etc. werden alle von einem anderen Code übergeben, der sein Bestes tut, um diese Werte von jedem Bild, sogar SVG, zu finden.
Ich hoffe, ich kann meinen eigenen unmoderierten Kommentar kommentieren.
Ich habe nicht wirklich spezifiziert, warum man tatsächliche Bildabmessungen haben möchte. Dies ist besonders nützlich für Orte, an denen Bilder responsive im Browser platziert werden müssen.
Nehmen wir zum Beispiel ein Bild, das 2000 Pixel breit und 500 Pixel hoch ist. Normalerweise würden Sie in Ihrem CSS etwas wie dieses deklarieren
img {
width: 100%;
height: auto;
}
Was würde passieren, wenn wir das temporäre Bild so in ein 1000 Pixel breites Fenster einfügen?
<img src='tmpimage1pxsquare.gif' width=2000 height=500 lazy-src='actualimage.jpg'>
Die angegebenen Breite- und Höhenattribute funktionieren nicht, da sie durch das CSS überschrieben werden.
Das Ergebnis ist ein temporäres Bild von 1000px x 1000px, das später zu 1000px x 250px transformiert wird, wenn das Originalbild geladen wird.
Neues Terrain für mich. Interessant. Außer, ich sehe auf DIESER Seite keine Gravatare (mit Firefox 52.0.2) – Haben Sie meinen Firefox als nur kosmetisch abgeschrieben oder ist das ein Fehler?
Überprüfen Sie Ihre Blocker-Add-ons. Einige blockieren Gravatare.
:Augenroll-Emoji