HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p><strong>Ant Design</strong>- это React UI-библиотека, состоящая из множества простых в применении компонентов. Инструмент очень полезен, если вы планируете создавать элегантные пользовательские интерфейсы. Ant Design был создан разработчиками из Alibaba.</p>
1 <p><strong>Ant Design</strong>- это React UI-библиотека, состоящая из множества простых в применении компонентов. Инструмент очень полезен, если вы планируете создавать элегантные пользовательские интерфейсы. Ant Design был создан разработчиками из Alibaba.</p>
2 <p>Посмотрим на анимацию на лендинге разработчиков:</p>
2 <p>Посмотрим на анимацию на лендинге разработчиков:</p>
3 <p>Заметно, что предлагается много анимированных элементов. Но мы для обзора возьмём упрощённую версию:</p>
3 <p>Заметно, что предлагается много анимированных элементов. Но мы для обзора возьмём упрощённую версию:</p>
4 <p>В анимации, представленной выше, задействован компонент<strong>TweenOne</strong>, которому потребуется PathPlugin для задания траектории. Для работы следует поместить PathPlugin в TweenOne.plugins.</p>
4 <p>В анимации, представленной выше, задействован компонент<strong>TweenOne</strong>, которому потребуется PathPlugin для задания траектории. Для работы следует поместить PathPlugin в TweenOne.plugins.</p>
5 TweenOne.plugins.push(PathPlugin);<p>Анимацию можно настраивать, используя следующие параметры: •<strong>ease</strong>- плавность анимации; •<strong>duration</strong>- время анимации в миллисекундах; •<strong>yoyo</strong>- чередование движения назад и вперёд с каждым повторением; •<strong>repeat</strong>- повтор анимации. Для бесконечной анимации следует использовать -1; •<strong>easePath</strong>- координаты плавного пути для анимации; •<strong>p</strong>- координаты пути для анимации.</p>
5 TweenOne.plugins.push(PathPlugin);<p>Анимацию можно настраивать, используя следующие параметры: •<strong>ease</strong>- плавность анимации; •<strong>duration</strong>- время анимации в миллисекундах; •<strong>yoyo</strong>- чередование движения назад и вперёд с каждым повторением; •<strong>repeat</strong>- повтор анимации. Для бесконечной анимации следует использовать -1; •<strong>easePath</strong>- координаты плавного пути для анимации; •<strong>p</strong>- координаты пути для анимации.</p>
6 <p>О последних 2-х параметрах, более специфичных для данного svg, беспокоиться не стоит.</p>
6 <p>О последних 2-х параметрах, более специфичных для данного svg, беспокоиться не стоит.</p>
7 const duration = 7000; const ease = 'easeInOutSine'; const p = 'M123.5,89.5 C148,82.5 239.5,48.5 230,17.5 C220.5,-13.5 127,6 99.5,13.5 C72,21 -9.5,56.5 1.5,84.5 C12.5,112.5 99,96.5 123.5,89.5 Z'; const easePath = 'M0,100 C7.33333333,89 14.3333333,81.6666667 21,78 C25.3601456,75.6019199 29.8706084,72.9026327 33,70 C37.0478723,66.2454406 39.3980801,62.0758689 42.5,57 C48,46.5 61.5,32.5 70,28 C77.5,23.5 81.5,20 86.5,16 C89.8333333,13.3333333 94.3333333,8 100,0'; const loop = { yoyo: true, repeat: -1, duration, ease, };<p>Теперь создадим объект анимации, имеющий 3 анимационных типа: •<strong>redSquare</strong>- здесь есть параметры цикла, координата Y, задержка и длительность; •<strong>greenBall</strong>- этот тип имеет путь с параметрами объекта x, y - значение p. При этом длительность, плавность и повтор (TweenOne.easing.path) - функция с 2-мя параметрами: - lengthPixel - кривая, которая разделена на 400 секций; - path - координата easePath; •<strong>track</strong>- овал с осями, который имеет параметр поворота и стили цикла.</p>
7 const duration = 7000; const ease = 'easeInOutSine'; const p = 'M123.5,89.5 C148,82.5 239.5,48.5 230,17.5 C220.5,-13.5 127,6 99.5,13.5 C72,21 -9.5,56.5 1.5,84.5 C12.5,112.5 99,96.5 123.5,89.5 Z'; const easePath = 'M0,100 C7.33333333,89 14.3333333,81.6666667 21,78 C25.3601456,75.6019199 29.8706084,72.9026327 33,70 C37.0478723,66.2454406 39.3980801,62.0758689 42.5,57 C48,46.5 61.5,32.5 70,28 C77.5,23.5 81.5,20 86.5,16 C89.8333333,13.3333333 94.3333333,8 100,0'; const loop = { yoyo: true, repeat: -1, duration, ease, };<p>Теперь создадим объект анимации, имеющий 3 анимационных типа: •<strong>redSquare</strong>- здесь есть параметры цикла, координата Y, задержка и длительность; •<strong>greenBall</strong>- этот тип имеет путь с параметрами объекта x, y - значение p. При этом длительность, плавность и повтор (TweenOne.easing.path) - функция с 2-мя параметрами: - lengthPixel - кривая, которая разделена на 400 секций; - path - координата easePath; •<strong>track</strong>- овал с осями, который имеет параметр поворота и стили цикла.</p>
8 const animate = { redSquare: { ...loop, y: 15, duration: 3000, delay: 200, }, greenBall: { path: { x: p, y: p }, duration: 5000, repeat: -1, ease: TweenOne.easing.path(easePath, { lengthPixel: 400 }), }, track: { ...loop, rotate: 15, }, };<p>Отдельного внимания заслуживает компонент TweenOne. Он применяется в виде базового компонента с анимационными и базовыми props. Это, как раз таки, и есть наша анимация. Каждый TweenOne обладает своими правилами анимации, такими как track, redSquare, greenBall.</p>
8 const animate = { redSquare: { ...loop, y: 15, duration: 3000, delay: 200, }, greenBall: { path: { x: p, y: p }, duration: 5000, repeat: -1, ease: TweenOne.easing.path(easePath, { lengthPixel: 400 }), }, track: { ...loop, rotate: 15, }, };<p>Отдельного внимания заслуживает компонент TweenOne. Он применяется в виде базового компонента с анимационными и базовыми props. Это, как раз таки, и есть наша анимация. Каждый TweenOne обладает своими правилами анимации, такими как track, redSquare, greenBall.</p>
9 import React from 'react'; import TweenOne from 'rc-tween-one'; export default function BannerImage() { return ( &lt;div className="wrapper-ant-design"&gt; &lt;svg width="482px" height="500px" viewBox="0 0 482 500"&gt; &lt;defs&gt; &lt;path d="M151,55 C129.666667,62.6666667 116,74.3333333 110,90 C104,105.666667 103,118.5 107,128.5 L225.5,96 C219.833333,79 209.666667,67 195,60 C180.333333,53 165.666667,51.3333333 151,55 L137,0 L306.5,6.5 L306.5,156 L227,187.5 L61.5,191 C4.5,175 -12.6666667,147.833333 10,109.5 C32.6666667,71.1666667 75,34.6666667 137,0 L151,55 Z" id="mask" /&gt; &lt;/defs&gt; &lt;g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd" transform="translate(0, 30)"&gt; &lt;g id="Group-13" transform="translate(0.000000, 41.000000)"&gt; &lt;TweenOne component="g" animation={animate.redSquare}&gt; &lt;rect stroke="#F5222D" strokeWidth="1.6" transform="translate(184.000000, 18.000000) rotate(8.000000) translate(-184.000000, -18.000000) " x="176.8" y="150.8" width="14.4" height="14.4" rx="3.6" /&gt; &lt;/TweenOne&gt; &lt;/g&gt; &lt;g id="Group-14" transform="translate(150.000000, 230.000000)"&gt; &lt;g id="Group-22" transform="translate(62.000000, 7.000000)"&gt; &lt;image id="cc4" alt="globe" xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/FpKOqFadwoFFIZFExjaf.png" width="151px" height="234px" /&gt; &lt;/g&gt; &lt;mask id="mask-2"&gt; &lt;use xlinkHref="#mask" fill="white" transform="translate(-42, -33)" /&gt; &lt;/mask&gt; &lt;g mask="url(#mask-2)"&gt; &lt;TweenOne component="g" animation={animate.track} style={{ transformOrigin: '122.7px 58px' }}&gt; &lt;g transform="translate(-16, -52)"&gt; &lt;g transform="translate(16, 52)"&gt; &lt;path d="M83.1700911,35.9320015 C63.5256194,37.9279025 44.419492,43.1766434 25.8517088,51.6782243 C14.3939956,57.7126276 7.77167019,64.8449292 7.77167019,72.4866248 C7.77167019,94.1920145 61.1993389,111.787709 127.105708,111.787709 C193.012078,111.787709 246.439746,94.1920145 246.439746,72.4866248 C246.439746,55.2822262 212.872939,40.6598106 166.13127,35.3351955" id="line-s" stroke="#0D1A26" strokeWidth="1.35" strokeLinecap="round" transform="translate(127.105708, 73.561453) rotate(-16.000000) translate(-127.105708, -73.561453) " /&gt; &lt;/g&gt; &lt;TweenOne component="g" animation={animate.greenBall}&gt; &lt;image alt="globe" id="id2" xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/IauKICnGjGnotJBEyCRK.png" x="16" y="62" width="26px" height="26px" /&gt; &lt;/TweenOne&gt; &lt;/g&gt; &lt;/TweenOne&gt; &lt;/g&gt; &lt;/g&gt; &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt; ); }<p>Выглядит пугающе? Просто обратите внимание на следующие строки:</p>
9 import React from 'react'; import TweenOne from 'rc-tween-one'; export default function BannerImage() { return ( &lt;div className="wrapper-ant-design"&gt; &lt;svg width="482px" height="500px" viewBox="0 0 482 500"&gt; &lt;defs&gt; &lt;path d="M151,55 C129.666667,62.6666667 116,74.3333333 110,90 C104,105.666667 103,118.5 107,128.5 L225.5,96 C219.833333,79 209.666667,67 195,60 C180.333333,53 165.666667,51.3333333 151,55 L137,0 L306.5,6.5 L306.5,156 L227,187.5 L61.5,191 C4.5,175 -12.6666667,147.833333 10,109.5 C32.6666667,71.1666667 75,34.6666667 137,0 L151,55 Z" id="mask" /&gt; &lt;/defs&gt; &lt;g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd" transform="translate(0, 30)"&gt; &lt;g id="Group-13" transform="translate(0.000000, 41.000000)"&gt; &lt;TweenOne component="g" animation={animate.redSquare}&gt; &lt;rect stroke="#F5222D" strokeWidth="1.6" transform="translate(184.000000, 18.000000) rotate(8.000000) translate(-184.000000, -18.000000) " x="176.8" y="150.8" width="14.4" height="14.4" rx="3.6" /&gt; &lt;/TweenOne&gt; &lt;/g&gt; &lt;g id="Group-14" transform="translate(150.000000, 230.000000)"&gt; &lt;g id="Group-22" transform="translate(62.000000, 7.000000)"&gt; &lt;image id="cc4" alt="globe" xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/FpKOqFadwoFFIZFExjaf.png" width="151px" height="234px" /&gt; &lt;/g&gt; &lt;mask id="mask-2"&gt; &lt;use xlinkHref="#mask" fill="white" transform="translate(-42, -33)" /&gt; &lt;/mask&gt; &lt;g mask="url(#mask-2)"&gt; &lt;TweenOne component="g" animation={animate.track} style={{ transformOrigin: '122.7px 58px' }}&gt; &lt;g transform="translate(-16, -52)"&gt; &lt;g transform="translate(16, 52)"&gt; &lt;path d="M83.1700911,35.9320015 C63.5256194,37.9279025 44.419492,43.1766434 25.8517088,51.6782243 C14.3939956,57.7126276 7.77167019,64.8449292 7.77167019,72.4866248 C7.77167019,94.1920145 61.1993389,111.787709 127.105708,111.787709 C193.012078,111.787709 246.439746,94.1920145 246.439746,72.4866248 C246.439746,55.2822262 212.872939,40.6598106 166.13127,35.3351955" id="line-s" stroke="#0D1A26" strokeWidth="1.35" strokeLinecap="round" transform="translate(127.105708, 73.561453) rotate(-16.000000) translate(-127.105708, -73.561453) " /&gt; &lt;/g&gt; &lt;TweenOne component="g" animation={animate.greenBall}&gt; &lt;image alt="globe" id="id2" xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/IauKICnGjGnotJBEyCRK.png" x="16" y="62" width="26px" height="26px" /&gt; &lt;/TweenOne&gt; &lt;/g&gt; &lt;/TweenOne&gt; &lt;/g&gt; &lt;/g&gt; &lt;/g&gt; &lt;/svg&gt; &lt;/div&gt; ); }<p>Выглядит пугающе? Просто обратите внимание на следующие строки:</p>
10 &lt;TweenOne component="g" animation={animate.redSquare} /&gt; &lt;TweenOne component="g" animation={animate.track} /&gt; &lt;TweenOne component="g" animation={animate.greenBall} /&gt;<p>Итак, анимировать с помощью Ant Design достаточно легко. Вам потребуется всего лишь описать правила анимации, а потом перенести их в компонент<strong>TweenOne</strong>.</p>
10 &lt;TweenOne component="g" animation={animate.redSquare} /&gt; &lt;TweenOne component="g" animation={animate.track} /&gt; &lt;TweenOne component="g" animation={animate.greenBall} /&gt;<p>Итак, анимировать с помощью Ant Design достаточно легко. Вам потребуется всего лишь описать правила анимации, а потом перенести их в компонент<strong>TweenOne</strong>.</p>
11 <p><em>Источник -<a>"5 Ways to animate a React app"</a>.</em></p>
11 <p><em>Источник -<a>"5 Ways to animate a React app"</a>.</em></p>
12  
12