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
1
610
Прекрасный мир графики
Доклад о разных графических форматах и о том как их правильно готовить.
Polina Gurtovaya
October 12, 2019
Tweet
Share
More Decks by Polina Gurtovaya
See All by Polina Gurtovaya
Не учите алгоритмы
hellsquirrel
1
960
Давайте все заблокируем
hellsquirrel
0
310
Wasmысле?
hellsquirrel
0
220
Магия декларативныx схем.
hellsquirrel
0
340
ML for HolyJS
hellsquirrel
0
140
Идеальный способ заблюрить белочку
hellsquirrel
0
160
ML/DL на фронте
hellsquirrel
0
190
InsertableStreams
hellsquirrel
0
85
WebRTC-404
hellsquirrel
0
510
Other Decks in Technology
See All in Technology
Shadow DOMとセキュリティ - 光と影の境界を探る / Shibuya.XSS techtalk #13
masatokinugawa
0
310
スプリントレビューを効果的にするために
miholovesq
9
1.7k
AI エンジニアの立場からみた、AI コーディング時代の開発の品質向上の取り組みと妄想
soh9834
8
590
Power Automate のパフォーマンス改善レシピ / Power Automate Performance Improvement Recipes
karamem0
0
270
claude codeでPrompt Engineering
iori0311
0
530
Shadow DOM & Security - Exploring the boundary between light and shadow
masatokinugawa
0
760
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
270
クマ×共生 HACKATHON - 熊対策を『特別な行動」から「生活の一部」に -
pharaohkj
0
180
Expertise as a Service via MCP
yodakeisuke
1
160
経理出身PdMがAIプロダクト開発を_ハンズオンで学んだ話.pdf
shunsukenarita
1
230
alecthomas/kong はいいぞ
fujiwara3
6
1.1k
ecspressoの設計思想に至る道 / sekkeinight2025
fujiwara3
12
2.1k
Featured
See All Featured
RailsConf 2023
tenderlove
30
1.2k
Designing Experiences People Love
moore
142
24k
Fireside Chat
paigeccino
37
3.5k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Site-Speed That Sticks
csswizardry
10
720
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.4k
KATA
mclloyd
30
14k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.4k
Building Applications with DynamoDB
mza
95
6.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Git: the NoSQL Database
bkeepers
PRO
431
65k
Visualization
eitanlees
146
16k
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]