anime.js — это мощная библиотека для создания анимаций в
JavaScript, которая поддерживает работу с CSS-свойствами, SVG,
DOM-элементами и объектами JavaScript. Основной принцип работы
библиотеки заключается в управлении свойствами объектов во
времени с помощью анимационных кривых (easing) и
последовательностей (timelines).
Простейший пример использования выглядит так:
anime({
targets: '.box',
translateX: 250,
rotate: '1turn',
duration: 2000,
easing: 'easeInOutQuad'
});
Здесь targets — цель анимации, translateX и
rotate — свойства, которые будут изменяться,
duration — время выполнения в миллисекундах, а
easing задаёт кривую изменения свойства.
В современных браузерах для ускорения рендеринга сложных анимаций
используется композитный рендеринг. Композитные слои —
это отдельные слои, которые GPU обрабатывает независимо от остальной
страницы. При анимации свойства, поддерживающие аппаратное ускорение
(например, transform и opacity), браузер
создаёт отдельный слой для элемента, что уменьшает количество
перерисовок и повышает плавность.
Ключевые свойства для создания композитного слоя:
transform (translate, rotate, scale)opacitywill-change (позволяет заранее указать, какие свойства
будут изменяться)Пример использования will-change:
.box {
will-change: transform, opacity;
}
anime.js автоматически применяет анимации к этим
свойствам, что делает GPU-ускорение доступным “из коробки”.
Использование translateX, translateY,
scale, rotate и opacity позволяет
создавать плавные анимации без участия CPU на этапе перерисовки.
Рассмотрим пример комплексной анимации с последовательным изменением
этих свойств:
anime.timeline({ loop: true })
.add({
targets: '.circle',
translateX: 200,
scale: 1.5,
duration: 1000,
easing: 'easeInOutSine'
})
.add({
targets: '.circle',
translateY: 100,
rotate: '180deg',
opacity: 0.5,
duration: 800,
easing: 'easeInOutQuad'
});
Пояснения:
timeline позволяет объединять несколько анимаций в
последовательность.transform и opacity —
стандартный способ оптимизации сложных анимаций.Создание отдельных композитных слоев помогает в случаях, когда на странице присутствуют множество одновременно анимируемых объектов. Однако злоупотребление слоями может привести к повышенной нагрузке на GPU. Рекомендуется:
will-change только к тем элементам, которые
будут активно анимироваться.width, height, margin), если
важна производительность.Пример комбинированного подхода:
anime({
targets: '.card',
translateZ: 0, // создаёт отдельный GPU слой
translateX: 300,
rotateY: '45deg',
duration: 1500,
easing: 'easeOutExpo'
});
Здесь translateZ: 0 — трюк для явного включения
аппаратного ускорения через создание композитного слоя.
anime.js поддерживает анимацию SVG-элементов, что
особенно важно для сложной графики. Для оптимизации анимации SVG
используется те же принципы: transform и
opacity. Пример анимации контура SVG:
anime({
targets: 'path',
strokeDashoffset: [anime.setDashoffset, 0],
easing: 'easeInOutSine',
duration: 2000,
loop: true
});
strokeDashoffset изменяет видимость контура без создания
лишних перерисовок всего SVG, что также эффективно с точки зрения
GPU.
anime.timeline() позволяет управлять анимациями на
разных слоях независимо, что полезно для сложных интерфейсов:
let tl = anime.timeline({
easing: 'easeOutExpo',
duration: 750
});
tl.add({
targets: '.square1',
translateX: 250
})
.add({
targets: '.square2',
translateY: 150
}, '-=500'); // начинается за 500мс до конца предыдущей анимации
Использование overlap позволяет создавать параллельные эффекты без блокировки рендеринга, сохраняя плавность на GPU-уровне.
width, height, top,
left).requestAnimationFrame (по умолчанию в
anime.js) для синхронизации с рендерингом браузера.transform и
opacity для каждого слоя, чтобы GPU занимался отрисовкой, а
не CPU.timeline для объединения анимаций и
уменьшения количества отдельных запусков anime().