A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 50KB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=fr>
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset=utf-8>
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>Responsive Images Done Right: A Guide To &lt;picture&gt; And srcset (archive) — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="http://www.smashingmagazine.com/2014/05/responsive-images-done-right-guide-picture-srcset/">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. Responsive Images Done Right: A Guide To &lt;picture&gt; And srcset (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="http://www.smashingmagazine.com/2014/05/responsive-images-done-right-guide-picture-srcset/">Source originale du contenu</a></h3>
  445. <p><em>On Monday, we published an <a href="http://www.smashingmagazine.com/2014/05/12/picturefill-2-0-responsive-images-and-the-perfect-polyfill/">article on Picturefill 2.0</a><sup class="po" id="note-1"><a href="#1">1</a></sup>, a perfect polyfill for responsive images. Today’s article complements Tim Wright’s article and explains exactly how we can use the upcoming &lt;picture&gt; element and srcset, with simple fallbacks for legacy browsers. There is <a href="http://timkadlec.com/2014/05/dont-wait-on-responsive-images/">no reason to wait for responsive images</a><sup class="po" id="note-2"><a href="#2">2</a></sup>; we can actually have them <a href="https://twitter.com/wilto/status/465850875102371840">very, very soon</a><sup class="po" id="note-3"><a href="#3">3</a></sup>.</em> — Ed.</p>
  446. <blockquote>
  447. <p>“Everything I’ve said so far could be summarized as: make pages which are adaptable.… Designing adaptable pages is designing accessible pages. And perhaps the great promise of the web, far from fulfilled as yet, is accessibility, regardless of difficulties, to information.”</p>
  448. <p>– John Allsopp, <em><a href="http://alistapart.com/article/dao">A Dao of Web Design</a><sup class="po" id="note-4"><a href="#4">4</a></sup></em></p>
  449. </blockquote>
  450. <p><a href="http://www.google.com/imghp">Images</a><sup class="po" id="note-5"><a href="#5">5</a></sup> are <a href="http://mashable.com/2013/09/16/facebook-photo-uploads/">some</a><sup class="po" id="note-6"><a href="#6">6</a></sup> of the <a href="http://www.loc.gov/pictures/">most</a><sup class="po" id="note-7"><a href="#7">7</a></sup> <a href="https://www.flickr.com/commons">important</a><sup class="po" id="note-8"><a href="#8">8</a></sup> <a href="http://www.google.com/culturalinstitute/about/artproject/">pieces</a><sup class="po" id="note-9"><a href="#9">9</a></sup> of <a href="http://www.huffingtonpost.com/2012/07/10/first-photo-ever-on-the-internet-les-horribles-cernettes_n_1662823.html">information</a><sup class="po" id="note-10"><a href="#10">10</a></sup> on the <a href="http://bukk.it/look.jpg">web</a><sup class="po" id="note-11"><a href="#11">11</a></sup>, but over the web’s 25-year history, they haven’t been very adaptable at all. Everything about them has been stubbornly fixed: their size, format and crop, all set in stone by a single <code>src</code>.</p>
  451. <p>HTML authors began to really feel these limitations when high-resolution screens and responsive layouts hit the web like a one-two punch. Authors — wanting their images to look crisp in huge layouts and on high-resolution screens — began sending larger and larger sources to everyone; the average size of an image file <a href="http://httparchive.org/trends.php?s=All&amp;minlabel=Nov+15+2010&amp;maxlabel=Apr+1+2014#bytesImg&amp;reqImg">ballooned</a><sup class="po" id="note-12"><a href="#12">12</a></sup>; very smart people called responsive web design "<a href="http://blog.cloudfour.com/css-media-query-for-mobile-is-fools-gold/">unworkably slow</a><sup class="po" id="note-13"><a href="#13">13</a></sup>".</p>
  452. <p><strong>Images have been the number one obstacle</strong> to implementing truly adaptable and performant responsive pages — pages that scale both up and down, efficiently tailoring themselves to both the constraints and the affordances of the browsing context at hand.</p>
  453. <p>That is about to change.</p>
  454. <p>The latest <a href="http://picture.responsiveimages.org">specification of the <code>&lt;picture&gt;</code> element</a><sup class="po" id="note-14"><a href="#14">14</a></sup> is the result of <a href="http://www.brucelawson.co.uk/2011/notes-on-adaptive-images-yet-again/">years</a><sup class="po" id="note-15"><a href="#15">15</a></sup> (<a href="http://lists.w3.org/Archives/Public/public-html/2007Jul/0121.html">years!</a><sup class="po" id="note-16"><a href="#16">16</a></sup>) of debate on how to make images adapt. It gives authors semantic ways to group multiple versions of the same image, each version having technical characteristics that make it more or less suitable for a particular user. The new specification has achieved broad consensus and is being implemented in Chrome, Opera and Firefox (<a href="http://status.modern.ie/pictureelement">maybe even Internet Explorer!</a><sup class="po" id="note-17"><a href="#17">17</a></sup>) as I type.</p>
  455. <p>The time to start learning this stuff is now!</p>
  456. <p>Before we get to any of the (<em>shiny! new!</em>) markup, let’s look at the relevant ways in which browsing environments vary, i.e. the ways in which we want our images to adapt.</p>
  457. <ol>
  458. <li>Our images need to be able to render crisply at different <code>device-pixel-ratio</code>s. We want high-resolution screens to get high-resolution images, but we don’t want to send those images to users who wouldn’t see all of those extra pixels. Let’s call this the <code>device-pixel-ratio</code> use case.</li>
  459. <li>If our layout is fluid (i.e. responsive), then our images will need to squish and stretch to fit it. We’ll call this fluid-image use case.</li>
  460. <li>Note that these two use cases are closely related: To solve both, we’ll want our images to be available in multiple resolutions so that they scale efficiently. We’ll call tackling both problems simultaneously the variable-sized-image use case</li>
  461. <li>Sometimes we’ll want to adapt our images in ways that go beyond simple scaling. We might want to crop the images or even subtly alter their content. We’ll call this the art-direction use case.</li>
  462. <li>Finally, different browsers support different image formats. We might want to send a fancy new format such as WebP to browsers that can render it, and fall back to trusty old JPEGs in browsers that don’t. We’ll call this the type-switching use case.</li>
  463. </ol>
  464. <p>The new <code>&lt;picture&gt;</code> specification includes features for all of these cases. Let’s look at them one by one.</p>
  465. <p><img src="https://media-mediatemple.netdna-ssl.com/wp-content/uploads/2014/05/viewport-selection-opt.jpg" width="500" height="245" alt="" title=""/><br/><em>Rearranging images across various resolutions is relatively easy, however, loading different images (and only them) depending on the user’s resolution is quite difficult. Well, not any more. (<a href="http://picture.responsiveimages.org/images/viewport_selection_mob_first.jpg">Image credit</a><sup class="po" id="note-18"><a href="#18">18</a></sup>)</em></p>
  466. <h3>The <code>device-pixel-ratio</code> Use Case</h3>
  467. <p>Let’s start simply, with a fixed-width image that we want to adapt to varying <code>device-pixel-ratio</code>s. To do this, we’ll use the first tool that the new specification gives us for grouping and describing image sources: the <code>srcset</code> attribute.</p>
  468. <p>Say we have two versions of an image:</p>
  469. <ul>
  470. <li><code>small.jpg</code> (320 × 240 pixels)</li>
  471. <li><code>large.jpg</code> (640 × 480 pixels)</li>
  472. </ul>
  473. <p>We want to send <code>large.jpg</code> only to users with high-resolution screens. Using <code>srcset</code>, we’d mark up our image like so:</p>
  474. <pre><code class="language-markup">&lt;img srcset="small.jpg 1x, large.jpg 2x"&#13;
  475. src="small.jpg"&#13;
  476. alt="A rad wolf" /&gt;&#13;
  477. </code></pre>
  478. <p>The <code>srcset</code> attribute takes a comma-separated list of image URLs, each with an <code>x</code> descriptor stating the <code>device-pixel-ratio</code> that that file is intended for.</p>
  479. <p>The <code>src</code> is there for browsers that don’t understand <code>srcset</code>. The <code>alt</code>, of course, is included for browsers that don’t render images at all. One element and three attributes gets us an image that looks crisp on high-resolution devices and efficiently degrades all the way down to text. Not too shabby!</p>
  480. <h3 id="the-fluid-and-variable-sized-image-use-cases">The Fluid- And Variable-Sized-Image Use Cases <a href="#the-fluid-and-variable-sized-image-use-cases" aria-label="Link to section 'The Fluid- And Variable-Sized-Image Use Cases'" class="sr hsl">Link</a></h3>
  481. <p>What that markup won’t do is efficiently squish and stretch our image in a fluid layout. Before addressing this fluid-image use case, we need a little background on how browsers work.</p>
  482. <p>Image preloading is, according to Steve Souders, “<a href="http://www.stevesouders.com/blog/2013/04/26/i/">the single biggest performance improvement browsers have ever made</a><sup class="po" id="note-19"><a href="#19">19</a></sup>.” Images are often the heaviest elements on a page; loading them ASAP is in everyone’s best interest. Thus, the first thing a browser will do with a page is scan the HTML for image URLs and begin loading them. The browser does this long before it has constructed a DOM, loaded external CSS or painted a layout. Solving the fluid-image use case is tricky, then; we need the browser to pick a source before it knows the image’s rendered size.</p>
  483. <p><strong>What a browser does know at all times is the environment it’s rendering in</strong>: the size of the viewport, the resolution of the user’s screen, that sort of thing. We use this information when we use media queries, which tailor our layouts to fit particular browsing environments.</p>
  484. <p>Thus, to get around the preloading problem, the first <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-May/035855.html">proposals</a><sup class="po" id="note-20"><a href="#20">20</a></sup> for fluid-image <a href="http://alistapart.com/article/responsive-images-how-they-almost-worked-and-what-we-need">features</a><sup class="po" id="note-21"><a href="#21">21</a></sup> suggested attaching media queries to sources. We would base our source-picking mechanism on the size of the viewport, which the browser knows at picking-time, not on the final rendered size of the image, which it doesn’t.</p>
  485. <p><a href="http://ericportis.com/posts/2014/srcset-sizes/"><img src="https://media-mediatemple.netdna-ssl.com/wp-content/uploads/2014/05/measuring-image-size.png" width="500" height="340" alt="" title=""/></a><sup class="po" id="note-22"><a href="#22">22</a></sup><br/><em>Dealing with responsive images turned out to be quite a nightmare. A better way to provide the browser with details about its environment is by simply telling the browser the rendered size of the image. Kind of obvious, really. (<a href="http://ericportis.com/posts/2014/srcset-sizes/">Image credit</a><sup class="po" id="note-23"><a href="#23">23</a></sup>)</em></p>
  486. <p>As it <a href="http://ericportis.com/posts/2014/srcset-sizes/">turns out</a><sup class="po" id="note-24"><a href="#24">24</a></sup>, that’s a bad idea. While it’s technically workable, calculating the media queries needed is tedious and error-prone. A better idea is to <strong>simply tell the browser the rendered size of the image</strong>!</p>
  487. <p>Once we tell the browser how many pixels it <em>needs</em> (via a new attribute, <code>sizes</code>) and how many pixels each of the sources <em>has</em> (via <code>w</code> descriptors in <code>srcset</code>), picking a source becomes trivial. The browser picks the smallest source that will still look reasonably crisp within its container.</p>
  488. <p>Let’s make this concrete by developing our previous example. Suppose we now have three versions of our image:</p>
  489. <ul>
  490. <li><code>large.jpg</code> (1024 × 768 pixels)</li>
  491. <li><code>medium.jpg</code> (640 × 480 pixels)</li>
  492. <li><code>small.jpg</code> (320 × 240 pixels)</li>
  493. </ul>
  494. <p>And we want to place these in a flexible grid — a grid that starts out as a single column but switches to three columns in larger viewports, <a href="http://ericportis.com/etc/smashing-mag-picture-examples/variable-size.html">like this</a><sup class="po" id="note-25"><a href="#25">25</a></sup>:</p>
  495. <p><a href="http://ericportis.com/etc/smashing-mag-picture-examples/variable-size.html"><img src="https://media-mediatemple.netdna-ssl.com/wp-content/uploads/2014/05/wolves-picture-examples-opt.png" width="500" height="310" alt="" title=""/></a><sup class="po" id="note-26"><a href="#26">26</a></sup><br/><em>A responsive grid example. (<a href="http://ericportis.com/etc/smashing-mag-picture-examples/variable-size.html">See the demo</a><sup class="po" id="note-27"><a href="#27">27</a></sup>)</em></p>
  496. <p>Here’s how we’d mark it up:</p>
  497. <pre><code class="language-markup">&lt;img srcset="large.jpg 1024w,&#13;
  498. medium.jpg 640w,&#13;
  499. small.jpg 320w"&#13;
  500. sizes="(min-width: 36em) 33.3vw,&#13;
  501. 100vw"&#13;
  502. src="small.jpg"&#13;
  503. alt="A rad wolf" /&gt;&#13;
  504. </code></pre>
  505. <p>We’re using <code>srcset</code> again, but instead of <code>x</code> descriptors, we’re attaching <code>w</code> descriptors to our sources. These describe the actual width, in pixels, of the referenced file. So, if you “Save for Web…” at 1024 × 768 pixels, then mark up that source in <code>srcset</code> as <code>1024w</code>.</p>
  506. <p>You’ll note that <strong>we’re specifying only image widths</strong>. Why not heights, too? The images in our layout are width-constrained; their widths are set explicitly by the CSS, but their heights are not. The vast majority of responsive images in the wild are width-constrained, too, so the specification keeps things simple by dealing only in widths. There are some <a href="https://github.com/ResponsiveImagesCG/picture-element/issues/85">good</a><sup class="po" id="note-28"><a href="#28">28</a></sup> <a href="https://github.com/ResponsiveImagesCG/picture-element/issues/86">reasons</a><sup class="po" id="note-29"><a href="#29">29</a></sup> for including heights, too — but not yet.</p>
  507. <p>So, that’s <code>w</code> in <code>srcset</code>, which describes how many pixels each of our sources <em>has</em>. Next up, the <code>sizes</code> attribute. The <code>sizes</code> attribute tells the browser how many pixels it <em>needs</em> by describing the final rendered width of our image. Think of <code>sizes</code> as a way to give the browser a bit of information about the page’s layout a little ahead of time, so that it can pick a source before it has parsed or rendered any of the page’s CSS.</p>
  508. <p>We do this by passing the browser a <a href="http://www.w3.org/TR/css3-values/#lengths">CSS length</a><sup class="po" id="note-30"><a href="#30">30</a></sup> that describes the image’s rendered width. CSS lengths can be either absolute (for example, <code>99px</code> or <code>16em</code>) or <a href="http://www.w3.org/TR/css3-values/#viewport-relative-lengths">relative to the viewport</a><sup class="po" id="note-31"><a href="#31">31</a></sup> (<code>33.3vw</code>, as in our example). That “relative to the viewport” part is what enables images to flex.</p>
  509. <p>If our image occupies a third of the viewport, then our <code>sizes</code> attribute should look like this:</p>
  510. <pre><code class="language-css">sizes="33.3vw"&#13;
  511. </code></pre>
  512. <p>Our example isn’t quite so simple. Our layout has a breakpoint at 36 ems. When the viewport is narrower than 36 ems, the layout changes. Below that breakpoint, the image will fill 100% of the viewport’s width. How do we encode that information in our <code>sizes</code> attribute?</p>
  513. <p>We do it by pairing media queries with lengths:</p>
  514. <pre><code class="language-css">sizes="(min-width: 36em) 33.3vw,&#13;
  515. 100vw"&#13;
  516. </code></pre>
  517. <p>This is its format:</p>
  518. <pre><code class="language-css">sizes="[media query] [length],&#13;
  519. [media query] [length],&#13;
  520. etc…&#13;
  521. [default length]"&#13;
  522. </code></pre>
  523. <p>The browser goes over each media query until it finds one that matches and then uses the matching query’s paired length. If no media queries match, then the browser uses the “default” length, i.e. any length it comes across that doesn’t have a paired query.</p>
  524. <p>With both a <code>sizes</code> length and a set of sources with <code>w</code> descriptors in <code>srcset</code> to choose from, the browser has everything it needs to efficiently load an image in a fluid, responsive layout.</p>
  525. <p>Wonderfully, <code>sizes</code> and <code>w</code> in <code>srcset</code> also give the browser enough information to adapt the image to varying <code>device-pixel-ratio</code>s. Converting the CSS length, we give it in <code>sizes</code> to CSS pixels; and, multiplying that by the user’s <code>device-pixel-ratio</code>, the browser knows the number of device pixels it needs to fill — no matter what the user’s <code>device-pixel-ratio</code> is.</p>
  526. <p>So, while the example in our <code>device-pixel-ratio</code> use case works only for fixed-width images and covers only 1x and 2x screens, this <code>srcset</code> and <code>sizes</code> example not only covers the fluid-image use case, but also adapts to arbitrary screen densities.</p>
  527. <p>We’ve solved both problems at once. In the parlance set out at the beginning of this article, <code>w</code> in <code>srcset</code> and <code>sizes</code> covers the variable-sized-image use case.</p>
  528. <p>Even more wonderfully, <strong>this markup also gives the browser some wiggle room</strong>. Attaching specific browsing conditions to sources means that the browser does its picking based on a strict set of conditions. “If the screen is high-resolution,” we say to the browser, “then you must use this source.” By simply describing the resources’ dimensions with <code>w</code> in <code>srcset</code> and the area they’ll be occupying with <code>sizes</code>, we enable the browser to apply its wealth of additional knowledge about a given user’s environment to the source-picking problem. The specification allows browsers to, say, optionally load smaller sources when bandwidth is slow or expensive.</p>
  529. <p>One more thing. In our example, the size of the image is always a simple percentage of the viewport’s width. What if our layout combined both absolute and relative lengths by, say, adding a fixed 12-em sidebar to the three-column layout, <a href="http://ericportis.com/etc/smashing-mag-picture-examples/absolute-and-fixed.html">like this</a><sup class="po" id="note-32"><a href="#32">32</a></sup>?</p>
  530. <p><a href="http://ericportis.com/etc/smashing-mag-picture-examples/absolute-and-fixed.html"><img src="https://media-mediatemple.netdna-ssl.com/wp-content/uploads/2014/05/absolute-relative-lengths-opt.png" width="500" height="271" alt="" title=""/></a><sup class="po" id="note-33"><a href="#33">33</a></sup><br/><em>A layout combines absolute and relative lengths. (<a href="http://ericportis.com/etc/smashing-mag-picture-examples/absolute-and-fixed.html">See the demo</a><sup class="po" id="note-34"><a href="#34">34</a></sup>)</em></p>
  531. <p>We’d use the <a href="http://caniuse.com/calc">surprisingly well-supported</a><sup class="po" id="note-35"><a href="#35">35</a></sup> <a href="http://dev.w3.org/csswg/css-values/#calc-notation"><code>calc()</code> function</a><sup class="po" id="note-36"><a href="#36">36</a></sup> in our <code>sizes</code> attribute.</p>
  532. <pre><code class="language-markup">sizes="(min-width: 36em) calc(.333 * (100vw - 12em)),&#13;
  533. 100vw"&#13;
  534. </code></pre>
  535. <p>And… done!</p>
  536. <p class="icad" id="cad-middle" data-ad-zone-id="97"/>
  537. <h3 id="the-art-direction-use-case">The Art-Direction Use Case <a href="#the-art-direction-use-case" aria-label="Link to section 'The Art-Direction Use Case'" class="sr hsl">Link</a></h3>
  538. <p>Now we’re cooking with gas! We’ve learned how to mark up varible-sized images that scale up and down efficiently, rendering crisply on any and all layouts, viewports and screens.</p>
  539. <p>But what if we wanted to go further? What if we wanted to adapt more?</p>
  540. <p>When Apple introduced the iPad Air last year, its website featured a <a href="http://ericportis.com/etc/ipad-air-art-direction/ipadair_hero_a.jpg">huge image of the device</a><sup class="po" id="note-37"><a href="#37">37</a></sup>. This might sound rather unremarkable, unless you — as web design geeks are wont to do — compulsively resized your browser window. When the viewport was short enough, the iPad did a remarkable thing: it <a href="http://ericportis.com/etc/ipad-air-art-direction/ipadair_hero_b.jpg">rotated to better fit the viewport</a><sup class="po" id="note-38"><a href="#38">38</a></sup>
  541. !</p>
  542. <p>We call this sort of thing “art direction.”</p>
  543. <p>Apple art-directed its image by abusing HTML and CSS: marking up its image — which was clearly content — as an empty <code>div</code> and switching its <code>background-image</code> with CSS. The new <code>&lt;picture&gt;</code> specification allows authors to do this sort of breakpoint-based art direction entirely in HTML.</p>
  544. <p>The specification facilitates this by layering another method of source grouping on top of <code>srcset</code>: <code>&lt;picture&gt;</code> and <code>source</code>.</p>
  545. <p>Let’s get back to our example. Suppose that instead of letting our image fill the full width of the viewport on small screens, we crop the image square, zooming in on the most important part of the subject, and present that small square crop at a fixed size floated off to the left, leaving a lot of space for descriptive text, <a href="http://ericportis.com/etc/smashing-mag-picture-examples/art-direction.html">like this</a><sup class="po" id="note-39"><a href="#39">39</a></sup>:</p>
  546. <p><a href="http://ericportis.com/etc/smashing-mag-picture-examples/art-direction.html"><img src="https://media-mediatemple.netdna-ssl.com/wp-content/uploads/2014/05/wolves-descriptive-text-opt.jpg" width="500" height="392" alt="" title=""/></a><sup class="po" id="note-40"><a href="#40">40</a></sup><br/><em>An example with images combined with descriptive text. (<a href="http://ericportis.com/etc/smashing-mag-picture-examples/art-direction.html">See the demo</a><sup class="po" id="note-41"><a href="#41">41</a></sup>)</em></p>
  547. <p>To achieve this, we’ll need a couple of additional image sources:</p>
  548. <ul>
  549. <li><code>cropped-small.jpg</code> (96 × 96 pixels)</li>
  550. <li><code>cropped-large.jpg</code> (192 × 192 pixels)</li>
  551. <li><code>small.jpg</code> (320 × 240 pixels)</li>
  552. <li><code>medium.jpg</code> (640 × 480 pixels)</li>
  553. <li><code>large.jpg</code> (1024 × 768 pixels)</li>
  554. </ul>
  555. <p>How do we mark them up? Like so:</p>
  556. <pre><code class="language-markup">&lt;picture&gt;&#13;
  557. &lt;source media="(min-width: 36em)"&#13;
  558. srcset="large.jpg 1024w,&#13;
  559. medium.jpg 640w,&#13;
  560. small.jpg 320w"&#13;
  561. sizes="33.3vw" /&gt;&#13;
  562. &lt;source srcset="cropped-large.jpg 2x,&#13;
  563. cropped-small.jpg 1x" /&gt;&#13;
  564. &lt;img src="small.jpg" alt="A rad wolf" /&gt;&#13;
  565. &lt;/picture&gt;&#13;
  566. </code></pre>
  567. <p>This example is as complex as it gets, using every feature that we’ve covered so far. Let’s break it down.</p>
  568. <p>The <code>&lt;picture&gt;</code> element contains two <code>source</code>s and an <code>img</code>. The <code>source</code>s represent the two separate art-directed versions of the image (the square crop and the full crop). The (required) <code>img</code> serves as our fallback. As we’ll soon discover, it does much of the actual work behind the scenes.</p>
  569. <p>First, let’s take a close look at that first <code>source</code>:</p>
  570. <pre><code class="language-markup">&lt;source media="(min-width: 36em)"&#13;
  571. srcset="large.jpg 1024w,&#13;
  572. medium.jpg 640w,&#13;
  573. small.jpg 320w"&#13;
  574. sizes="33.3vw" /&gt;&#13;
  575. </code></pre>
  576. <p>This <code>source</code> represents the full uncropped version of our image. We want to show the full image only in the three-column layout — that is, when the viewport is wider than 36 ems. The first attribute here, <code>media="(min-width: 36em)"</code>, makes that happen. If a query in a <code>media</code> attribute evaluates to <code>true</code>, then the browser must use that <code>source</code>; otherwise, it’s skipped.</p>
  577. <p>The <code>source</code>’s other two attributes — <code>srcset</code> and <code>sizes</code> — are mostly copied from our previous variable-sized-image example. One difference: Because this <code>source</code> will be chosen only for the three-column layout, our <code>sizes</code> attribute only needs a single length, <code>33.3vw</code>.</p>
  578. <p>When the viewport is narrower than 36 ems, the first <code>source</code>’s media query will evaluate to <code>false</code>, and we’d proceed to the second:</p>
  579. <pre><code class="language-markup">&lt;source srcset="square-large.jpg 2x,&#13;
  580. square-small.jpg 1x" /&gt;&#13;
  581. </code></pre>
  582. <p>This represents our small square crop. This version is displayed at a fixed width, but we still want it to render crisply on high-resolution screens. Thus, we’ve supplied both 1x and 2x versions and marked them up with simple <code>x</code> descriptors.</p>
  583. <p>Lastly, we come to the surprisingly important (<em>indeed, required!</em>) <code>img</code>.</p>
  584. <p>Any child of an <code>audio</code> or <code>video</code> element that isn’t a <code>source</code> is treated as fallback content and hidden in supporting browsers. You might, therefore, assume the same thing about the <code>img</code> here. Wrong! Users actually see the <code>img</code> element when we use <code>&lt;picture&gt;</code>. Without <code>img</code>, there’s no image; <code>&lt;picture&gt;</code> and all of its <code>source</code>s are just there to feed it a source.</p>
  585. <p>Why? One of the main complaints about the first <code>&lt;picture&gt;</code> specification was that it reinvented the wheel, propsing an entirely new HTML media element, along the lines of <code>audio</code> and <code>video</code>, that mostly duplicated the functionality of <code>img</code>. Duplicated functionality means duplicated implementation and maintenance work — work that browser vendors weren’t keen to undertake.</p>
  586. <p>Thus, the new specification’s reuse of <code>img</code>. The <code>&lt;picture&gt;</code> itself is invisible, a bit like a magical <code>span</code>. Its <code>source</code>s are just there for the browser to draw alternate versions of the image from. Once a source URL is chosen, that URL is fed to the <code>img</code>. Practically speaking, this means that any styles that you want to apply to your rendered image (like, say, <code>max-width: 100%</code>) need to be applied to <code>img</code>, not to <code>&lt;picture&gt;</code>.</p>
  587. <p>OK, on to our last feature.</p>
  588. <h3 id="the-type-switching-use-case">The Type-Switching Use Case <a href="#the-type-switching-use-case" aria-label="Link to section 'The Type-Switching Use Case'" class="sr hsl">Link</a></h3>
  589. <p>Let’s say that, instead of doing all of this squishing, stretching and adapting to myriad viewport conditions, we simply want to give a new file format a spin and provide a fallback for non-supporting browsers. For this, we follow the pattern established by <code>audio</code> and <code>video</code>: <code>source type</code>.</p>
  590. <pre><code class="language-markup">&lt;picture&gt;&#13;
  591. &lt;source type="image/svg" src="logo.svg" /&gt;&#13;
  592. &lt;source type="image/png" src="logo.png" /&gt;&#13;
  593. &lt;img src="logo.gif" alt="RadWolf, Inc." /&gt;&#13;
  594. &lt;/picture&gt;&#13;
  595. </code></pre>
  596. <p>If the browser doesn’t understand the <code>image/svg</code> <a href="http://en.wikipedia.org/wiki/Internet_media_type">media type</a><sup class="po" id="note-42"><a href="#42">42</a></sup>, then it skips the first <code>source</code>; if it can’t make heads or tails of <code>image/png</code>, then it falls back to <code>img</code> and the GIF.</p>
  597. <p>During the <a href="http://alistapart.com/article/pngopacity">extremely painful GIF-to-PNG transition</a><sup class="po" id="note-43"><a href="#43">43</a></sup> period, web designers would have killed for such a feature. The <code>&lt;picture&gt;</code> element gives it to us, setting the stage for new image formats to be easily adopted in the years to come.</p>
  598. <h3 id="thats-it">That’s It! <a href="#thats-it" aria-label="Link to section 'That’s It!'" class="sr hsl">Link</a></h3>
  599. <p>That’s everything: every feature in the new <code>&lt;picture&gt;</code> specification and the rationale behind each. All in all, <code>srcset</code>, <code>x</code>, <code>w</code>, <code>sizes</code>, <code>&lt;picture&gt;</code>, <code>source</code>, <code>media</code> and <code>type</code> give us a rich set of tools with which to make images truly adaptable — images that can (<em>finally!</em>) flow efficiently in flexible layouts and a wide range of devices.</p>
  600. <p><strong>The specification is not yet final</strong>. The first implementations are in progress and are being staged behind experimental flags; its implementors and authors are working together to hash out the specification’s finer details on a daily basis. All of this is happening under the umbrella of the <a href="http://responsiveimages.org">Responsive Images Community Group</a><sup class="po" id="note-44"><a href="#44">44</a></sup>. If you’re interested in following along, <a href="http://www.w3.org/community/respimg/">join</a><sup class="po" id="note-45"><a href="#45">45</a></sup> the group, drop in on the <a href="http://irc.lc/w3c/respimg/newb">IRC channel</a><sup class="po" id="note-46"><a href="#46">46</a></sup>, weigh in on a <a href="https://github.com/ResponsiveImagesCG/picture-element/issues">GitHub issue</a><sup class="po" id="note-47"><a href="#47">47</a></sup> or file a new one, sign up for the <a href="http://responsiveimages.org">newsletter</a><sup class="po" id="note-48"><a href="#48">48</a></sup>, or follow the RICG <a href="http://www.twitter.com/respimg">on Twitter</a><sup class="po" id="note-49"><a href="#49">49</a></sup>.
  601. </p><p><em>(il, al)</em></p>
  602. <ol class="po"><li id="#1"><a href="#note-1">1 http://www.smashingmagazine.com/2014/05/12/picturefill-2-0-responsive-images-and-the-perfect-polyfill/</a></li><li id="#2"><a href="#note-2">2 http://timkadlec.com/2014/05/dont-wait-on-responsive-images/</a></li><li id="#3"><a href="#note-3">3 https://twitter.com/wilto/status/465850875102371840</a></li><li id="#4"><a href="#note-4">4 http://alistapart.com/article/dao</a></li><li id="#5"><a href="#note-5">5 http://www.google.com/imghp</a></li><li id="#6"><a href="#note-6">6 http://mashable.com/2013/09/16/facebook-photo-uploads/</a></li><li id="#7"><a href="#note-7">7 http://www.loc.gov/pictures/</a></li><li id="#8"><a href="#note-8">8 https://www.flickr.com/commons</a></li><li id="#9"><a href="#note-9">9 http://www.google.com/culturalinstitute/about/artproject/</a></li><li id="#10"><a href="#note-10">10 http://www.huffingtonpost.com/2012/07/10/first-photo-ever-on-the-internet-les-horribles-cernettes_n_1662823.html</a></li><li id="#11"><a href="#note-11">11 http://bukk.it/look.jpg</a></li><li id="#12"><a href="#note-12">12 http://httparchive.org/trends.php?s=All&amp;minlabel=Nov+15+2010&amp;maxlabel=Apr+1+2014#bytesImg&amp;reqImg</a></li><li id="#13"><a href="#note-13">13 http://blog.cloudfour.com/css-media-query-for-mobile-is-fools-gold/</a></li><li id="#14"><a href="#note-14">14 http://picture.responsiveimages.org</a></li><li id="#15"><a href="#note-15">15 http://www.brucelawson.co.uk/2011/notes-on-adaptive-images-yet-again/</a></li><li id="#16"><a href="#note-16">16 http://lists.w3.org/Archives/Public/public-html/2007Jul/0121.html</a></li><li id="#17"><a href="#note-17">17 http://status.modern.ie/pictureelement</a></li><li id="#18"><a href="#note-18">18 http://picture.responsiveimages.org/images/viewport_selection_mob_first.jpg</a></li><li id="#19"><a href="#note-19">19 http://www.stevesouders.com/blog/2013/04/26/i/</a></li><li id="#20"><a href="#note-20">20 http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-May/035855.html</a></li><li id="#21"><a href="#note-21">21 http://alistapart.com/article/responsive-images-how-they-almost-worked-and-what-we-need</a></li><li id="#22"><a href="#note-22">22 http://ericportis.com/posts/2014/srcset-sizes/</a></li><li id="#23"><a href="#note-23">23 http://ericportis.com/posts/2014/srcset-sizes/</a></li><li id="#24"><a href="#note-24">24 http://ericportis.com/posts/2014/srcset-sizes/</a></li><li id="#25"><a href="#note-25">25 http://ericportis.com/etc/smashing-mag-picture-examples/variable-size.html</a></li><li id="#26"><a href="#note-26">26 http://ericportis.com/etc/smashing-mag-picture-examples/variable-size.html</a></li><li id="#27"><a href="#note-27">27 http://ericportis.com/etc/smashing-mag-picture-examples/variable-size.html</a></li><li id="#28"><a href="#note-28">28 https://github.com/ResponsiveImagesCG/picture-element/issues/85</a></li><li id="#29"><a href="#note-29">29 https://github.com/ResponsiveImagesCG/picture-element/issues/86</a></li><li id="#30"><a href="#note-30">30 http://www.w3.org/TR/css3-values/#lengths</a></li><li id="#31"><a href="#note-31">31 http://www.w3.org/TR/css3-values/#viewport-relative-lengths</a></li><li id="#32"><a href="#note-32">32 http://ericportis.com/etc/smashing-mag-picture-examples/absolute-and-fixed.html</a></li><li id="#33"><a href="#note-33">33 http://ericportis.com/etc/smashing-mag-picture-examples/absolute-and-fixed.html</a></li><li id="#34"><a href="#note-34">34 http://ericportis.com/etc/smashing-mag-picture-examples/absolute-and-fixed.html</a></li><li id="#35"><a href="#note-35">35 http://caniuse.com/calc</a></li><li id="#36"><a href="#note-36">36 http://dev.w3.org/csswg/css-values/#calc-notation</a></li><li id="#37"><a href="#note-37">37 http://ericportis.com/etc/ipad-air-art-direction/ipadair_hero_a.jpg</a></li><li id="#38"><a href="#note-38">38 http://ericportis.com/etc/ipad-air-art-direction/ipadair_hero_b.jpg</a></li><li id="#39"><a href="#note-39">39 http://ericportis.com/etc/smashing-mag-picture-examples/art-direction.html</a></li><li id="#40"><a href="#note-40">40 http://ericportis.com/etc/smashing-mag-picture-examples/art-direction.html</a></li><li id="#41"><a href="#note-41">41 http://ericportis.com/etc/smashing-mag-picture-examples/art-direction.html</a></li><li id="#42"><a href="#note-42">42 http://en.wikipedia.org/wiki/Internet_media_type</a></li><li id="#43"><a href="#note-43">43 http://alistapart.com/article/pngopacity</a></li><li id="#44"><a href="#note-44">44 http://responsiveimages.org</a></li><li id="#45"><a href="#note-45">45 http://www.w3.org/community/respimg/</a></li><li id="#46"><a href="#note-46">46 http://irc.lc/w3c/respimg/newb</a></li><li id="#47"><a href="#note-47">47 https://github.com/ResponsiveImagesCG/picture-element/issues</a></li><li id="#48"><a href="#note-48">48 http://responsiveimages.org</a></li><li id="#49"><a href="#note-49">49 http://www.twitter.com/respimg</a></li></ol>
  603. </article>
  604. </section>
  605. <nav id="jumpto">
  606. <p>
  607. <a href="/david/blog/">Accueil du blog</a> |
  608. <a href="http://www.smashingmagazine.com/2014/05/responsive-images-done-right-guide-picture-srcset/">Source originale</a> |
  609. <a href="/david/stream/2019/">Accueil du flux</a>
  610. </p>
  611. </nav>
  612. <footer>
  613. <div>
  614. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  615. <p>
  616. Bonjour/Hi!
  617. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  618. Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
  619. </p>
  620. <p>
  621. Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
  622. </p>
  623. <p>
  624. Voici quelques articles choisis :
  625. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  626. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  627. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  628. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  629. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  630. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  631. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  632. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  633. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  634. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  635. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  636. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  637. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  638. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  639. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  640. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  641. </p>
  642. <p>
  643. On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
  644. </p>
  645. <p>
  646. Je ne traque pas ta navigation mais mon
  647. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  648. conserve des logs d’accès.
  649. </p>
  650. </div>
  651. </footer>
  652. <script type="text/javascript">
  653. ;(_ => {
  654. const jumper = document.getElementById('jumper')
  655. jumper.addEventListener('click', e => {
  656. e.preventDefault()
  657. const anchor = e.target.getAttribute('href')
  658. const targetEl = document.getElementById(anchor.substring(1))
  659. targetEl.scrollIntoView({behavior: 'smooth'})
  660. })
  661. })()
  662. </script>