CodeFest 2019. Вадим Макеев (HTML Academy) — Делайте из слона муху

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
April 07, 2019

CodeFest 2019. Вадим Макеев (HTML Academy) — Делайте из слона муху

У разметки, стилей и скриптов есть всё: спецификации, документация, множество конкурирующих решений, понятные лучшие практики. 25 лет спустя после появления тега img графика для веба — всё ещё чёртова магия, которая передаётся в устной традиции. «Мой дед всю жизнь джипеги из Фотошопа сохранял, и ничего — дожил до ста». 15 лет опыта в одном докладе: от создания и экспорта графики до оптимизации и вставки.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 07, 2019
Tweet

Transcript

  1. 3.
  2. 4.
  3. 7.
  4. 12.

    Контент Содержимое страницы Создаётся после Копируется, сохраняется Живёт отдельно от

    кода Нужна пользователям Интерфейс Оформление, дизайн Как код, только нет Создаётся с кодом Живёт кодом Иногда и правда код — — — — — — — — — — © Matt Groening 12
  5. 14.
  6. 15.

    Векторные Цвета Прозрачность Анимация SVG Много Да Да SVG —

    это программируемая графика, как Canvas. 15
  7. 16.

    Растровые Цвета Прозрачность Анимация GIF 256 Да Да PNG 256

    и больше Да, альфа Да * JPEG Много Нет Нет WebP 256 и больше Да, альфа Да HEIC Много Да, альфа Да 16
  8. 20.

    video/webm bolt.webm video/mp4 bolt.mp4 Видео <video autoplay loop muted> <source

    type=" " src=" "> <source type=" " src=" "> </video> $ ffmpeg -i bolt.gif -movflags faststart -pix_fmt yuv420p -crf 01. 02. 03. 04. 20
  9. 21.

    image/webp bolt.webp bolt.gif Если очень нужно <picture> <source type=" "

    srcset=" "> <img src=" " alt="Болт кривляется"> </picture> $ gif2webp bolt.gif -o bolt.webp 01. 02. 03. 04. 21
  10. 23.

    GIF

  11. 26.
  12. 29.

    burger burger__line burger__line burger__line CSS-графика <div class=" "> <div class="

    burger__line--1"></div> <div class=" burger__line--2"></div> <div class=" burger__line--3"></div> </div> 01. 02. 03. 04. 05. 29
  13. 30.

    .burger 12px 10px .burger__line 12px 2px CSS-графика { position: relative;

    width: ; height: ; } { position: absolute; left: 0; width: ; height: ; background-color: #4b86c2; } 01. 02. 03. 04. 05. 01. 02. 03. 04. 05. 06. 07. 30
  14. 31.

    0 4px 8px CSS-графика .burger__line--1 { top: ; } .burger__line--2

    { top: ; } .burger__line--1 { top: ; } 01. 02. 03. 04. 05. 06. 01. 02. 03. 31
  15. 32.

    12px 10px 2px 2px 4px CSS-графика получше .burger { width:

    ; height: ; background-image: repeating-linear-gradient( #4b86c2, #4b86c2 , #fff , #fff ); } 01. 02. 03. 04. 05. 06. 07. 32
  16. 33.

    0 0 12 10 0 4 8 Ручной SVG <svg

    width="120" viewBox=" " fill="#4b86c2"> <rect width="12" height="2" x="0" y=" "/> <rect width="12" height="2" x="0" y=" "/> <rect width="12" height="2" x="0" y=" "/> </svg> 01. 02. 03. 04. 05. 33
  17. 34.
  18. 36.

    #4b86c2 paint(burger) burger.js CSS Paint API div { --burger-color: ;

    background-image: url('burger.png'); background-image: ; } CSS.paintWorklet.addModule(' '); 01. 02. 03. 04. 05. 36
  19. 37.

    Shape inputProperties() paint … burger Shape CSS Paint API class

    { static get { return ['--burger-color']; } (context, geometry, properties) { } } registerPaint(' ', ); 01. 02. 03. 04. 05. 06. 07. 37
  20. 38.

    --burger-color color CSS Paint API const color = properties.get( '

    ' ); context.fillStyle = ; context.fillRect(0, 0, 120, 20); context.fillRect(0, 40, 120, 20); context.fillRect(0, 80, 120, 20); 01. 02. 03. 04. 05. 06. 07. 38
  21. 42.
  22. 43.
  23. 44.
  24. 45.
  25. 46.
  26. 47.
  27. 48.
  28. 49.
  29. 50.
  30. 51.
  31. 52.
  32. 53.
  33. 54.
  34. 55.
  35. 56.

    data:image/png;base64 Заглядывайте в SVG <svg><image xlink:href=" ,iVBORw0KGgo AAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAA7EAAAOxAGV Kw4bAAAIXUlEQVR4nO3WMQEAIAzAsIF/z+ACjiYKenbNzBkAIGX/DgAA3 jMAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAEGQAACDIAABBkAAAgyA

    AAQJABAIAgAwAAQQYAAIIMAAAEGQAACDIAABBkAAAgyAAAQJABAIAgAwA AQQYAAIIMAAAEGQAACDIAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAE GQAACDIAABBkAAAgyAAAQJABAIAgAwAAQQYAAIIMAAAEGQA…"/></svg> 56
  36. 57.

    Экспорт PNG PNG 8 JPG SVG Photoshop 852 155 3596

    130 Affinity 1555 856 10793 602 Sketch 5639 … 3836 525 Figma 2179 … 7797 153 Руки 111 111 1144 98 57
  37. 61.
  38. 62.
  39. 63.
  40. 64.
  41. 68.

    Рыжий кот Рыжий кот Мой кот самый лучший Тегом <img

    src="cat.jpg" alt=" "> <figure> <img src="cat.jpg" alt=" "> <figcaption> </figcaption> </figure> Идеально для контентных картинок. 01. 02. 03. 04. 68
  42. 69.

    cat@2x.webp 2x cat.webp 1x cat@2x.jpg 2x cat.jpg Тегом: плюшки <picture>

    <source type="image/webp" srcset=" "> <img srcset=" " src=" " alt="Рыжий кот"> </picture> 01. 02. 03. 04. 05. 06. 07. 69
  43. 70.

    cat@3x.jpg 3x cat@2x.jpg 2x cat.jpg Тегом: плюшки <img srcset=" "

    srcset=" " src=" " alt="Рыжий кот"> Для ретины достаточно атрибута srcset . 01. 02. 03. 04. 70
  44. 72.

    min-resolution: 2dppx icon@2x.png Фоном: плюшки @media ( ) { button

    { background-image: url( ); } } Не забудьте про Autoprefixer -webkit-min-device-pixel-ratio . 01. 02. 03. 04. 05. 72
  45. 73.

    background-image: url(icon.webp) icon.webp Фоном: облом @supports ( ) { button

    { background-image: url( ); } } Другой формат в стилях просто не подсунуть, см. Modernizr. 01. 02. 03. 04. 05. 73
  46. 79.

    burger Меню burger__line burger__line burger__line Инлайном <svg class=" " viewBox="0

    0 12 10" aria-label=" "> <rect class=" " x="0" y="0"/> <rect class=" " x="0" y="4"/> <rect class=" " x="0" y="8"/> </svg> Видно из стилей, удобно менять цвета. 01. 02. 03. 04. 05. 79
  47. 80.
  48. 81.

    Меню #burger Спрайтом <svg width="120" height="100" viewBox="0 0 12 10"

    aria-label=" "> <use xlink:href=" "></use> </svg> Видно из стилей, удобно менять цвета. 01. 02. 03. 04. 81
  49. 82.

    Меню sprite.svg#burger Внешним спрайтом <svg width="120" height="100" aria-label=" "> <use

    xlink:href=" "></use> </svg> К сожалению, стили уже не пробьются внутрь. Но оно вам точно нужно? 01. 02. 03. 04. 82
  50. 83.

    xmlns burger 0 0 12 10 Внешним спрайтом <svg ="http://www.w3.org/2000/svg">

    <symbol id=" " viewBox=" "> <rect width="12" height="2" x="0" y="0"/> <rect width="12" height="2" x="0" y="4"/> <rect width="12" height="2" x="0" y="8"/> </symbol> </svg> 01. 02. 03. 04. 05. 06. 07. 83
  51. 85.

    data:image/svg+xml URL-кодирование button { background-image: url(' ,%3Csvg xmlns ='http://www.w3.org/2000/svg' viewBox='0

    0 12 10' fill='%234b86c2'%3E%3Crect width='12' height='2' x='0' y='0'/%3E%3Crect width='12' height='2' x='0' y='4'/%3E%3Crect width='12' height='2' x='0' y…'); } 01. 02. 03. 85
  52. 86.
  53. 89.

    lazyload="on" Ленивая загрузка <img src="picture.jpg" > on — откладывает запрос

    до контента off — запрашивает сразу же auto — как решит браузер Feature-Policy: lazyload 'self'(auto|off|force) — — — 89
  54. 90.

    importance="low" preload Приоритет загрузки <img src="picture.jpg" > high — повышает

    приоритет загрузки low — понижает приоритет загрузки Если очень-очень нужно, то осторожно можно: <link rel=" " href="picture.jpg" as="image"> — — 90
  55. 91.

    async="on" Неблокирующий рендеринг <img src="picture.jpg" > on — ждёт, когда

    у браузера будет возможность off — декодирует сразу, блокируя основной поток — — 91
  56. 92.

    new Image() onload decode() Загрузка скриптом const img = ;

    img.src = 'picture.png'; img. = () => { // Вставка img }; img. .then(() => { // Вставка img }); Пока только в Chrome, см. MDN и ждите счастья. 01. 02. 01. 02. 03. 01. 02. 03. 92
  57. 93.

    new Image() decode() Проверка поддержки const img = ; img.src

    = 'picture.webp'; img. .then(() => { console.info('WebP'); }).catch(() => { console.warn('Извини'); }); 01. 02. 03. 04. 05. 06. 07. 93
  58. 96.

    Ссылки The anatomy of responsive images The origin of the

    IMG tag Imagery on the Web The joy of optimizing images Converting images to WebP Новый кодек AV1 WebP Docs: getting started The CSS Paint API High efficiency image file format Responsive images: Use cases Use Imagemin to compress images — — — — — — — — — — — 96