Easing-функции определяют характер изменения анимации во времени при
переходах камеры, изменении свойств слоёв и любых интерполяциях,
выполняемых библиотекой. В контексте Mapbox GL JS easing — это
математическая функция, принимающая нормализованное время t
в диапазоне от 0 до 1 и возвращающая модифицированное значение прогресса
анимации.
Фактически easing управляет тем, как именно происходит движение между начальным и конечным состоянием: равномерно, ускоряясь, замедляясь или комбинируя несколько фаз.
Любая анимация в Mapbox GL JS сводится к интерполяции параметров:
Общий принцип:
result = start + (end - start) * f(t)
где:
t — линейный прогресс от 0 до 1f(t) — easing-функцияresult — текущее значение параметраПри отсутствии easing используется линейная функция:
f(t) = t
В Mapbox GL JS easing задаётся как функция:
easing: function (t) {
return t;
}
или в виде стрелочной функции:
easing: t => t
Функция должна:
t в диапазоне [0, 1]Метод easeTo использует easing для плавного изменения
параметров камеры:
map.easeTo({
center: [30.5, 50.5],
zoom: 10,
duration: 2000,
easing: t => t
});
Особенности:
Метод flyTo использует easing для имитации «полёта»
камеры:
map.flyTo({
center: [30.5, 50.5],
zoom: 12,
speed: 1.2,
curve: 1.5
});
Хотя flyTo не всегда принимает пользовательский easing
напрямую, его поведение основано на встроенной кривой, близкой к
экспоненциальному замедлению.
Типичная характеристика:
t => t
Характеристики:
t => t * t
Поведение:
Применяется для акцентирования начала движения.
t => 1 - Math.pow(1 - t, 2)
Поведение:
Часто используется в навигации карты.
t => t < 0.5
? 2 * t * t
: 1 - Math.pow(-2 * t + 2, 2) / 2
Характеристики:
Одна из наиболее универсальных кривых для интерфейсов.
Mapbox GL JS позволяет задавать переходы свойств слоёв через
transition, где easing влияет на изменение визуальных
параметров.
Пример:
map.setPaintProperty('water-layer', 'fill-opacity', 0.8);
map.setPaintProperty('water-layer', 'fill-opacity-transition', {
duration: 1500,
delay: 0
});
Хотя easing здесь не всегда задаётся напрямую, переход интерполируется линейно, но может быть модифицирован через выражения или обновление стилей.
Mapbox GL JS позволяет задавать произвольные кривые, что даёт полный контроль над анимацией.
easing: t => Math.sin((t * Math.PI) / 2)
Поведение:
easing: t => {
return Math.pow(2, -10 * t) * Math.sin((t - 0.3) * 5 * Math.PI) + 1;
}
Особенности:
Easing напрямую влияет на восприятие пространственных переходов:
В картографических интерфейсах это особенно важно, так как камера заменяет физическое перемещение пользователя по пространству.
Easing-функция всегда работает совместно с длительностью анимации:
duration определяет общий временной интервалeasing распределяет прогресс внутри этого
интервалаПример:
map.easeTo({
center: [10, 40],
zoom: 5,
duration: 3000,
easing: t => 1 - Math.pow(1 - t, 3)
});
При одинаковом duration разные easing-функции создают
полностью различное ощущение скорости.
При цепочках переходов важно учитывать накопление визуального эффекта:
map.easeTo({
center: [0, 0],
zoom: 3,
duration: 1000,
easing: t => t
});
setTimeout(() => {
map.easeTo({
center: [30, 50],
zoom: 8,
duration: 1500,
easing: t => 1 - Math.pow(1 - t, 2)
});
}, 1100);
Каждый переход имеет собственную кривую, но восприятие формируется их последовательностью.
Оптимальная реализация — простые математические выражения без побочных эффектов.
Easing является частью более широкой системы интерполяции, включающей:
Он выступает как слой управления временной функцией, не затрагивая геометрическую или графическую логику напрямую, но изменяя восприятие всех визуальных изменений.