Плагин fullscreen для Leaflet добавляет возможность разворачивать карту на весь экран браузера с использованием стандартизированного Fullscreen API. Он интегрируется как расширение слоя карты и не требует изменения базовой архитектуры приложения.
Основная задача расширения — управление режимом отображения карты в полноэкранном режиме с сохранением всех интерактивных возможностей: зумирования, панорамирования, работы слоёв и обработчиков событий.
Плагин реализует кнопку переключения режима и предоставляет программный интерфейс для управления состоянием fullscreen.
Плагин подключается после основной библиотеки Leaflet:
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.fullscreen/Control.FullScreen.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet.fullscreen/Control.FullScreen.css" />
npm install leaflet.fullscreen
Подключение в модульной системе:
import L from 'leaflet';
import 'leaflet.fullscreen';
import 'leaflet.fullscreen/Control.FullScreen.css';
После подключения плагина в объект карты добавляется контрол:
const map = L.map('map', {
fullscreenControl: true
}).setView([51.505, -0.09], 13);
Контрол автоматически добавляется в интерфейс карты и использует стандартную иконку переключения состояния.
Плагин поддерживает набор опций, передаваемых в инициализации карты.
const map = L.map('map', {
fullscreenControl: true,
fullscreenControlOptions: {
position: 'topleft',
title: {
'false': 'Открыть полноэкранный режим',
'true': 'Выйти из полноэкранного режима'
}
}
});
topleft, topright, bottomleft,
bottomright)Плагин расширяет объект карты методами управления состоянием fullscreen.
map.toggleFullscreen();
Метод переключает текущее состояние: если карта не в fullscreen, активирует его, иначе выключает.
Некоторые версии плагина предоставляют прямые методы:
map.enterFullscreen();
map.exitFullscreen();
Эти методы позволяют управлять состоянием без переключения.
Карты могут находиться в двух основных состояниях:
Состояние можно проверить:
map.isFullscreen();
Метод возвращает true или false.
Плагин генерирует события, позволяющие отслеживать переходы между режимами.
Основное событие изменения состояния:
map.on('fullscreenchange', function () {
console.log(map.isFullscreen());
});
Срабатывает при невозможности перейти в полноэкранный режим:
map.on('fullscreenerror', function () {
console.log('Ошибка перехода в fullscreen');
});
Плагин опирается на нативный Fullscreen API браузера:
requestFullscreenexitFullscreenfullscreenchange и
fullscreenerrorВ разных браузерах используются префиксы:
webkitRequestFullscreenmozRequestFullScreenmsRequestFullscreenПлагин инкапсулирует эти различия, обеспечивая единый интерфейс.
При активации fullscreen происходит перерасчёт размеров контейнера карты. Leaflet автоматически вызывает обновление внутреннего состояния отображения:
Для ручного обновления используется:
map.invalidateSize();
Этот метод критичен при изменении контейнера вне стандартных событий.
Fullscreen-контрол может конфликтовать с другими UI-элементами, размещёнными в той же позиции. Для предотвращения перекрытия применяется:
fullscreenControlOptions: {
position: 'topright'
}
Также возможно комбинирование с контролами слоёв и масштабирования:
L.control.layers(baseLayers, overlays).addTo(map);
L.control.zoom({ position: 'bottomright' }).addTo(map);
Fullscreen может быть вызван не только через API плагина, но и через DOM-элементы:
document.querySelector('.leaflet-control-fullscreen-button').click();
Такой способ используется для интеграции с внешними интерфейсами, но не рекомендуется как основной из-за отсутствия контроля состояния.
Поведение fullscreen зависит от политики браузера:
На уровне API это приводит к срабатыванию
fullscreenerror.
В одностраничных приложениях fullscreen состояние должно учитываться при:
Пример сброса состояния:
if (map.isFullscreen()) {
map.exitFullscreen();
}
CSS плагина может быть переопределён для адаптации под дизайн интерфейса:
.leaflet-control-fullscreen-button {
background-color: #fff;
border-radius: 4px;
}
Также используются псевдоклассы состояния:
.leaflet-fullscreen-on .leaflet-control-fullscreen-button {
background-color: #f0f0f0;
}
Fullscreen влияет на размеры контейнера карты, поэтому важно учитывать:
height: 100% для родительских блоковКарты на Leaflet в fullscreen режиме требуют стабильной геометрии контейнера для корректного рендеринга тайлов.
При выходе из fullscreen полезно восстанавливать параметры интерфейса:
map.on('fullscreenchange', function () {
if (!map.isFullscreen()) {
map.setZoom(map.getZoom());
}
});
Это позволяет принудительно обновить слои и интерфейс после изменения режима отображения.