Mit der Veröffentlichung der ersten Beta Version von TYPO3 6.2 ist auch ein praktisches Feature für die Umsetzung von Responsive Webdesign hinzugekommen, das Rendering von Responsive Image Markup. Das Feature, das auf den Developer Days in Hamburg begonnen wurde (#49723, #50075), spiegelt den aktuellen Working-Draft der Responsive Image Community Group wieder und zudem noch eine weitere Variante um mehrere Bildquellen je nach Bildschirmgröße anzuzeigen. Eine allgemeine Übersicht zu Responsive Images und den Problemen findet ihr in diesen Slides.
Möchte man das Feature in einem TYPO3 6.2 Projekt verwenden, muss man zuerst im Constant Editor die Option „Responsive rendering for images“ aktivieren. Anschließend die Rendering-Form in der Selectbox darunter auswählen.
Zur Auswahl stehen vier Optionen, das Default-Rendering, das srcset-Rendering, das Picture-Rendering und das Rendering von zusätzlichen Data-Attributen im Image-Element. Das Markup-Rendering ist zudem voll flexibel über TypoScript änderbar und ein weiteres Rendering-Layout könnte hinzugefügt werden. Natürlich deckt das Konzept auch die Nutzung von hochauflösenden Bilder (aka Retina) ab, das über zusätzliche Parameter in TypoScript aktiviert werden kann.
Aber genug zur Theorie, hier mal ein Code-Beispiel für das srcset-Rendering mit zwei angepassten Bildern.
# contants.ts styles.content.imgtext.responsive = 1 styles.content.imgtext.layoutKey = srcset |
# setup.ts tt_content.image.20.1.sourceCollection { # max width of the image for the 'small' viewport small.maxW = 300 # width descriptor of the 'small' srcset attribute # in this case at viewport width of 400px small.srcsetCandidate = 400w # max width of the image for the 'middle' viewport middle.maxW = 500 # width descriptor of the 'middle' srcset attribute # in this case at viewport width of 600px middle.srcsetCandidate = 600w } |
In der Doku sind die Konfigurationsmöglichkeiten in TypoScript sehr gut beschrieben.
Hier eine Demo mit dem srcset Responsive Image Rendering in TYPO3 6.2.
Soweit so gut. Da das aktuell aber nur das Rendering des Markup von einem Working-Draft ist und kein einziger Browser Responsive-Image-Rendering unterstützt, muss noch ein wenig JavaScript hinzugefügt werden, damit das passende Bild angezeigt werden kann. Für die srcset-Attribut Variante kann der srcset-Polyfill von Boris Smus verwendet werden. Das JavaScript im Head einbinden und schon wird das passende Bild geladen (nur onload). Problem bei der srcset-Variante: das große Bild wird zuvor ebenfalls geladen und erst dann durch das kleinere Bild ausgetauscht, also doppelte Requests. Es werden zusätzlich mehr Daten geladen als würde nur das normale (große) Bild geladen werden. Das ist unschön. Hier wäre es gut, wenn man als default-src eine kleine bzw. die kleinste Bildvariante ausgegeben bekäme, solange die Browser das noch nicht selbstständig händeln.
Eine vorübergehende Lösung wäre es, das src=““ Attribut gänzlich weg zu lassen, das geht (auch wenn nicht erlaubt) in modernen Browsern ohne Probleme. Allerdings würde das Bild auch hier „etwas“ später laden als normal, da es erst geladen wird, wenn das JavaScript geladen und verarbeitet ist. Moderne Browser beginnen das Laden der Bilder durch den Preparser teilweise schon vorher. Jetzt wird nur noch ein Bild geladen.
Ein Fallback gibt es leider nicht, falls mal das Javascript-Laden /-Parsen versagt.
Besser für den aktuellen Übergang, bis es eine Lösung in mehrere Browser geschafft hat, ist das Picture-Element-Rendering. Aktuell (Achtung Mutmaßung) sieht es aber so aus, dass das picture-Element wieder verworfen wird, aber wie sagt man so schön – totgesagte leben länger. Wer weiß also. Für die Picture-Markup-Rendering gibt es ebenfalls einen Polyfill, den Picturefill von Scott Jehl, der auf ein abgewandeltes span-Markup setzt. Dazu muss man ebenfalls die JavaScript-Bibliothek, inkl. matchMedia Polyfill in den Head der Seite kopieren und das Ausgabe-Markup leicht anpassen.
# contants.ts styles.content.imgtext.responsive = 1 styles.content.imgtext.layoutKey = picturefill |
# picturefill rendering tt_content.image.20.1.layout.picturefill { element ( <span data-picture=""> ###SOURCECOLLECTION### <noscript> <img src="###SRC###" ###PARAMS### ###ALTPARAMS######SELFCLOSINGTAGSLASH###> </noscript> </span> ) source = <span data-src="###SRC###" data-media="###MEDIAQUERY###"></span> } tt_content.image.20.1.sourceCollection { small.maxW = 300px small.mediaQuery = (max-width: 400px) middle.maxW = 600px middle.mediaQuery = (min-width: 401px) AND (max-width: 600px) large.maxW = 900px large.mediaQuery = (min-width: 601px) } |
Hier eine Demo mit dem picturefill Responsive Image Rendering in TYPO3 6.2.
Somit hat man jetzt die Wahl, welches Rendering und welche Polyfill-Variante die Beste für sein Projekt ist. Ich würde mir wünschen, wenn man den „mobile first“ Ansatz auch für Bilder wählen kann, also die kleinste Bildvariante als default-src verlinkt und dass man im Backend noch Möglichkeiten zur Auswahl von Cropping-Varianten hätte.
Was meint ihr, wie findet ihr das neuen Responsive Image Rendering in TYPO3 6.2?