В Mapbox GL JS анимация изменений визуальных свойств карты основана на системе transition, которая управляет плавностью изменения значений paint-параметров слоёв. Вместо мгновенной смены цвета, толщины линий или прозрачности используется интерполяция во времени, задаваемая двумя ключевыми параметрами: transition duration и transition delay.
Каждое визуальное изменение в стиле может быть обработано как анимируемое состояние, если для него определены правила перехода. Это позволяет создавать динамичные карты с плавной реакцией на изменение данных, масштаба или пользовательского взаимодействия.
Transition duration определяет время, за которое значение свойства слоя полностью переходит от старого состояния к новому. Значение задаётся в миллисекундах.
t_{transition} =
Пример: изменение цвета заливки полигона
map.setPaintProperty('cities-layer', 'fill-color', '#ff0000');
Если задан transition duration 1000 ms, цвет будет плавно изменяться в течение одной секунды.
Transition delay задаёт время ожидания перед началом интерполяции. Это позволяет синхронизировать изменения нескольких слоёв или создавать последовательные эффекты.
t_{start} =
Пример:
map.setPaintProperty('roads-layer', 'line-color', '#00ff00');
Если delay = 500 ms и duration = 1000 ms:
Mapbox GL JS позволяет задать общий объект transition на уровне всего стиля.
map.setStyle({
version: 8,
sources: { ... },
layers: [ ... ],
transition: {
duration: 800,
delay: 0
}
});
Глобальный transition особенно важен при динамической перезагрузке
стиля через setStyle, так как предотвращает резкие скачки
визуального состояния.
Mapbox GL JS поддерживает более точечную настройку через специальные transition-поля для каждого paint-свойства.
map.setPaintProperty('parks', 'fill-color-transition', {
duration: 1200,
delay: 200
});
map.setPaintProperty('roads', 'line-width-transition', {
duration: 600,
delay: 0
});
При конфликте уровней применяется следующая иерархия:
*-transition свойства слояstyle.transitionПереходы работают только для свойств, поддерживающих интерполяцию:
fill-color, line-color)line-width,
opacity)Не все свойства анимируются одинаково: геометрические изменения источников данных не интерполируются автоматически, если не используется expression-based styling.
При использовании методов API изменения могут триггерить transition автоматически:
map.setPaintProperty('water', 'fill-opacity', 0.3);
Если ранее было значение 0.8, произойдёт плавный переход.
map.setPaintProperty('state-fill', 'fill-opacity', 0.6);
map.setPaintProperty('heatmap', 'heatmap-intensity', 1.0);
Сочетание двух параметров позволяет строить каскадные анимации.
Пример последовательного включения слоёв:
Каждый слой начинает анимацию позже предыдущего, создавая эффект волны.
Transition в Mapbox GL JS реализованы на уровне GPU-рендеринга через WebGL, поэтому:
Рекомендации по оптимизации:
Без явного задания Mapbox GL JS использует дефолтные значения, что может приводить к непредсказуемым визуальным эффектам при смене стиля.
Попытка анимировать неинтерполируемые свойства приводит к мгновенному изменению без перехода.
При одновременном использовании style.transition и
*-transition слоя может возникать несогласованность
временных параметров, особенно при частом вызове
setPaintProperty.
Слишком частые вызовы изменения свойств могут “перезапускать” transition, из-за чего анимация никогда не завершается.
Transition используется не только для эстетики, но и для координации состояний карты:
Плавность достигается не самим фактом интерполяции, а точной настройкой временных параметров, распределённых между слоями и свойствами.