Bilder einbinden
Zuletzt geprüft am von Daniel Weihmann

Ein Bild einzubinden ist eine Zeile HTML. Ein Bild richtig einzubinden
heißt: Es hat einen Alternativtext, es reserviert seinen Platz, bevor es da
ist, es lädt in einer Größe, die zum Gerät passt, und es blockiert nicht den
Aufbau der Seite. Alle vier Punkte lassen sich mit Attributen am
<img>-Element erledigen.
Die Grundform
<img src="/bilder/werkstatt.jpg"
alt="Zwei Mitarbeiter montieren ein Fensterelement"
width="1200" height="800"
loading="lazy" decoding="async">
<img> ist ein leeres Element, es hat kein schließendes Tag.
Der Schrägstrich am Ende (<img … />) stammt aus XHTML, ist
in HTML5 erlaubt und ohne Wirkung.
Der Alternativtext
Der alt-Text ersetzt das Bild, er beschreibt es nicht von außen.
Die Frage lautet also nicht „was ist zu sehen", sondern „was stünde hier, wenn
das Bild fehlte". Er wird gebraucht, wenn ein Bild nicht lädt, wenn jemand
einen Screenreader nutzt, und er ist der Text, den Suchmaschinen dem Bild
zuordnen.
-
Dekoration bekommt
alt="". Ein leeres Attribut heißt „hier ist nichts zu holen", das Bild wird übersprungen. Das Attribut ganz wegzulassen ist etwas anderes: Dann liest der Screenreader ersatzweise den Dateinamen vor. - Verlinkte Bilder beschreiben das Ziel, nicht das Motiv.
- Kein „Bild von" am Anfang – dass es ein Bild ist, sagt der Screenreader selbst.
- Text im Bild gehört in den Alternativtext, und zwar vollständig. Besser noch: Text nicht ins Bild legen.
width und height verhindern Layoutsprünge
Ohne Maßangaben weiß der Browser erst beim Eintreffen des Bildes, wie viel Platz es braucht – und schiebt in dem Moment alles darunter nach unten. Wer schon zu lesen begonnen hatte, verliert die Zeile. Google misst diesen Effekt als Cumulative Layout Shift und rechnet ihn in die Bewertung der Seite ein.
Die Lösung ist alt und einfach: width und height mit
den tatsächlichen Pixelmaßen der Datei angeben. Moderne
Browser errechnen daraus das Seitenverhältnis und halten den Platz frei, noch
bevor ein Byte des Bildes da ist.
Der Haken, in den fast jeder einmal läuft: Sobald im CSS
img { max-width: 100% } steht, skaliert die Breite mit – die
Höhe aber bleibt beim Attributwert stehen, und das Bild wird gestaucht.
Deshalb gehört height: auto zwingend dazu:
img { max-width: 100%; height: auto; }
Welches Format
- JPEG
-
Fotos. Universell lesbar, deshalb weiterhin die sichere Wahl für
Vorschaubilder, die in fremden Systemen landen – etwa als
og:imagefür geteilte Links. - PNG
- Grafiken mit harten Kanten, Screenshots und alles mit Transparenz. Bei Fotos unnötig groß.
- WebP
- Deutlich kleiner als JPEG bei gleicher Qualität, kann Transparenz und wird von allen aktuellen Browsern angezeigt. Für Bilder auf der eigenen Seite heute der Normalfall.
- AVIF
-
Noch einmal spürbar kleiner als WebP, dafür langsamer beim Kodieren. Sinnvoll
als erste Wahl in
<picture>, mit WebP oder JPEG als Rückfallebene. - SVG
- Logos, Symbole, Diagramme. Skaliert verlustfrei und bleibt bei einfachen Formen winzig. SVG kann Skripte enthalten – Dateien aus fremder Quelle also nicht ungeprüft einbinden.
Responsive Bilder mit srcset
Ein Bild, das auf dem Desktop 1200 Pixel breit dargestellt wird, ist auf einem
Telefon dreimal zu groß. Mit srcset hinterlegt man mehrere
Fassungen und überlässt dem Browser die Wahl – der kennt Bildschirmbreite,
Pixeldichte und teils auch die Verbindungsqualität.
<img src="/bilder/halle-800.jpg"
srcset="/bilder/halle-400.jpg 400w,
/bilder/halle-800.jpg 800w,
/bilder/halle-1600.jpg 1600w"
sizes="(min-width: 60rem) 40rem, 100vw"
alt="Blick in die Montagehalle"
width="800" height="533">
Die w-Angaben nennen die echte Pixelbreite der
jeweiligen Datei, nicht die Darstellungsgröße. sizes beschreibt,
wie breit das Bild im Layout sein wird – hier ab 60 rem Fensterbreite
40 rem, sonst die volle Breite. Ohne sizes nimmt der Browser
100vw an und lädt regelmäßig zu große Dateien.
Das src-Attribut bleibt als Rückfallebene stehen. Es gehört
weiterhin dazu, auch wenn kein aktueller Browser mehr darauf angewiesen ist.
picture für Formate und Ausschnitte
<picture> wird gebraucht, wenn nicht nur die Größe variiert,
sondern das Bild selbst. Zwei Fälle:
<picture>
<source srcset="/bilder/team.avif" type="image/avif">
<source srcset="/bilder/team.webp" type="image/webp">
<img src="/bilder/team.jpg" alt="Das Team vor dem Bürogebäude"
width="1200" height="800">
</picture>
<picture>
<source media="(min-width: 48rem)" srcset="/bilder/panorama.jpg">
<img src="/bilder/hochformat.jpg" alt="Marktplatz mit Rathaus"
width="600" height="800">
</picture>
Wichtig ist die Reihenfolge: Der Browser nimmt die erste passende
Quelle und schaut nicht weiter. Das <img> steht immer zuletzt
und trägt alt, width und height – die
<source>-Elemente tun das nicht.
Ladeverhalten steuern
- loading="lazy"
- Das Bild wird erst geladen, wenn es in die Nähe des sichtbaren Bereichs kommt. Für alles unterhalb des ersten Bildschirms sinnvoll. Nicht am ersten großen Bild verwenden – dort verzögert es genau die Anzeige, auf die gemessen wird.
- decoding="async"
- Erlaubt dem Browser, das Bild nebenher zu dekodieren, statt den Seitenaufbau dafür anzuhalten. Schadet nirgends.
- fetchpriority="high"
-
Zieht ein Bild in der Warteschlange nach vorn. Gedacht für das eine große
Bild oben auf der Seite, üblicherweise zusammen mit
loading="eager". Wer es überall setzt, hat wieder keine Priorität vergeben.
Bildunterschriften
Gehört eine Erläuterung sichtbar zum Bild, ist
<figure> mit <figcaption> das richtige
Gespann. Die Unterschrift ersetzt den Alternativtext nicht: Sie steht für alle
da, der alt-Text nur für die, die das Bild nicht sehen. Beide
sollten deshalb nicht wortgleich sein. Wo <figure> im
Seitenaufbau steht, erklärt die Seite zu den
semantischen Elementen.
Häufige Fehler
- Riesenbild per CSS verkleinert. Ein 4000-Pixel-Foto, das in einer 400-Pixel-Spalte steht, überträgt trotzdem die volle Datenmenge.
-
widthundheightin CSS statt als Attribut. Die Reservierung des Platzes funktioniert nur über die Attribute, weil sie schon beim Parsen bekannt sind. - Falsche Maße in den Attributen. Stimmen sie nicht mit der Datei überein, wird das Bild verzerrt dargestellt – CSS schlägt dabei die Attribute.
-
loading="lazy"am obersten Bild. Kostet messbar Ladezeit statt sie zu sparen. - Text als Grafik. Nicht durchsuchbar, nicht kopierbar, beim Vergrößern unscharf, und für den Screenreader nur so gut wie sein Alternativtext.
-
Fremde Bilder direkt verlinkt. Ein
srcauf eine fremde Domain überträgt die IP jedes Besuchers dorthin und kann jederzeit ins Leere laufen. Bilder gehören auf den eigenen Server.
