Responsive Images
15 Techniken in 15 Minuten
Sven Wolfermann | maddesigns
Webmontag Karlsruhe, 13.05.2013
15 Techniken in 15 Minuten
Sven Wolfermann | maddesigns
Webmontag Karlsruhe, 13.05.2013

keine statische Breitenangaben
img, embed, object, video {
max-width: 100%;
}
Für Medien muss im CSS eine flexible Breite gesetzt werden, die Höhe soll sich automatisch in Relation anpassen.
img, embed, object, video {
max-width: 100%; /* max. original px width */
height: auto;
/* width: auto; */
}



Tests des Ladeverhalten mobiler Browser

CSS3-Ansatz von Nicolas Gallagher
<img src="image.jpg" alt="" data-src-600px="image-600px.jpg">
Umsetzung auf CSS-Basis
@media (min-device-width:600px) {
img[data-src-600px] {
content: attr(data-src-600px, url);
}
}
@media (min-device-width:800px) {
img[data-src-800px] {
content: attr(data-src-800px, url);
}
}
Nachteil: lädt 2 Bilder
Ansatz der Filament Group
<img src="small.jpg?full=large.jpg">
https://github.com/filamentgroup/Responsive-Images
wird nicht mehr empfohlen, <picture> / bzw. picturefill wird empfohlen
Die aktuell einfachste und beste Lösung meiner Meinung nach ist die <noscript>-Lösung mit HTML5 data-Attributen
<noscript data-large="Koala-large.jpg"
data-small="Koala-small.jpg" data-alt="Koala">
<img src="Koala-small.jpg" alt="Koala" />
</noscript>
Vorteil: Assets die im <noscript>-Tag eingebunden sind, werden nicht vom Browser in den DOM eingefügt (und geladen), wenn JavaScript aktiviert ist. Ressourcen werden also nicht doppelt geladen.
jQuery Snippet
$('noscript[data-large][data-small]').each(function(){
var src = screen.width >= 500 ?
$(this).data('large') :
$(this).data('small');
$('<img src="' + src + '" alt="' + $(this)
.data('alt') + '" />')
.insertAfter($(this));
});
Nachteil: jQuery Abhängigkeit
Aktuelle W3C-Diskussion – <picture> Element
Aufbau wie <video> Element + srcset für Retina-Images
<picture width="500" height="500"> <source media="(min-width: 45em)" srcset="large-1.jpg 1x, large-2.jpg 2x"> <source media="(min-width: 18em)" srcset="med-1.jpg 1x, med-2.jpg 2x"> <source srcset="small-1.jpg 1x, small-2.jpg 2x"> <img src="small-1.jpg" alt=""> <p>Accessible text</p> </picture>
Polyfill für den <picture> Ansatz
<div data-picture data-alt="Alttext">
<div data-src="small.jpg"></div>
<div data-src="medium.jpg" data-media="(min-width: 400px)"></div>
<div data-src="large.jpg" data-media="(min-width: 800px)"></div>
<div data-src="extralarge.jpg" data-media="(min-width: 1000px)"></div>
<!-- Fallback content for non-JS browsers. Same img src as the initial, unqualified source element. -->
<noscript>
<img src="external/imgs/small.jpg" alt="Alt">
</noscript>
</div>
Vorschlag für ein neues <img> Attribut "srcset"
<img src="pear-mobile.jpeg"
srcset="pear-mobile.jpeg 720w, pear-tablet.jpeg 1280w, pear-desktop.jpeg 1x"
alt="The pear is juicy.">
CSS Retina-Support für background-images
/* Safari 6, Chrome supports background-image: -webkit-image-set(); */
background-image: -webkit-image-set(
url(cloud-sd.png) 1x, url(cloud-hd.png) 2x);
Media Queries innerhalb SVG
<img src="file.svg" alt="responsive image">

Nachteil: SVG erst ab Android 4
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 329" preserveAspectRatio="xMidYMid meet">
<title>Clown Car Technique</title>
<style>
svg { background-size: 100% 100%; background-repeat: no-repeat;
}
@media screen and (max-width: 400px) {
svg {background-image: url(images/small.png");}
}
@media screen and (min-width: 401px) and (max-width: 700px) {
svg {background-image: url(images/medium.png);}
}
@media screen and (min-width: 701px) and (max-width: 1000px) {
svg {background-image: url(images/big.png);}
}
@media screen and (min-width: 1001px) {
svg {background-image: url(images/huge.png);}
}
</style>
</svg>

Cookie-Snippet so früh wie möglich im <head>
<head> <script> document.cookie='resolution='+Math.max(screen.width,screen.height)+'; path=/'; </script> … </head>
PHP-Script anpassen (global Breakpoints)
$resolutions = array(1382, 992, 768, 480, 320);
<IfModule mod_rewrite.c>
#Enable URL rewriting
RewriteEngine On
Options +FollowSymlinks
#Adaptive Images
#don't apply the AI behaviour to images inside AI's cache folder:
RewriteCond %{REQUEST_URI} !ai-cache
#further directories that shouldn't use AI
RewriteCond %{REQUEST_URI} !cssimages
#Send any GIF, JPG, or PNG request that IS NOT stored inside one of the above directories
RewriteRule ^.*\.(jpg|jpeg|png|gif)$ adaptive-images.php [L]
. . .
</IfModule>

Bildinhalte anders fokussieren

Responsive Image CDN-Lösung http://www.cdnconnect.com/
CSS abhängig von der Pixeldichte
@media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-resolution: 192dpi) {
/* Retina-specific stuff here */
}

left: JPEG, 500x508, quality=60, size=87802
right: JPEG, 1000x1015, quality=15, size=83150 (file size -5%)

Vorteil:
kostenloser Service icomoon.io

8 Guidelines and 1 Rule for Responsive Images
Sensible jumps in responsive image file sizes
Responsive Images for Ruby on Rails
Riloadr – cross-browser framework-independent responsive images loader
Sven Wolfermann | maddesigns