1) Problemlage
Unterschiedliche Devices benötigen — responsiv — dasselbe Bild in unterschiedlichen Größen/Auflösungen/Formaten/Zuschnitten.
Bildschirmbreite:
Smartphone vs Tablet vs Desktop vs Large Desktop
Hochformat vs Querformat
Auflösung:
72dpi vs 'Retina'
Anbindung:
DSL vs 3G/4G
2) Die alte Lösung mit CSS
Mit media queries werden Abhängigkeiten für Hintergundbilder beschreiben.
Kompatibilität:
caniuse.com/#feat=css-mediaqueries
Ab IE9
Beispiel:
div { background: url('img/wunderkammer-phone.jpg'); }
@media screen and (min-width:1024px) {
div { background: url('img/wunderkammer-desktop.jpg'); }
}
@media
screen and (min-device-pixel-ratio: 2),
screen and (min-resolution: 192dpi),
screen and (min-resolution: 2dppx) {
div { background: url('img/wunderkammer-retina.jpg'); }
}
3a) Lösung mit HTML5: srcset-Attribut
Direkt im HTML werden Bedingungen für Bild-Elemente gesetzt. Der Browser wägt die Bedingungen gegeneinander ab und trifft eine viewport-basierte Wahl.
Kompatibilität:
caniuse.com/#feat=srcset
Kein IE (erst ab Edge), kein Opera Mini, keine alten Android Browser
Beispiel 1 in Abhängigkeit von der Pixeldichte des jeweiligen Geräts:
<img
src="wunderkammer.jpg" <!-- Fallback -->
srcset="wunderkammer-2x.jpg 2x, <!-- Bild 1 bei 2facher Auflösung -->
wunderkammer-3x.jpg 3x" <!-- Bild 2 bei 3facher Auflösung -->
/>
Beispiel 2 in Abhängigkeit von Breakpoints der Viewport-Breite (vw):
<img
src="wunderkammer-0640.jpg" <-- Fallback (z.B. optimiert für IE Desktop) -->
srcset="wunderkammer-0480.jpg 480w, <-- Bilder mit Breitenangabe zur Auswahl -->
wunderkammer-0640.jpg 640w,
wunderkammer-0960.jpg 960w,
wunderkammer-1280.jpg 1280w"
sizes="(max-width: 400px) 100vw, <-- Fensterbreite & Bildbreite in % vom Viewport -->
(max-width: 960px) 75vw,
640px" <-- Wildcard: Bildbreite für alle Fensterbreiten über 960 -->
/>
Die jeweilige Pixeldichte des Geräts wird einberechnet.
3b) Lösung mit HTML5: picture-Element
Analog zu den Containern <video>
und <audio>
wurde das Element <picture>
eingeführt.
Damit ist eine von rein gestalterischen Gesichtspunkten abhängige Auswahl der Bilddatei möglich, z. B. ein hochformatiger Ausschnitt für hochformatige Geräte.
Bei der Wahl der Datei hat der Browser hier keinen Spielraum.
srcset
und <picture>
lassen sich zu komplexen Lösungen kombinieren.
Kompatibilität:
caniuse.com/#feat=picture
Aktuell nur Firefox, Chrome, Opera
Beispiel:
<picture>
<source media="(min-width: 960px)" srcset="wunderkammer-quer.jpg" />
<source media="(min-width: 575px)" srcset="wunderkammer-hoch.jpg" />
<img src="wunderkammer-phone.jpg" /> <!-- Fallback, für Phones -->
</picture>
Wie bei den anderen Containern kann das Element auch zum Anbieten des selben Bildes in unterschiedlichen Dateiformaten benutzt werden, also z. B. WebP für Chrome und JPEG XR für MS IE.
4) Polyfills für nicht-kompatible Browser
Nicht-kompatiblen Browsern können die unbekannten Tags per Script beigebracht werden.
Picturefill 3.0
Respimage
5) Fazit
Auch wenn die Syntax überraschend krude und inkonsistent daherkommt und Anteile von CSS und HTML vermischt, bringen srcset
und <picture>
die Chance, ab sofort mit responsiven Bildvarianten zu arbeiten. Und zwar standardkonform und zukunftssicher und
ohne auf komplexe Scriptlösungen und proprietäres HTML zurückgreifen zu müssen.
Die Möglichkeit des Fallbacks mit <img src>
reicht für den Alltagsgebrauch bereits aus, um eine breite Basis von Browsern zu bedienen, für ausgefuchstere Lösungen kann man
dann ein Polyfill heranziehen.
Alles in allem: ein Riesenschritt voran.