Параллакс — это визуальный приём, при котором элементы интерфейса движутся с разной скоростью относительно прокрутки или взаимодействия пользователя. В веб-разработке этот эффект используется для создания глубины, акцентов и ощущения «живого» интерфейса.
Основной принцип:
В библиотеке Motion One параллакс реализуется через анимации, синхронизированные со скроллом или пользовательскими событиями.
Motion One предоставляет API для отслеживания прогресса прокрутки. В
основе — использование scroll() и трансформаций.
Простейший пример:
import { scroll, animate } from "motion"
const element = document.querySelector(".parallax")
scroll(
animate(element, {
transform: ["translateY(0px)", "translateY(-200px)"]
})
)
Что происходит:
translateY
изменяетсяПараллакс редко должен работать на всей длине страницы. Motion One позволяет задавать диапазон:
scroll(
animate(".parallax", {
transform: ["translateY(0px)", "translateY(-150px)"]
}),
{
target: document.querySelector(".section"),
offset: ["start end", "end start"]
}
)
Параметры:
target — элемент, относительно которого считается
скроллoffset — точки начала и окончания анимацииЭто позволяет:
Классический параллакс строится из нескольких слоёв:
scroll(
animate(".layer-back", {
transform: ["translateY(0px)", "translateY(-50px)"]
})
)
scroll(
animate(".layer-middle", {
transform: ["translateY(0px)", "translateY(-100px)"]
})
)
scroll(
animate(".layer-front", {
transform: ["translateY(0px)", "translateY(-200px)"]
})
)
Результат:
Так формируется иллюзия трёхмерного пространства.
Эффект не ограничен вертикальным движением:
scroll(
animate(".horizontal", {
transform: ["translateX(0px)", "translateX(300px)"]
})
)
Применяется для:
Параллакс может включать не только смещение, но и другие свойства:
scroll(
animate(".fade-layer", {
opacity: [1, 0],
transform: ["scale(1)", "scale(1.2)"]
})
)
Комбинации:
Для сложных сцен удобно использовать CSS-переменные:
scroll(({ y }) => {
document.documentElement.style.setProperty(
"--scroll-progress",
y.progress
)
})
CSS:
.parallax {
transform: translateY(calc(var(--scroll-progress) * -200px));
}
Преимущества:
Motion One позволяет создавать интерактивный параллакс:
document.addEventListener("mousemove", (event) => {
const x = event.clientX / window.innerWidth
const y = event.clientY / window.innerHeight
animate(".interactive", {
transform: `translate(${x * 50}px, ${y * 50}px)`
}, { duration: 0.3 })
})
Эффект:
Более сложный вариант — совмещение эффектов:
scroll(
animate(".layer", {
transform: ["translateY(0px)", "translateY(-150px)"]
})
)
document.addEventListener("mousemove", (e) => {
const x = e.clientX / window.innerWidth
animate(".layer", {
transform: `translateX(${x * 30}px)`
}, { duration: 0.2 })
})
Особенность: необходимо аккуратно комбинировать transform, иначе эффекты будут конфликтовать.
Решение — использовать отдельные обёртки:
<div class="wrapper">
<div class="parallax-layer"></div>
</div>
wrapper — реагирует на скроллparallax-layer — на курсорПараллакс может быть ресурсоёмким. Основные рекомендации:
transform, а не
top/left.parallax {
will-change: transform;
}
Параллакс на мобильных требует осторожности:
prefers-reduced-motionconst prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)")
if (!prefersReduced.matches) {
// запуск параллакса
}
Пример структуры:
<section class="scene">
<div class="layer sky"></div>
<div class="layer mountains"></div>
<div class="layer trees"></div>
<div class="layer foreground"></div>
</section>
Анимация:
const layers = [
{ selector: ".sky", speed: 20 },
{ selector: ".mountains", speed: 50 },
{ selector: ".trees", speed: 100 },
{ selector: ".foreground", speed: 150 }
]
layers.forEach(({ selector, speed }) => {
scroll(
animate(selector, {
transform: [`translateY(0px)`, `translateY(-${speed}px)`]
})
)
})
Такой подход:
Для синхронизации нескольких эффектов:
import { timeline, scroll } from "motion"
const tl = timeline([
[".layer1", { transform: ["translateY(0)", "translateY(-100px)"] }],
[".layer2", { transform: ["translateY(0)", "translateY(-200px)"] }]
])
scroll(tl)
Преимущество:
1. Слишком сильный сдвиг Вызывает дискомфорт и ломает UX
2. Несогласованные скорости Слои начинают «разваливаться»
3. Перегрузка эффектами Параллакс должен дополнять интерфейс, а не отвлекать
4. Игнорирование производительности Особенно критично на мобильных устройствах
Параллакс в Motion One остаётся гибким инструментом, который при грамотной настройке позволяет создавать сложные, плавные и производительные визуальные сцены без перегрузки кода и интерфейса.