$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Прекрасный мир графики
Search
Polina Gurtovaya
October 12, 2019
Technology
1
620
Прекрасный мир графики
Доклад о разных графических форматах и о том как их правильно готовить.
Polina Gurtovaya
October 12, 2019
Tweet
Share
More Decks by Polina Gurtovaya
See All by Polina Gurtovaya
Не учите алгоритмы
hellsquirrel
1
1k
Давайте все заблокируем
hellsquirrel
0
340
Wasmысле?
hellsquirrel
0
250
Магия декларативныx схем.
hellsquirrel
0
360
ML for HolyJS
hellsquirrel
0
170
Идеальный способ заблюрить белочку
hellsquirrel
0
180
ML/DL на фронте
hellsquirrel
0
220
InsertableStreams
hellsquirrel
0
100
WebRTC-404
hellsquirrel
0
540
Other Decks in Technology
See All in Technology
LLM-Readyなデータ基盤を高速に構築するためのアジャイルデータモデリングの実例
kashira
0
270
re:Invent2025 3つの Frontier Agents を紹介 / introducing-3-frontier-agents
tomoki10
0
240
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
1.7k
5分で知るMicrosoft Ignite
taiponrock
PRO
0
390
Amazon Quick Suite で始める手軽な AI エージェント
shimy
0
210
Jakarta Agentic AI Specification - Status and Future
reza_rahman
0
110
re:Invent 2025 ~何をする者であり、どこへいくのか~
tetutetu214
0
220
エンジニアリングをやめたくないので問い続ける
estie
2
1.2k
ChatGPTで論⽂は読めるのか
spatial_ai_network
11
29k
Kiro を用いたペアプロのススメ
taikis
1
190
WordPress は終わったのか ~今のWordPress の制作手法ってなにがあんねん?~ / Is WordPress Over? How We Build with WordPress Today
tbshiki
1
820
Power of Kiro : あなたの㌔はパワステ搭載ですか?
r3_yamauchi
PRO
0
180
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.2k
Bash Introduction
62gerente
615
210k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.3k
GitHub's CSS Performance
jonrohan
1032
470k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.3k
Building Applications with DynamoDB
mza
96
6.8k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
740
Designing Experiences People Love
moore
143
24k
GraphQLとの向き合い方2022年版
quramy
50
14k
Context Engineering - Making Every Token Count
addyosmani
9
530
Transcript
Прекрасный мир графики 1
2
3
4
Итак, прекрасный мир графики 5
Графика Иллюстрирует Развлекает Добавляет немного добра на страничку 6
Это может быть Картинка Видяшка Взрывающийся вертолёт 7
Для десктопа ~50% контента это изображения 8
Это самая яркая часть нашей страницы 9
Мы с дизайнерами решаем одну задачу 10
Для кого? 11
Человек Использует глаза и мозг Злопамятное существо Любит когда 60fps
Не любит ждать 12
Зачем ? 13
14
15
Изображения 16
17 Использовать экспортированное из макета Использовать что дадут Попросить исходник
Провести эксперимент
Инструменты для экспериментов svgo (svgoomg- web-версия) optipng, cwebp, cjpeg aka
mozjpeg, ImageMagic, libvips imagemin, sharp squoosh ffmpeg imageoptim 18
SVG PNG JPEG WEBP 19 Pастр Вектор
pазмер контейнера devicePixelRatio 20 Каким должен быть размер растрового изображения?
Чтобы везде работало 21 <picture> <source srcset="cupcake.webp 1x,
[email protected]
2x"
type="image/webp" /> <source srcset="cupcake.webp 1x,
[email protected]
2x" type="image/jpeg" /> <img src="cupcake.jpg" alt="a yummy cupcake" /> </picture>
Когда SVG заходят хорошо 22 Часть изображения можно представить как
набор геометрических примитивов Есть интерактивность Нужно цеплять маркеры к фону Нужно много размеров
23 Со временем в голове сформируется нужная связь и потребность
в экспериментах снизится
Эксперимент 24
Берем тестовую картинку unicorn.svg - 12kB После svgo - 5.1kB
(57.5%) gzip - 2.7kB (77%) webP@2x - 4.7kB (60.8%) webP - 2.2kB (81.7%) 25
Тестовый единорог внутри <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 113 199”> <g
stroke-width="2.01"> <path d=“…534z” /> <path d=“…9z” fill="#f19c9b"/> <path d=“…” /> … </svg> 26
<path /> <path d="M215.147 235.789c0-13.921 2.609-31.501 9.735- 40.624 7.126-9.123 16.97-14.765
27.844-14.765 10.874 0 19.62 7.386 26.746 16.509 7.126 9.123 10.788 21.702 1 0.788 35.623 0 13.921-3.459 22.429-10.585 31.552-7.125 9.122-12.332 13.435-23.205 13.435-10.874 0-23.002-2.0 74-30.127-11.196-7.126-9.123-11.196-16.613-11.196-30.5 34z"/> https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths 27
<path /> 28 M - начало пути L - линия
(V, H) C - кривая (S, Q, T) A - дуга Z - замыкаем путь
SVG можно морфить flubber отлично морфит 29
JavaScript - анимации JS - анимации выполняются в том же
“потоке” что и основной JS requestAnimationFrame — обязательно нужно использовать, но он никогда не сработает если основной поток занят У нас всего 16.666667 ms :) 30
31
Пример с печенькой <svg xmlns=“…” width="200" height="120" viewBox="0 0 200
120"> <ellipse cx="100" cy="60" fill="#FDC970" rx="100" ry="60"/> <path fill="#794545" d="M69.5433628,33.5480878 C65.8626549…”/> </svg> 32
width and height 33 Original w/o width & height width=30vh
viewBox overflow: visible 34 viewBox: 0 0 100 120 width:
90px
preserveAspectRatio none 35 meet slice
Округление важно 36 d="M146.215 46.605c5.233…" d="M146.2 46.6c5.2…”
Насколько округлять? 37 Надо учитывать: container size, devicePixelRatio, inner transformations.
Начитать можно с : 1 знак - контейнер совпадает с размером svg, 2 знака — контейнер в 10 раз больше …etc
Печенька с друзьями 38
Печенька с друзьями <svg xmlns="http://www.w3.org/2000/svg" width="913" height="552"> <g transform="translate(523 128)">
<ellipse cx="100" cy="60" fill="#FDC970" rx="100" ry="60"/> <path fill="#794545" d="..."/> </g> <g transform="translate(665 236)"> <ellipse cx="100" cy="60" fill="#FDC970" rx="100" ry="60"/> <path fill="#794545" d="..."/> </g> ... </svg> 39
Печенька с друзьями <svg xmlns="http://www.w3.org/2000/svg" width="913" height="552"> <defs> <g id="cookie">
<ellipse cx="100" cy="60" fill="#FDC970" rx="100" ry="60"/> <path fill="#794545" d="..."/> </g> </defs> <use href="#cookie" transform="translate(521 128)"/> <use href="#cookie" transform="translate(500 236)"/> ... </svg> 40
Сюрпризы внутри SVG <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 565 319"> <script>console.log('')</script>
<ellipse cx="282.5" cy="159.5" fill="#FDC970" rx="282.5" ry="159.5"/> <path fill="#794545" d="M196.46 ..." /> </svg> 41
Сюрпризы внутри SVG <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 565 319"> <image
height="2388" width="1669" x=".635" xlink:href="data:image/ png;base64,iVBORw0KGgoA..." /> </svg> 42
Как инлайнить SVG import React from "react"; import Logo from
"./logo.svg"; const App = () => <Logo />; export default App; 43 сreate-react-app использует https:/ /github.com/smooth-code/svgr
Мы инлайним SVG чтобы с ними было yдобно работать 44
Шевелящийся контент 45
Видео 46
ffmpeg - наш классный и универсальный инструмент 47
Контейнеры webm mp4 48
Видео кодеки VP8 VP9 AV1 H.264 H.265 49 <video autoplay
muted> <source src="unicorn.webm" type="video/webm" /> <source src="unicorn.mp4" type="video/mp4" /> </video>
Используйте эффективный кодек 50 evl.ms/blog/better-web-video-with-av1-codec
Избегайте страшных звуков :) 51 <video autoplay muted> <source src="unicorn.webm"
type="video/webm" /> <source src="unicorn.mp4" type="video/mp4" /> </video>
Анимированные картинки APNG WebP GIF 52
SVG — анимации 53
54
Есть куча прикольных анимирующихся CSS свойств 55
Анимируй - трансформируй (transform) 56 .animated { transform: ... ;
} Все что делает transform: (translate, rotate, scale, skew) можно описать при помощи матрицы
57 .transformed { transform: matrix3d( 1, 0, 0, 0, 0,
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); }
Фильтры 58
Clip-path 59
stroke-dasharray 60
Как анимировать • CSS animation API (плохая поддержка) • Можно
костыльнуть через @keyframe 61
62 <Path className={cx("path")} ref={ref} style={{ strokeDasharray: pathLen, strokeDashoffset: pathLen, animation:
"15s dash 300ms infinite linear" }} />
63 const pathElement = svg.querySelector("path"); const length = pathElement.getTotalLength(); const
dist = length / numPoints; const points = [...Array(numPoints)].map((_, index) => { const { x, y } = data.getPointAtLength(index * dist); return { transform: `translateX(${3 * x}px) translateY(${3 * y}px)` }; }); fish.animate(points, { duration: 15000, iterations: Infinity }); setPathLen(length);
64 const data = ref.current.querySelector("path"); const length = data.getTotalLength(); const
dist = length / numPoints; const points = [...Array(numPoints)].map((_, index) => { const { x, y } = data.getPointAtLength(index * dist); return { transform: `translateX(${3 * x}px) translateY(${3 * y}px)` }; }); const keyFrames = `@keyframes fly { ${points .map( (point, index) => `${((index * 100) / numPoints).toFixed(2)}% { transform: ${ point.transform }; }` ) .join("\n")} }`; setPathLen(length);
Что еще прикольного можно делать? 65
Generative art 66
67
Процессинг и трансформация изображений • Обрезать картинку • Обнаружить предмет
• Применить затейливый фильтр (cместить цвета, etc) • Что-нибудь измерить 68 При помощи <canvas /> можно:
Пиксель измеряющий 69
Все работает быстро 70
WebGL 71
72 56ms x6 slowdown
Почему спецеэффекты в web - редкость? Низкая конверсия Никто не
верит в свои силы Нам лень :) 73
Путь к успеху Добавьте осознанности к процессу Используйте правильные инструменты
Сравнивайте результаты Не бойтесь экспериментировать Почитайте спец. литературу :) 74
75 evl.ms/blog/images-done-right-web-graphics-good-to-the-last-byte-optimization-techniques
Спасибо! 76 @polina_gurtovaya @pgurtovaya
[email protected]