0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Сегодня научимся создавать вот такие вещи без JS и canvas:</p>
1
<p>Сегодня научимся создавать вот такие вещи без JS и canvas:</p>
2
<p><strong>Рисуем пузырь</strong></p>
2
<p><strong>Рисуем пузырь</strong></p>
3
<ul><li>Заходим на figma.com и создаем новый файл;</li>
3
<ul><li>Заходим на figma.com и создаем новый файл;</li>
4
<li>Выбираем Pen или жмем клавишу P.</li>
4
<li>Выбираем Pen или жмем клавишу P.</li>
5
</ul><p>Рисуем прямоугольник - жмем Done.</p>
5
</ul><p>Рисуем прямоугольник - жмем Done.</p>
6
<p>Удалим обводку и заполним прямоугольник веселым цветом.</p>
6
<p>Удалим обводку и заполним прямоугольник веселым цветом.</p>
7
<p>Давайте наконец сделаем из квадрата то, что нам нужно.</p>
7
<p>Давайте наконец сделаем из квадрата то, что нам нужно.</p>
8
<p>Жмем кнопку Edit Object.</p>
8
<p>Жмем кнопку Edit Object.</p>
9
<p>Теперь Bend Tool</p>
9
<p>Теперь Bend Tool</p>
10
<p>Жмем на сторону квадрата. Должны появится вот такие точки:</p>
10
<p>Жмем на сторону квадрата. Должны появится вот такие точки:</p>
11
<p>Тянем одну из них вверх:</p>
11
<p>Тянем одну из них вверх:</p>
12
<p>Как видим - фигура искривляется. На этом мои глубокие познания в Figma и векторной графике кончаются. Поэтому просто проделываем подобный трюк для всех четырех точек.</p>
12
<p>Как видим - фигура искривляется. На этом мои глубокие познания в Figma и векторной графике кончаются. Поэтому просто проделываем подобный трюк для всех четырех точек.</p>
13
<p>Отлично, пузырь готов. Он будет нашей "стартовой" позицией.</p>
13
<p>Отлично, пузырь готов. Он будет нашей "стартовой" позицией.</p>
14
<p>Скопируем его и поставим рядом.</p>
14
<p>Скопируем его и поставим рядом.</p>
15
<p>Снова жмем Edit Object - Bend Tool и немного меняем пузырь справа.</p>
15
<p>Снова жмем Edit Object - Bend Tool и немного меняем пузырь справа.</p>
16
<blockquote><p>То, что получилось - это состояние фигуры, к которой будет стремится изначальная:</p>
16
<blockquote><p>То, что получилось - это состояние фигуры, к которой будет стремится изначальная:</p>
17
</blockquote><p>=> start → finish → start → finish → ∞</p>
17
</blockquote><p>=> start → finish → start → finish → ∞</p>
18
<p>Скачаем, то что получилось:</p>
18
<p>Скачаем, то что получилось:</p>
19
<ul><li>Выделяем вектора;</li>
19
<ul><li>Выделяем вектора;</li>
20
<li>Выбираем svg как расширение;</li>
20
<li>Выбираем svg как расширение;</li>
21
<li>Жмем Export.</li>
21
<li>Жмем Export.</li>
22
</ul><p><strong>Объедим два SVG в один анимированный</strong></p>
22
</ul><p><strong>Объедим два SVG в один анимированный</strong></p>
23
<p>Откроем скачанные svg и создадим один новый:</p>
23
<p>Откроем скачанные svg и создадим один новый:</p>
24
<p>Скопирую содержимое start в result:</p>
24
<p>Скопирую содержимое start в result:</p>
25
<p>В result.svg сделаю тег парным - :</p>
25
<p>В result.svg сделаю тег парным - :</p>
26
<p>Удалю атрибуты width и height, чтобы не мешались.</p>
26
<p>Удалю атрибуты width и height, чтобы не мешались.</p>
27
<p>Во viewBox установлю максимально возможные значения высоты и ширины:</p>
27
<p>Во viewBox установлю максимально возможные значения высоты и ширины:</p>
28
<ul><li>в start.svg ширина = 363, а в finish.svg = 364. Беру 364;</li>
28
<ul><li>в start.svg ширина = 363, а в finish.svg = 364. Беру 364;</li>
29
<li>в start.svg высота = 302, а в finish.svg = 311. Беру 311.</li>
29
<li>в start.svg высота = 302, а в finish.svg = 311. Беру 311.</li>
30
</ul><p>Ключевой момент: анимировать будем с помощью тега<a>animate</a>.</p>
30
</ul><p>Ключевой момент: анимировать будем с помощью тега<a>animate</a>.</p>
31
<blockquote><p>Обратите внимание на поддержку браузеров!</p>
31
<blockquote><p>Обратите внимание на поддержку браузеров!</p>
32
</blockquote><p>Вкладываем его внутрь path:</p>
32
</blockquote><p>Вкладываем его внутрь path:</p>
33
<p>Коротко по атрибутам:</p>
33
<p>Коротко по атрибутам:</p>
34
<ul><li>repeatCount - сколько раз произойдет анимация. Устанавливаем indefinite, чтобы задать бесконечное число итераций;</li>
34
<ul><li>repeatCount - сколько раз произойдет анимация. Устанавливаем indefinite, чтобы задать бесконечное число итераций;</li>
35
<li>attributeName - имя атрибута, который будем анимировать. В нашем примере это d, где хранятся координаты фигуры;</li>
35
<li>attributeName - имя атрибута, который будем анимировать. В нашем примере это d, где хранятся координаты фигуры;</li>
36
<li>dur - длительность анимации.</li>
36
<li>dur - длительность анимации.</li>
37
</ul><p>Добавим еще один - values. Скопипастим в него значение атрибута d из текущего тега path:</p>
37
</ul><p>Добавим еще один - values. Скопипастим в него значение атрибута d из текущего тега path:</p>
38
<p>Добавим в него же значение атрибута d из файла finish.svg:</p>
38
<p>Добавим в него же значение атрибута d из файла finish.svg:</p>
39
<p>Третьей строку копипастим из первой дабы замкнуть анимацию:</p>
39
<p>Третьей строку копипастим из первой дабы замкнуть анимацию:</p>
40
<p><animate repeatCount="indefinite" attributeName="d" dur="10s" values="M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z; M302.348 71.5969C209 -48 69.1956 6.19389 41.3478 71.5969C13.5 137 -35.5 223 41.3478 273.597C118.196 324.194 233.195 322.694 302.348 273.597C371.5 224.5 395.695 191.194 302.348 71.5969Z; M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z;"></animate></p>
40
<p><animate repeatCount="indefinite" attributeName="d" dur="10s" values="M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z; M302.348 71.5969C209 -48 69.1956 6.19389 41.3478 71.5969C13.5 137 -35.5 223 41.3478 273.597C118.196 324.194 233.195 322.694 302.348 273.597C371.5 224.5 395.695 191.194 302.348 71.5969Z; M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z;"></animate></p>
41
<p><strong>Результат:</strong></p>
41
<p><strong>Результат:</strong></p>
42
<p>Как выглядит вы можете посмотреть в самом начале статьи.</p>
42
<p>Как выглядит вы можете посмотреть в самом начале статьи.</p>
43
<p>Сюда же я скину сам svg:</p>
43
<p>Сюда же я скину сам svg:</p>
44
<p><svg viewBox="0 0 364 311" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z" fill="#FFCC00"> <animate repeatCount="indefinite" attributeName="d" dur="10s" values="M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z; M302.348 71.5969C209 -48 69.1956 6.19389 41.3478 71.5969C13.5 137 -35.5 223 41.3478 273.597C118.196 324.194 233.195 322.694 302.348 273.597C371.5 224.5 395.695 191.194 302.348 71.5969Z; M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z;"></animate> </path> </svg></p>
44
<p><svg viewBox="0 0 364 311" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z" fill="#FFCC00"> <animate repeatCount="indefinite" attributeName="d" dur="10s" values="M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z; M302.348 71.5969C209 -48 69.1956 6.19389 41.3478 71.5969C13.5 137 -35.5 223 41.3478 273.597C118.196 324.194 233.195 322.694 302.348 273.597C371.5 224.5 395.695 191.194 302.348 71.5969Z; M314 46.0001C253 0 137 -28 52.9999 46.0001C-31.0001 120 -1.0002 202 52.9999 248C107 294 247 340 314 248C381 156 375 92.0001 314 46.0001Z;"></animate> </path> </svg></p>
45
<p>И<a>codepen</a>, где можно наглядней с ним<a>ознакомиться</a>.</p>
45
<p>И<a>codepen</a>, где можно наглядней с ним<a>ознакомиться</a>.</p>