HTML Diff
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>=&gt; start → finish → start → finish → ∞</p>
17 </blockquote><p>=&gt; 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>&lt;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;"&gt;&lt;/animate&gt;</p>
40 <p>&lt;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;"&gt;&lt;/animate&gt;</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>&lt;svg viewBox="0 0 364 311" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;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"&gt; &lt;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;"&gt;&lt;/animate&gt; &lt;/path&gt; &lt;/svg&gt;</p>
44 <p>&lt;svg viewBox="0 0 364 311" fill="none" xmlns="http://www.w3.org/2000/svg"&gt; &lt;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"&gt; &lt;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;"&gt;&lt;/animate&gt; &lt;/path&gt; &lt;/svg&gt;</p>
45 <p>И<a>codepen</a>, где можно наглядней с ним<a>ознакомиться</a>.</p>
45 <p>И<a>codepen</a>, где можно наглядней с ним<a>ознакомиться</a>.</p>