В Motion One триггеры анимаций почти всегда завязаны на момент пересечения элемента с заданной точкой наблюдения. Этот момент определяется не событием клика или таймером, а величиной видимости и положением элемента в области просмотра. Внутри библиотеки это реализуется через концепцию порогов, основанную на механизмах, схожих с Intersection Observer.
Порог срабатывания — это числовое или диапазонное значение, описывающее долю пересечения элемента с областью видимости.
0 — элемент только появился на краю области
наблюдения0.5 — элемент виден наполовину1 — элемент полностью находится в зоне видимостиЭта логика позволяет привязать анимацию не ко времени, а к пространственному состоянию интерфейса.
amount в
inViewВ Motion One контроль порога чаще всего реализуется через параметр
amount в функции inView.
import { inView, animate } from "motion";
inView(".card", (info) => {
animate(info.target, { opacity: 1, y: 0 }, { duration: 0.6 });
}, {
amount: 0.3
});
Значение amount определяет минимальную долю видимости
элемента, при которой происходит запуск анимации.
amountamount: 0 — срабатывание при появлении хотя бы одного
пикселя элементаamount: 0.25 — четверть элемента должна быть
видимаamount: 0.5 — половина элемента в области
просмотраamount: 1 — полное отображение элементаВыбор значения напрямую влияет на ощущение «плавности» интерфейса. Малые значения создают ранний запуск анимаций, большие — задерживают их до полного раскрытия блока.
В современных сценариях одного значения часто недостаточно. Motion One поддерживает поведение, при котором анимация может зависеть от диапазона видимости.
inView(".item", (info) => {
animate(info.target, { scale: 1 });
}, {
amount: [0.2, 0.8]
});
Такой подход задаёт два состояния:
Между этими точками может происходить прогрессивное изменение свойств, если логика анимации построена на интерполяции.
Одним из ключевых аспектов является поведение при выходе и повторном входе элемента в область видимости.
По умолчанию:
inView(".box", (info) => {
animate(info.target, { opacity: 1 });
}, {
amount: 0.4,
once: false
});
Параметр once определяет, будет ли порог срабатывать
повторно:
once: true — только первое пересечениеonce: false — каждый повторный вход снова активирует
триггерЭто важно для интерфейсов с прокруткой назад, где элементы могут многократно входить в область наблюдения.
Порог срабатывания всегда вычисляется относительно контейнера наблюдения. В типичном случае это viewport браузера, но Motion One позволяет задавать кастомные контейнеры.
inView(".panel", callback, {
root: document.querySelector(".scroll-container"),
amount: 0.6
});
В этом случае 60% видимости считается относительно области
.scroll-container, а не окна браузера.
Такой подход меняет геометрию триггеров:
В @motionone/scroll порог срабатывания заменяется
непрерывной моделью прогресса.
import { scroll, animate } from "motion";
scroll(
animate(".progress-bar", { scaleX: [0, 1] })
);
Здесь вместо дискретного порога используется непрерывная шкала от 0 до 1, где:
Однако даже в этом случае концепция порога сохраняется как границы интервала:
scroll(
(progress) => console.log(progress),
{
target: document.querySelector(".section"),
offset: ["start end", "end start"]
}
);
offset задаёт зоны, которые фактически заменяют
пороговые точки:
Между ними формируется активная зона прогресса.
Использование порогов позволяет выстраивать каскады анимаций, где элементы активируются не одновременно, а в зависимости от глубины прокрутки.
inView(".title", ({ target }) => {
animate(target, { opacity: 1, y: 0 }, { delay: 0 });
}, { amount: 0.2 });
inView(".text", ({ target }) => {
animate(target, { opacity: 1, y: 0 }, { delay: 0.1 });
}, { amount: 0.4 });
inView(".image", ({ target }) => {
animate(target, { opacity: 1, scale: 1 });
}, { amount: 0.7 });
Разные пороги создают эффект последовательного раскрытия интерфейса при прокрутке.
Порог не является статичной величиной. Он может динамически подстраиваться под:
В сложных интерфейсах пороги часто рассчитываются программно:
const height = window.innerHeight;
const dynamicAmount = height > 800 ? 0.5 : 0.3;
inView(".block", callback, {
amount: dynamicAmount
});
Такой подход выравнивает поведение анимаций на разных устройствах без изменения логики интерфейса.
Изменение порога влияет не только на технический момент запуска, но и на восприятие интерфейса:
В Motion One порог выступает как связующее звено между геометрией страницы и временной моделью анимации, позволяя переводить положение элементов в управляемое поведение анимации без дополнительной логики синхронизации