Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Прекрасный мир графики
Search
Polina Gurtovaya
October 12, 2019
Technology
630
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Прекрасный мир графики
Доклад о разных графических форматах и о том как их правильно готовить.
Polina Gurtovaya
October 12, 2019
More Decks by Polina Gurtovaya
See All by Polina Gurtovaya
Не учите алгоритмы
hellsquirrel
1
1k
Давайте все заблокируем
hellsquirrel
0
360
Wasmысле?
hellsquirrel
0
270
Магия декларативныx схем.
hellsquirrel
0
390
ML for HolyJS
hellsquirrel
0
190
Идеальный способ заблюрить белочку
hellsquirrel
0
190
ML/DL на фронте
hellsquirrel
0
240
InsertableStreams
hellsquirrel
0
120
WebRTC-404
hellsquirrel
0
570
Other Decks in Technology
See All in Technology
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
580
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
570
Claude Code の Sandbox 機能を Anthropic Sandbox Runtime(srt) で試そう!/lets-play-anthropic-sandbox-runtime
tomoki10
1
480
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
570
On-behalf-of Token exchange with AgentCore Identity
hironobuiga
2
120
Agentic ERPをどう設計するか ー 受発注エージェントを動かす、現場の知見と設計思想ー
recerqainc
1
2.1k
Agentic Web
dynamis
1
200
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
860
フロンティアAIのゲート化と地政学リスク
nagatsu
0
110
Dario Amodi『Policy on the AI Exponential』を理解する
nagatsu
0
210
RSA暗号を手計算したくなること、ありますよね?? (20260615_orestudy6_rsa)
thousanda
0
100
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
470
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
320
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
170
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
600
Between Models and Reality
mayunak
4
330
Leo the Paperboy
mayatellez
7
1.8k
Technical Leadership for Architectural Decision Making
baasie
3
400
How to make the Groovebox
asonas
2
2.2k
Automating Front-end Workflow
addyosmani
1370
210k
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]