Bilder für Core Web Vitals optimieren

Erfahren Sie, wie Bilder die Core Web Vitals beeinflussen und wie Sie sie optimieren können

Arjen Karel Core Web Vitals Consultant
Arjen Karel - linkedin
Last update: 2024-11-27

Wie können Bilder die Core Web Vitals beeinflussen?

Bilder spielen eine wichtige Rolle bei der Verbesserung der visuellen Attraktivität einer Website, können aber auch einen erheblichen Einfluss auf deren Ladegeschwindigkeit haben. Core Web Vitals sind eine Reihe von Metriken, die Google verwendet, um die Benutzererfahrung einer Website zu messen, und Bildoptimierung ist ein entscheidender Faktor, um gute Ergebnisse zu erzielen. In diesem Artikel werden wir besprechen, wie Sie Bilder für Core Web Vitals optimieren und die Ladegeschwindigkeit Ihrer Website verbessern können.

Core Web Vitals verstehen

Bevor wir in die Bildoptimierung eintauchen, lassen Sie uns kurz die Core Web Vitals überprüfen. Es handelt sich um eine Reihe von benutzerzentrierten Metriken, die die Ladegeschwindigkeit, Interaktivität und visuelle Stabilität einer Webseite messen. Die drei Hauptmetriken sind:

Largest Contentful Paint (LCP): misst die Ladegeschwindigkeit des größten Elements auf der Seite.
First Input Delay (FID): misst die Zeit, die es dauert, bis die Seite interaktiv wird.
Cumulative Layout Shift (CLS): misst die visuelle Stabilität der Seite.

Welche Core Web Vitals können Bilder beeinflussen?

Sie werden vielleicht überrascht sein zu erfahren, dass Bilder alle Core Web Vitals beeinflussen können. Bilder, wenn sie während des Renderings spät in die Warteschlange für den Download gestellt werden oder wenn sie einfach zu groß sind, führen normalerweise zu einem hohen LCP Score. Wenn Bildabmessungen nicht festgelegt sind oder sich während der Ladephase ändern, können Bilder auch den CLS-Score beeinflussen. Und schließlich, wenn die Bilddecodierung zu viel Arbeit im Main Thread beansprucht, können sie sogar den INP beeinflussen. Schauen wir uns das genauer an:

Largest Contentful Paint

Einer der Core Web Vitals ist Largest Contentful Paint (LCP), der misst, wie lange es dauert, bis das größte Element auf der Seite (wie ein Bild oder Video) für den Benutzer sichtbar wird. Wenn ein Bild zu spät eingereiht wird oder zu lange zum Laden benötigt, kann dies den LCP-Score der Seite erheblich verlangsamen.

Cumulative Layout Shift

Ein weiterer Core Web Vital ist Cumulative Layout Shift (CLS), der misst, wie stark sich der Inhalt auf einer Seite verschiebt, während sie lädt. Bilder können Layout-Verschiebungen verursachen, wenn sie nicht die richtige Größe haben oder wenn sie in die Seite eingefügt werden, nachdem diese bereits geladen wurde, was dazu führt, dass sich andere Elemente verschieben.

First Input Delay und INP

Schließlich können Bilder auch den dritten Core Web Vital beeinflussen, den INP, der die Zeit misst, die eine Seite benötigt, um visuell zu reagieren, nachdem ein Benutzer mit einer Seite interagiert hat. Wenn es zu viele große Bilder gibt, die decodiert werden müssen, kann es länger dauern, bis die Seite auf Benutzerinteraktionen reagiert, was zu einem schlechten INP-Score führt.

Schritt 1: Optimieren Sie das HTML-Bildelement für Geschwindigkeit

Das erste, was Sie bei der Optimierung von Bildern überprüfen sollten, ist der HTML-Code für alle Bilder. Bilder sind einfach und Browser sind großartig darin, einfache Aufgaben zu erledigen. Vermeiden Sie also Tricks und clevere Lösungen und verwenden Sie einfach das gute alte html image tag <img> und nutzen Sie alle Optionen, die Sie haben, um Ihre Bilder zu beschleunigen!

Src-Attribut

Gibt die URL des Bildes an. Diese Eigenschaft ist wichtig, da sie dem Browser mitteilt, wo das Bild zu finden ist.

Width- und Height-Attribut

Gibt die Breite und Höhe des Bildes in Pixeln an. Diese Eigenschaften sind wichtig, um das Bild korrekt auf der Seite zu rendern, da sie die Größe des Bildcontainers definieren und wie das Bild hineinpasst.

Alt-Attribut

Gibt alternativen Text für das Bild an, falls es nicht angezeigt werden kann. Dies ist wichtig für Zwecke der Barrierefreiheit, da es sehbehinderten Benutzern hilft zu verstehen, worum es im Bild geht. Es ist auch wichtig für die Suchmaschinenoptimierung (SEO), da Suchmaschinen den Alt-Text verwenden, um den Inhalt des Bildes zu verstehen.

Loading-Attribut (Lazy Loading)

Gibt an, wie der Browser das Bild laden soll (lazy, eager oder auto). Diese Eigenschaft ist wichtig für die Verbesserung der Seitenleistung, da sie es ermöglicht, dass Bilder asynchron geladen werden und nur dann, wenn sie benötigt werden.

Srcset-Attribut

Gibt eine kommagetrennte Liste von Bildquellen und deren Größen an, mit denen der Browser die beste Bildquelle basierend auf der Bildschirmgröße und Auflösung des Geräts auswählen kann. Diese Eigenschaft ist wichtig für responsives Design, da sie sicherstellt, dass Benutzer die bestmögliche Bildqualität erhalten, unabhängig von ihrem Gerät.

Sizes-Attribut

Gibt die Größen der zu verwendenden Bildquelle basierend auf der Viewport-Größe an. Diese Eigenschaft arbeitet zusammen mit srcset, um sicherzustellen, dass die korrekte Bildgröße auf verschiedenen Geräten und Bildschirmgrößen geladen wird, was die Gesamtleistung der Seite verbessert.

Decoding-Attribut

Gibt an, wie der Browser das Bild decodieren soll (async, sync oder auto). Diese Eigenschaft ist auch wichtig für die Verbesserung der Seitenleistung, da sie es dem Browser ermöglicht, die Decodierung des Bildes gegenüber dem Rendern des Rests der Seite zu (de)priorisieren.

Fetchpriority-Attribut

Das fetchpriority-Attribut gibt die Priorität des Abrufs einer Ressource relativ zu anderen Ressourcen auf der Seite an. Das priority-Attribut kann einen von drei Werten haben: "high", "medium" oder "low". Eine Ressource mit einer hohen Priorität wird vor Ressourcen mit mittlerer oder niedriger Priorität geladen. Eine Ressource mit einer mittleren Priorität wird vor Ressourcen mit einer niedrigen Priorität geladen. Ressourcen mit derselben Priorität werden in der Reihenfolge geladen, in der sie im HTML erscheinen.

Schritt 2: Stellen Sie sicher, dass das Bild so früh wie möglich für den Download in die Warteschlange gestellt wird

Das zweite, was zu tun ist, nachdem Sie das HTML optimiert haben, ist die Bildplanung. In vielen Fällen ist der größte Engpass, wenn es um Bilder geht, die die LCP-Metrik beeinflussen, späte Planung. Wenn ein Browser eine Chance hat, das LCP-Element früh während des Renderprozesses herunterzuladen, wird das Bild so früh wie möglich für den Browser verfügbar sein und der Browser kann beginnen, dieses Element früh im Renderprozess zu malen.

Klingt einfach, oder? Nun, wie stellen wir sicher, dass das Bild so früh wie möglich für den Download in die Warteschlange gestellt wird.

Preloaden Sie das LCP-Element

Der effektivste Weg, einen frühen Download zu gewährleisten, ist das Preloaden des Bildes. Das Preloaden des Bildes erfolgt mit einem einfachen Tag am Anfang des <head> Elements. Zum Beispiel:

<link rel="preload" as="image" href="image.jpg">

Dieser einfache Tag teilt dem Browser mit, dass wir "image.jpg" ziemlich bald benötigen, und der Browser wird sofort beginnen, diese Datei herunterzuladen.

Eager load das LCP-Element

Sie sollten LCP-Elemente immer vermeiden, lazy zu laden. Wenn Sie das LCP-Element lazy laden, ist JavaScript-basiertes Lazy Loading besonders schlecht für PageSpeed! JavaScript-basiertes Lazy Loading verlässt sich auf ein Skript, um Ihren <img> Tag neu zu schreiben. Normalerweise hat das img ein data-src Attribut, das durch JavaScript in ein scr Attribut umgeschrieben wird. Das Problem dabei ist zweifach
1. Der Browser Preload Scanner erkennt das data-src Attribut nicht und wird das Element nicht proaktiv für einen frühen Download triggern.
2. JS-basiertes Lazy Loading muss warten, bis ein JavaScript geladen und ausgeführt ist. Dies geschieht normalerweise relativ spät während des Renderprozesses. Dies verursacht eine noch größere Verzögerung für das Bild.

Um dieses Problem ganz zu vermeiden, stellen Sie sicher, dass das LCP-Element immer eager geladen wird. Da 'eager' der Standard für jedes Bild ist, müssen Sie nur sicherstellen, dass das Bild nicht lazy geladen wird. Tun Sie dies, indem Sie das native 'loading="lazy" Attribut' entfernen oder wenn Sie ein Optimierungs-Plugin verwenden, überprüfen Sie die Dokumentation, wie Sie Lazy Loading für ein Bild überspringen können!

Verwenden Sie hohe fetchpriority

Wenn Sie aus irgendeinem Grund das LCP-Element nicht preloaden können, stellen Sie zumindest sicher, dass das Element das fetchpriority Attribut auf high gesetzt hat. Dies gibt dem Browser einen Hinweis, dass das Bild wichtig für die Seite ist und der Browser wird es mit einer hohen Priorität herunterladen. Bitte beachten Sie, dass die Verwendung von fetchpriority="high" normalerweise nicht so effizient ist wie das Preloaden eines Bildes!

Vermeiden Sie JavaScript-basiertes Lazy Loading

Sie sollten LCP-Elemente immer vermeiden, lazy zu laden. Wenn Sie das LCP-Element lazy laden, ist JavaScript-basiertes Lazy Loading besonders schlecht für PageSpeed! JavaScript-basiertes Lazy Loading verlässt sich auf ein Skript, um Ihren <img> Tag neu zu schreiben. Normalerweise hat das img ein data-src Attribut, das durch JavaScript in ein scr Attribut umgeschrieben wird. Das Problem dabei ist zweifach
1. Der Browser Preload Scanner erkennt das data-src Attribut nicht und wird das Element nicht proaktiv für einen frühen Download triggern.
2. JS-basiertes Lazy Loading muss warten, bis ein JavaScript geladen und ausgeführt ist. Dies geschieht normalerweise relativ spät während des Renderprozesses. Dies verursacht eine noch größere Verzögerung für das Bild.

Schritt 3: Stellen Sie sicher, dass das Bild so schnell wie möglich heruntergeladen wird

Das dritte, was zu tun ist, ist sicherzustellen, dass Sie keine kostbaren Netzwerkressourcen für Bilder verschwenden, die größer sind als sie sein sollten. Sie können dies tun, indem Sie responsive Image verwenden, Komprimierung verwenden und neue und schnellere Bildcontainer verwenden

Responsive Images

Eines der häufigsten Probleme mit dem LCP ist das Senden eines 'Hero Image' in voller Größe für Desktop von 1920x1200px an ein mobiles Gerät, das das Bild mit etwa 360x225 rendert. Das bedeutet, dass das Bild etwa 28 Mal größer ist als es sein sollte (sicher, Sie könnten Bilder mit einer höheren DPI senden, dann wäre das Bild in voller Größe 7 Mal größer!)!
Das ist, wo responsive Images ins Spiel kommen! Responsive Images senden eine andere Version eines Bildes an verschiedene Viewports. Das bedeutet, dass wir ein kleines Bild an einen mobilen Browser senden können, ein etwas größeres Bild an ein Tablet und ein Bild in voller Größe an einen Desktop, um sicherzustellen, dass keine unnötigen Bytes gesendet werden!

Bildkomprimierung

Bildkomprimierung lässt Sie die Dateigröße eines Bildes reduzieren, während der größte Teil der visuellen Qualität erhalten bleibt. Es umfasst verschiedene Techniken, die redundante oder irrelevante Daten eliminieren. Die meisten modernen CMS-Systeme wenden Bildkomprimierung an, wenn Bilder in die Bibliothek hochgeladen werden. Wenn Sie jedoch die Bibliothek umgehen oder Ihre eigene benutzerdefinierte Lösung verwenden, überprüfen Sie immer, ob Bilder das richtige Komprimierungsniveau haben!

Neue und schnellere Bildcontainer

Bilder sind oft eine der größten Ressourcen auf einer Webseite, und sie können die Ladegeschwindigkeit einer Seite erheblich verlangsamen, wenn sie nicht optimiert sind. Neuere und schnellere Bildcontainer wie die WebP- und AVIF-Formate können helfen, die Dateigröße von Bildern zu verringern, ohne ihre Qualität zu opfern. Das bedeutet, dass sie schneller geladen werden können, was die Ladegeschwindigkeit der Seite verbessern kann.

Schritt 4: Eliminieren Sie Layout Shift!

Bilder, die ihre Größe ändern, während sie laden, verursachen einen Layout Shift. So einfach ist das. Es gibt 3 Hauptgründe, warum Bilder einen Layout Shift verursachen (es gibt eigentlich viel mehr, aber diese 3 sind die häufigsten)

1. Fehlende Bildabmessungen

Bildabmessungen sind das Width-Attribut und das Height-Attribut des Bildes. Wenn das Width- oder das Height-Attribut nicht gesetzt ist, weiß der Browser nicht, wie viel Platz er für das Bild während des Renderns reservieren soll und reserviert 0 Pixel für jede fehlende Dimension.

Das bedeutet, dass ein Bild ohne gesetzte Breite und Höhe mit 0x0 Pixeln rendert und dann, wenn das Bild geladen und decodiert ist, der Browser das Layout neu berechnet, um die richtige Menge an Platz für das Bild zu verwenden.

2. Styling-Probleme

Normalerweise wird verhindert, dass Bilder größer als der Viewport werden, durch einen einfachen CSS-Trick

img{
   max-width:100%;
height:auto; }

Dies ist ein großartiger Trick und Sie sollten ihn verwenden. Leider sehe ich regelmäßig Varianten dieses Tricks, die einen Layout Shift verursachen. Zum Beispiel durch Hinzufügen von width:auto:

img{
   max-width:100%;
height:auto; width:auto; }

Dies führt dazu, dass jedes Bild mit einer automatischen Breite und Höhe rendert. Dies bedeutet normalerweise, dass der Browser das Bild mit 0x0px rendert, bevor das Bild heruntergeladen wurde

3. Platzhalter

Einige JavaScript-basierte Lazy Loading Skripte verwenden Platzhalter. Wenn Sie eine Art CSS-Trick wie den oben genannten max-width:100% und height:auto verwenden, dann stimmt die Autoheight des quadratischen Platzhalters nicht mit dem Height- Attribut des Bildes überein. Im Grunde wird das Bild zuerst mit dem quadratischen Platzhalter bei 720x720 rendern und wenn das endgültige Bild heruntergeladen wurde, wird es bei 720*180 rendern

<img 
  src="1x1placeholder.png" 
  data-src="hero.png" 
  width="720" 
  height="180"
  style="height:auto;max-width:100%"
>


Schritt 5: Schützen Sie den Main Thread

Das nächste, worauf Sie achten sollten, ist, dass nicht zu viele Bilder gleichzeitig im Main Thread decodiert werden. Normalerweise ist dies kein Problem, aber ich habe es oft auf Produktübersichtsseiten gesehen (wo manchmal bis zu 500 Bilder um Ressourcen konkurrieren!).

Der Trick besteht darin, decoding="async" zu allen Bildern hinzuzufügen, um sicherzustellen, dass diese Bilder auf einem separaten Thread decodiert werden können. Versuchen Sie auch zu vermeiden, dass so viele Bilder alle gleichzeitig decodiert werden, indem Sie loading="lazy" zu allen Below the Fold und versteckten Bildern hinzufügen.

Schritt 6: Wählen Sie die richtige Strategie für jedes Bild!

Der letzte und manchmal wichtigste Schritt ist, wichtige Bilder zu priorisieren und unwichtige Bilder zu depriorisieren!

Bildstrategien für das LCP-Element

Das LCP-Element ist normalerweise das wichtigste visuelle Element. Dieses müssen wir also wirklich priorisieren."

  1. Preloaden Sie das Bild früh im Head der Seite mit diesem Code: <link rel="preload" as="image" href="path-to-img.png">
  2. Weisen Sie den Browser an, dass dieses Bild nicht lazy geladen werden soll, indem Sie loading="eager" setzen oder das Loading-Attribut weglassen
  3. Geben Sie dem Browser einen Hinweis, dass dieses Bild mit hoher Priorität heruntergeladen werden soll, indem Sie fetchpriority="high" verwenden (wenn Sie das Bild preloaden, können Sie diesen Teil überspringen)
  4. Setzen Sie decoding="sync", da dieses Element so wichtig ist, dass wir es im Main Thread decodieren wollen

Bildstrategie für Logos und andere sichtbare (Nicht-LCP) Bilder

Sichtbare Bilder sollten ziemlich bald während des Ladens der Seite geladen werden, aber vorzugsweise nach dem LCP-Element. Wir können dies erreichen, indem wir das LCP-Element preloaden. Das gibt diesen sichtbaren Bildern ihre natürliche, korrekte Download-Reihenfolge.

  1. Weisen Sie den Browser an, dass dieses Bild nicht lazy geladen werden soll, indem Sie loading="eager" setzen oder das Loading-Attribut weglassen
  2. Setzen Sie decoding="async", da dieses Element sicher außerhalb des Main Threads decodiert werden kann!

Bildstrategie für Below-the-fold Bilder

Alle Below-the-fold Bilder sollten lazy geladen werden. So einfach ist das! Es gibt keine Ausnahmen!

  1. Weisen Sie den Browser an, dass dieses Bild lazy geladen werden soll, indem Sie loading="lazy" setzen
  2. Setzen Sie decoding="async", da dieses Element sicher außerhalb des Main Threads decodiert werden kann!

Vermeiden Sie Hintergrundbilder

Wenn Sie Hintergrundbilder verwenden, müssen Sie dies überdenken. Hintergrundbilder können nicht lazy geladen werden und Sie können die Decoding-Eigenschaft nicht steuern und Sie können die Fetchpriority nicht setzen. Hintergrundbilder sind normalerweise nicht responsive, was Sie wahrscheinlich viel Bandbreite kostet. Aber am wichtigsten: Hintergrundbilder werden normalerweise entdeckt, nachdem der Browser die CSS-Dateien heruntergeladen hat. Dies ist fast nie der richtige Zeitpunkt, um einen Bilddownload auszulösen!

Sie können normale Image-Tags in Kombination mit CSS object-fit:cover verwenden, um normale Bilder sich als Hintergrundbilder verhalten zu lassen!

Lab data is not enough.

I analyze your field data to find the edge cases failing your user experience.

Analyze My Data >>

  • Real User Data
  • Edge Case Detection
  • UX Focused
Bilder für Core Web Vitals optimieren Core Web Vitals Bilder für Core Web Vitals optimieren