{"id":3124,"date":"2012-11-26T08:27:38","date_gmt":"2012-11-26T07:27:38","guid":{"rendered":"https:\/\/www.creativejuiz.fr\/blog\/?p=3124"},"modified":"2014-04-10T16:35:56","modified_gmt":"2014-04-10T14:35:56","slug":"css-retina-hd-webkit-image-set-picture-srcset","status":"publish","type":"post","link":"https:\/\/www.creativejuiz.fr\/blog\/veille-technologique\/css-retina-hd-webkit-image-set-picture-srcset","title":{"rendered":"Du Retina et HD pour votre site web : image-set, picture et srcset"},"content":{"rendered":"<p>Retina, ou la haute d\u00e9finition de mani\u00e8re plus g\u00e9n\u00e9rale pour les images de nos sites web pose un probl\u00e8me relatif. En effet depuis la sortie du premier Mac Book Pro \u00e0 \u00e9cran Retina (et avant pour certain), la question qui revient le plus souvent est&nbsp;: doit-on boycotter Retina, ou au contraire y accorder de l&rsquo;importance&nbsp;?<!--more--><\/p>\n<p>Je fais partie des gens ind\u00e9cis sur la question, et du coup cette position me va tr\u00e8s bien pour \u00e9crire cet article, car j&rsquo;en attends vos r\u00e9actions.<\/p>\n<p>Pour moi la HD, comme la 3D, fait partie de l&rsquo;avenir de l&rsquo;image, que ce soit au cin\u00e9, la t\u00e9l\u00e9vision ou un \u00e9cran d&rsquo;ordinateur. C&rsquo;est comme le son multicanal (plus connu sous le nom de son <em lang=\"en\">surround<\/em>), aujourd&rsquo;hui \u00e7a vous ferait bizarre d&rsquo;aller au cin\u00e9ma avec un son mono. Et bien pour la HD c&rsquo;est pareil, dans quelques ann\u00e9es nous ne pourrons plus nous en passer. C&rsquo;est ce qui me fait dire qu&rsquo;accorder un minimum d&rsquo;importance \u00e0 la HD sur le Web (ici Retina) n&rsquo;est pas une option.<\/p>\n<p>Voici les probl\u00e8mes que j&rsquo;ai pu relever, a priori, en pensant \u00e0 l&rsquo;int\u00e9gration d&rsquo;images HD&nbsp;:<\/p>\n<ul>\n<li>manque de moyens flexibles mis \u00e0 disposition des d\u00e9veloppeurs par les fabricants\n<ul>\n<li>risque de devoir faire de la d\u00e9tection de <em lang=\"en\">user agent<\/em><\/li>\n<li>maintenance du code plus complexe<\/li>\n<\/ul>\n<\/li>\n<li>probl\u00e8me de poids des images\n<ul>\n<li>sites plus lourds en mobilit\u00e9 (Retina sur iPhone4+, iPad, Mac Book)<\/li>\n<li>surcharge des serveurs<\/li>\n<\/ul>\n<\/li>\n<li>probl\u00e8me de maintenance du site\n<ul>\n<li>d\u00e9veloppements plus longs<\/li>\n<li>gestion des images et m\u00e9dias plus complexe<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Je ne dis pas que cette liste est exhaustive.<\/p>\n<h2>Un design nickel chrome<\/h2>\n<p>Je n&rsquo;ai pas mis de majuscule \u00e0 \u00ab\u00a0chrome\u00a0\u00bb dans le titre, mais j&rsquo;aurais presque pu.<\/p>\n<p>Bref, blague \u00e0 part, il y a quelques semaines je vous parlais de l&rsquo;arriv\u00e9e de <code>-webkit-image-set()<\/code> de mani\u00e8re assez concise par ce tweet&nbsp;:<\/p>\n<blockquote class=\"twitter-tweet\">\n<p>-webkit-image-set() on iOS6 and Safari 6 <a href=\"http:\/\/t.co\/eokgg1do\" title=\"http:\/\/blogs.captechconsulting.com\/blog\/matt-kesler\/ios6-tutorial-delivering-high-resolution-content-the-mobile-web#highlighter_163956\">blogs.captechconsulting.com\/blog\/matt-kesl\u2026<\/a> <a href=\"https:\/\/twitter.com\/search\/%23rwd\">#rwd<\/a> <a href=\"https:\/\/twitter.com\/search\/%23wdfr\">#wdfr<\/a> <a href=\"https:\/\/twitter.com\/search\/%23wdstr\">#wdstr<\/a><\/p>\n<p>&mdash; Geoffrey Crofte (@geoffrey_crofte) <a href=\"https:\/\/twitter.com\/geoffreycrofte\/status\/258571953613447168\" data-datetime=\"2012-10-17T14:15:32+00:00\">Octobre 17, 2012<\/a><\/p><\/blockquote>\n<p>Je vous propose un petit test de cette fonction. Puis nous irons un peu plus loin sur les \u00ab\u00a0images HTML\u00a0\u00bb.<\/p>\n<p>Pour des raisons d&rsquo;adaptabilit\u00e9, il m&rsquo;arrive de plus en plus de placer le logo sur un site web en <code>background<\/code> CSS, donc pas avec un \u00e9l\u00e9ment HTML <code class=\"element\">img<\/code>.<br \/>\nCette technique me permet de proposer une image l\u00e9g\u00e8re pour les smartphones et une image plus complexe, grande (et souvent plus lourde) pour des formats plus larges.<\/p>\n<p>De plus si vous regardez un logo classique qui n&rsquo;a pas subit d&rsquo;adaptation pour un \u00e9cran Retina (ou autres HD), il va vous paraitre de moyenne qualit\u00e9.<br \/>\nAfin de proposer un logo pour Retina sans passer par une media queries, voici un code fonctionnel&nbsp;:<\/p>\n<pre class=\"code\"><code class=\"css boc-nocontrols boc-nogutter\">header .logo {\r\n   background-image: url(img\/not-supported.png);\r\n   background-image: -webkit-image-set(url(img\/logo.png) 1x, url(img\/logo-2x.png) 2x);\r\n   background-image: image-set(\"img\/logo.png\" 1x, \"img\/logo-2x.png\" 2x, \"img\/logo-awesome-res.png\" 1337dpi);\r\n}<\/code><\/pre>\n<p>Ici la nouvelle valeur de <code>background-image<\/code> permet de d\u00e9finir des images sous certaines conditions d\u00e9finies juste apr\u00e8s chacune des URL.<\/p>\n<p>J&rsquo;ai volontairement pr\u00e9fix\u00e9 uniquement pour webkit car il semblerait que le support ne soit pas (encore) pr\u00e9vu pour les autres navigateurs.<br \/>\nLa troisi\u00e8me d\u00e9claration de <code>background-image<\/code> est faite d&rsquo;apr\u00e8s <a href=\"http:\/\/dev.w3.org\/csswg\/css4-images\/#image-set-notation\">le document en cours de r\u00e9daction du W3C<\/a> sur CSS4 Image. (1337dpi, c&rsquo;est de l&rsquo;humour ;))<\/p>\n<p>Cette syntaxe est compatible iOS6 Safari 6 et Chrome 23.<br \/>\nD&rsquo;apr\u00e8s mes tests sous Chrome, seule une image est charg\u00e9e (chez moi la version \u00ab\u00a0logo.png\u00a0\u00bb).<\/p>\n<figure id=\"attachment_3232\" aria-labelledby=\"figcaption_attachment_3232\" class=\"wp-caption aligncenter\" style=\"width: 460px\"><a class=\"fancy\" href=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/11\/schema-image-set-support.png\"><img decoding=\"async\" src=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/11\/schema-image-set-support-600x126.png\" alt=\"\" title=\"\" width=\"450\" height=\"94\" class=\"size-large wp-image-3232\" srcset=\"https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/11\/schema-image-set-support-600x126.png 600w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/11\/schema-image-set-support-300x63.png 300w, https:\/\/www.creativejuiz.fr\/blog\/wp-content\/uploads\/2012\/11\/schema-image-set-support.png 800w\" sizes=\"(max-width: 450px) 100vw, 450px\" \/><\/a><figcaption id=\"figcaption_attachment_3232\" class=\"wp-caption-text\">Images pouvant appara\u00eetre dans la d\u00e9monstration (cliquer pour zoomer)<\/figcaption><\/figure>\n<p class=\"center\"><a href=\"http:\/\/creativejuiz.fr\/blog\/doc\/retina-webkit-image-set\/\" class=\"demonstration\">D\u00e9monstration en ligne<\/a><\/p>\n<h2>Pourquoi <code>image-set<\/code> et pas media queries ?<\/h2>\n<p>C&rsquo;est une bonne question ! Et en regardant le support de image-set et celui des media queries, la question n&rsquo;a que plus de force.<br \/>\nVoil\u00e0 quelques arguments en sa faveur :<\/p>\n<ul>\n<li>syntaxe courte<\/li>\n<li>permet d&rsquo;intervenir pr\u00e9cis\u00e9ment<\/li>\n<li>permet de ne charger que la bonne image tout de suite (test\u00e9 sur Chrome 23), ce qui n&rsquo;est pas toujours le cas avec media queries<\/li>\n<li>est simplement fait pour \u00e7a, et pas autre chose<\/li>\n<li>donne un outil en plus des media queries (c&rsquo;est toujours bien de varier les armes)<\/li>\n<\/ul>\n<h2>Qu&rsquo;en est-il des \u00ab\u00a0images HTML\u00a0\u00bb<\/h2>\n<p>Un groupe de travail est actuellement en train de se tirer les cheveux pour proposer et pr\u00e9senter des solutions possibles pour les images adaptatives.<br \/>\n<a href=\"http:\/\/responsiveimages.org\/\">ResponsiveImages.org<\/a><\/p>\n<h3>L&rsquo;\u00e9l\u00e9ment <code class=\"element\">picture<\/code><\/h3>\n<p>Cet \u00e9l\u00e9ment peut, \u00e0 l&rsquo;image de l&rsquo;\u00e9l\u00e9ment <code class=\"element\">video<\/code>, accueillir diff\u00e9rentes sources.<br \/>\nCes sources sont utilis\u00e9es si la condition d\u00e9finie par l&rsquo;attribut <code>media<\/code> est respect\u00e9e.<\/p>\n<pre class=\"code\"><code class=\"html boc-nocontrols boc-nogutter\">&lt;picture alt=\"Texte pertinent\"&gt;\r\n    &lt;source src=\"image-small.jpg\"&gt;\r\n    &lt;source media=\"(min-width: 20em)\" src=\"image-mid.jpg\"&gt;\r\n    &lt;source media=\"(min-width: 40em)\" src=\"image-large.jpg\"&gt;\r\n    &lt;img src=\"image-fallback.jpg\"&gt;\r\n&lt;\/picture&gt;<\/code><\/pre>\n<p>La source peut accueillir l&rsquo;attribut media qui permet de pr\u00e9ciser une requ\u00eate.<br \/>\nC&rsquo;est une media queries, vous pouvez donc effectuer une requ\u00eate sur la largeur du viewport, la r\u00e9solution du device, etc.<br \/>\nL&rsquo;attribut <code>alt<\/code> de l&rsquo;image est port\u00e9 par l&rsquo;\u00e9l\u00e9ment <code class=\"element\">picture<\/code> et une alternative pour les navigateurs ne supportant pas cette sp\u00e9cification est propos\u00e9e gr\u00e2ce \u00e0 l&rsquo;\u00e9l\u00e9ment <code class=\"element\">img<\/code> ins\u00e9r\u00e9 dans <code class=\"element\">picture<\/code>.<\/p>\n<h3 id=\"srcset\">L&rsquo;attribut <code>srcset<\/code><\/h3>\n<p>Cet attribut vient accompagner l&rsquo;\u00e9l\u00e9ment <code class=\"element\">img<\/code> et son attribut <code>src<\/code> et permet de charger conditionnellement des images.<\/p>\n<pre class=\"code\"><code class=\"html boc-nocontrols boc-nogutter\">&lt;img\r\n    src=\"image-small.jpg\"\r\n    srcset=\"image-mid.jpg 300w, image-large.jpg 2x\"&gt;<\/code><\/pre>\n<p>Ici nous avons une image pr\u00e9vue pour les navigateurs qui ne comprennent pas l&rsquo;attribut <code>srcset<\/code> (via l&rsquo;attribut <code>src<\/code>), puis deux images diff\u00e9rentes utilis\u00e9es selon la condition <code>300w<\/code> pour la premi\u00e8re (<code>image-mid.jpg<\/code>) ou <code>2x<\/code>, qui correspond \u00e0 du HD Retina, pour la seconde (<code>image-large.jpg<\/code>).<\/p>\n<p>Cette syntaxe est partiellement compatible depuis Chrome 34, mais est encore ignor\u00e9e par les autres navigateurs. Et l\u00e0 o\u00f9 Chrome fait bien son boulot, c&rsquo;est que seule l&rsquo;image concern\u00e9e est charg\u00e9e. C&rsquo;est \u00e0 dire que l&rsquo;image en <code>src<\/code> est ignor\u00e9e si l&rsquo;un des crit\u00e8res de <code>srcset<\/code> correspond.<\/p>\n<p><a href=\"\/blog\/doc\/retina-srcset-responsive-image\/\" class=\"demonstration\">Test et d\u00e9monstration de <code>srcset<\/code><\/a><\/p>\n<p>En pratique, il serait possible de d\u00e9finir l&rsquo;attribut <code>srcset<\/code> sur une source de l&rsquo;\u00e9l\u00e9ment <code class=\"element\">picture<\/code> \u00e9galement :<\/p>\n<pre class=\"code\"><code class=\"html boc-nocontrols boc-nogutter\">&lt;picture&gt;\r\n  &lt;source src=\"big.jpg\"&gt;\r\n  &lt;source media=\"(max-width: 640px)\" srcset=\"small.jpg 1x, small-hd.jpg 2x\"&gt;\r\n  &lt;img src=\"fallback.jpg\" alt=\"\"&gt;\r\n&lt;\/picture&gt;<\/pre>\n<p><\/code><br \/>\n<code>srcset<\/code> n'intervient ici que pour ajouter une condition et une nouvelle source \u00e0 la premi\u00e8re condition d\u00e9finie par l'attribut <code>media<\/code>.<\/p>\n<p class=\"note message\">&lt;update&gt;<strong>22\/08\/2013<\/strong> : WebKit supporte d\u00e9sormais la syntaxe <code>srcset<\/code> (<a href=\"https:\/\/www.webkit.org\/blog\/2910\/improved-support-for-high-resolution-displays-with-the-srcset-image-attribute\/\" hreflang=\"en\">source<\/a>)&lt;\/update&gt;<br \/>\n&lt;update&gt;<strong>09\/04\/2014<\/strong> : Chrome 34+ supporte d\u00e9sormais la syntaxe <code>srcset<\/code> (<a href=\"http:\/\/googlechromereleases.blogspot.fr\/2014\/04\/stable-channel-update.html\" hreflang=\"en\">source<\/a>), partiellement tout du moins&lt;\/update&gt;<\/p>\n<h2>Mais encore&hellip;<\/h2>\n<p>Pour ceux qui aiment les choses longues, dures et en anglais, voici un peu de lecture :<br \/>\n<a href=\"http:\/\/dvcs.w3.org\/hg\/html-proposals\/raw-file\/9443de7ff65f\/responsive-images\/responsive-images.html\">HTML Proposals - Responsive images<\/a><\/p>\n<p>Sinon il existe aussi une solution partielle avec ce plugin jQuery :<br \/>\n<a href=\"http:\/\/responsiveimg.com\/\">jQuery Responsive img<\/a><br \/>\nPlugin a surveiller puisqu'une prochaine version pourrait supporter la HD.<\/p>\n<p>Enjoy !<\/p>\n<div class=\"sources\">\n<h2>Sources et liens utiles<\/h2>\n<ul>\n<li><a href=\"http:\/\/blogs.adobe.com\/webplatform\/2012\/09\/19\/responsive-images-for-html5\/\">Responsive images for HTML5 - Adobe blogs<\/a><\/li>\n<li><a href=\"http:\/\/cyril-wolfangel.com\/integrateur-typo3\/2012\/08\/05\/image-responsive-enfin-une-solution-perenne\/\">Un article plus complet sur Picture<\/a><\/li>\n<li><a href=\"http:\/\/blog.cloudfour.com\/safari-6-and-chrome-21-add-image-set-to-support-retina-images\/\" hreflang=\"en\" lang=\"en\">Safari 6 and Chrome 21 add image-set to support retina images<\/a><\/li>\n<li><a href=\"http:\/\/robert.accettura.com\/blog\/2012\/07\/24\/on-apples-lack-of-adaptive-image-support-in-webkit\/\" hreflang=\"en\" lang=\"en\">On Apple\u2019s Lack Of Adaptive Image Support In WebKit<\/a><\/li>\n<li><a href=\"http:\/\/dev.w3.org\/csswg\/css4-images\/#image-set-notation\" hreflang=\"en\">Documentation du W3C<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Retina, ou la haute d\u00e9finition de mani\u00e8re plus g\u00e9n\u00e9rale pour les images de nos sites web pose un probl\u00e8me relatif. En effet depuis la sortie du premier Mac Book Pro \u00e0 \u00e9cran Retina (et avant pour certain), la question qui revient le plus souvent est&nbsp;: doit-on boycotter Retina, ou au contraire y accorder de l&rsquo;importance&nbsp;?<\/p>\n","protected":false},"author":4,"featured_media":3225,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_bluesky_dont_syndicate":"","_bluesky_syndication_accounts":"","_bluesky_syndication_text":"","footnotes":""},"categories":[17,12],"tags":[523,533,256,536,535,403,519,534,520],"coauthors":[],"class_list":["post-3124","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-css-css3","category-veille-technologique","tag-css4","tag-hd","tag-image","tag-image-set","tag-picture","tag-responsive","tag-retina","tag-srcset","tag-webkit"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/3124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/comments?post=3124"}],"version-history":[{"count":0,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/posts\/3124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media\/3225"}],"wp:attachment":[{"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/media?parent=3124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/categories?post=3124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/tags?post=3124"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.creativejuiz.fr\/blog\/wp-json\/wp\/v2\/coauthors?post=3124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}