Параметр padding в Mapbox GL JS управляет тем, как
камера карты учитывает внутренние отступы при расчёте центра, масштаба и
области видимости. Он напрямую влияет на логическое «рабочее окно»
карты, сдвигая геометрический центр и изменяя поведение таких методов,
как fitBounds, flyTo и обновление
camera.
Визуальная область карты в Mapbox GL JS не всегда совпадает с фактическими границами canvas. При использовании padding формируется внутренний прямоугольник, в пределах которого Mapbox старается разместить географический контент.
Фактически камера оперирует двумя системами координат:
Именно вторая область считается «основной» для расчётов центра и зума.
Padding может задаваться как единое число или как объект с отдельными сторонами:
map.fitBounds(bounds, {
padding: 40
});
или
map.fitBounds(bounds, {
padding: {
top: 80,
bottom: 40,
left: 60,
right: 60
}
});
Каждая сторона уменьшает рабочую область карты:
top сдвигает верхнюю границу внизbottom сдвигает нижнюю границу вверхleft сдвигает левую границу вправоright сдвигает правую границу влевоВ результате центр камеры перестаёт совпадать с геометрическим центром bounding box.
Метод fitBounds стремится уместить указанный
географический прямоугольник в доступную область. При наличии padding
алгоритм работает в два шага:
Это приводит к изменению zoom уровня по сравнению с вариантом без padding.
Ключевая особенность: padding не влияет на географические координаты, но полностью меняет визуальную интерпретацию центра и масштаба.
В современном API Mapbox GL JS padding является частью состояния камеры:
map.setPadding({
top: 100,
bottom: 0,
left: 0,
right: 0
});
или через setCenter, setZoom с сохранением
текущего padding.
При изменении padding камера пересчитывает projection без изменения координат центра в географическом смысле, но визуально центр смещается.
Padding применяется не только для геометрии, но и для UI-композиции.
Типичный случай — боковая панель:
map.fitBounds(bounds, {
padding: {
left: 300,
top: 50,
right: 50,
bottom: 50
}
});
Здесь левая часть карты «зарезервирована» под интерфейс, и география смещается вправо.
При наличии bottom sheet:
map.setPadding({
bottom: 250
});
Карта автоматически поднимает центр визуально вверх, чтобы важные объекты не перекрывались UI-элементами.
В отладочных сценариях часто используется визуализация внутренней области камеры. Она представляет собой прямоугольник, который показывает активную зону без учёта padding.
Логически это выглядит так:
Внутренняя область становится ключевой для:
fitBoundsЕсли включена визуализация, можно наблюдать, как объекты «стремятся» попасть именно внутрь этой зоны.
При использовании flyTo или easeTo padding
изменяет траекторию движения камеры.
map.flyTo({
center: [longitude, latitude],
zoom: 12,
padding: {
left: 200
}
});
Особенность поведения:
Маркер, добавленный в карту, всегда позиционируется по географическим координатам, но его визуальное восприятие зависит от padding:
При последовательных вызовах:
map.setPadding({left: 200});
map.setPadding({top: 100});
второй вызов перезаписывает первый, если не объединять значения вручную.
При изменении размера карты padding не пересчитывается автоматически в пользовательских сценариях интерфейса. Это приводит к визуальному сдвигу центра.
Абсолютно позиционированные элементы поверх карты часто дублируют эффект padding, создавая двойное смещение.
При наличии padding Mapbox GL JS модифицирует матрицу проекции:
Это означает, что изменение padding эквивалентно изменению системы координат отображения без изменения географии.
Padding становится инструментом управления вниманием пользователя:
При проектировании интерфейса карты padding фактически заменяет ручное управление координатами камеры, позволяя работать на уровне компоновки, а не геометрии.