Control.Zoom представляет собой встроенный элемент
интерфейса библиотеки Leaflet, отвечающий за управление масштабом карты.
Он реализует стандартный UI-компонент с кнопками увеличения и уменьшения
масштаба, а также обеспечивает доступ к базовым операциям навигации без
обращения к программному API карты напрямую.
Контрол масштабирования является частью системы Control
и по умолчанию добавляется ко всем экземплярам карты, если явно не
отключён. Он взаимодействует с методами Map, такими как
zoomIn, zoomOut и setZoom, но
инкапсулирует эти действия в визуальный интерфейс.
Control.Zoom наследуется от базового класса
Control. Его поведение определяется следующими ключевыми
элементами:
Фактически контроль представляет собой DOM-виджет, синхронизированный с состоянием карты.
По умолчанию масштабирование уже присутствует, но его можно явно управлять через опции карты.
const map = L.map('map').setView([51.505, -0.09], 13);
В этом случае Control.Zoom добавляется
автоматически.
const map = L.map('map', {
zoomControl: true
}).setView([51.505, -0.09], 13);
const map = L.map('map', {
zoomControl: false
}).setView([51.505, -0.09], 13);
L.control.zoom({
position: 'topright'
}).addTo(map);
Контрол поддерживает набор параметров, влияющих на внешний вид и поведение.
Определяет расположение элемента на карте.
Допустимые значения:
toplefttoprightbottomleftbottomrightL.control.zoom({
position: 'bottomright'
}).addTo(map);
Позволяют заменить текст внутри кнопок.
L.control.zoom({
zoomInText: '+',
zoomOutText: '-'
}).addTo(map);
Используются для атрибутов title, влияющих на подсказки
и доступность.
L.control.zoom({
zoomInTitle: 'Увеличить масштаб',
zoomOutTitle: 'Уменьшить масштаб'
}).addTo(map);
Control.Zoom напрямую вызывает методы объекта карты:
map.zoomIn(step)map.zoomOut(step)map.setZoom(level)map.zoomIn();
map.zoomOut();
Идентично нажатию кнопок контроллера.
Хотя Control.Zoom предоставляет UI, логика масштабирования остаётся в API карты.
map.zoomIn(1);
map.zoomOut(1);
map.setZoom(10);
Контрол можно удалить после инициализации карты.
const zoomControl = L.control.zoom().addTo(map);
map.removeControl(zoomControl);
Либо через отключение при создании карты:
const map = L.map('map', {
zoomControl: false
});
Control.Zoom использует стандартные CSS-классы:
.leaflet-control-zoom.leaflet-control-zoom-in.leaflet-control-zoom-out.leaflet-control-zoom a {
background-color: #222;
color: #fff;
border-radius: 4px;
}
.leaflet-control-zoom a:hover {
background-color: #444;
}
Возможна замена стандартного контрола на кастомный, сохраняющий логику масштабирования.
const CustomZoom = L.Control.Zoom.extend({
options: {
position: 'topright'
}
});
new CustomZoom().addTo(map);
Control.Zoom работает в рамках ограничений карты:
const map = L.map('map', {
minZoom: 5,
maxZoom: 18
});
При достижении границ кнопки перестают изменять уровень масштаба.
При использовании Control.Zoom инициируются стандартные события:
zoomstartzoomendzoomlevelschangemap.on('zoomend', () => {
console.log(map.getZoom());
});
Control.Zoom использует HTML-кнопки с атрибутами title,
что обеспечивает базовую поддержку accessibility.
Рекомендуется задавать локализованные значения:
L.control.zoom({
zoomInTitle: 'Увеличить',
zoomOutTitle: 'Уменьшить'
}).addTo(map);
При совместном использовании нескольких контролов порядок слоёв интерфейса влияет на визуальную композицию.
Пример расположения:
L.control.zoom({ position: 'topright' }).addTo(map);
L.control.layers(baseLayers, overlays, { position: 'topright' }).addTo(map);
Контролы автоматически группируются внутри одного контейнера позиции.
На сенсорных устройствах Control.Zoom часто дополняет жесты pinch-to-zoom. При этом:
Совместное использование не конфликтует.
Control.Zoom не хранит состояние самостоятельно. Все изменения уровня масштаба происходят через объект карты:
const currentZoom = map.getZoom();
Синхронизация UI и состояния карты происходит автоматически через события Leaflet.
const map = L.map('map', {
zoomControl: false,
minZoom: 3,
maxZoom: 16
}).setView([40.7128, -74.0060], 10);
L.control.zoom({
position: 'bottomright',
zoomInText: '+',
zoomOutText: '-',
zoomInTitle: 'Zoom in',
zoomOutTitle: 'Zoom out'
}).addTo(map);