Полноэкранный режим в OpenLayers реализуется через контрол
FullScreen, который предоставляет удобный интерфейс для
разворачивания карты на весь экран с использованием Fullscreen API
браузера. Контрол интегрируется в стандартную панель управления картой и
управляет состоянием контейнера карты без необходимости ручного
взаимодействия с DOM API.
FullScreen относится к стандартным контролам библиотеки
и находится в модуле ol/control/FullScreen. Его задача —
переключать отображение контейнера карты между обычным и полноэкранным
режимом.
Ключевая особенность реализации заключается в том, что контрол не управляет самой картой напрямую, а работает с DOM-элементом, который передаётся или определяется автоматически как контейнер карты.
Основные функции:
Контрол добавляется в карту через массив controls при
создании экземпляра ol/Map.
import Map from 'ol/Map';
import View from 'ol/View';
import FullScreen from 'ol/control/FullScreen';
import TileLayer from 'ol/layer/Tile';
import OSM from 'ol/source/OSM';
const map = new Map({
target: 'map',
layers: [
new TileLayer({
source: new OSM()
})
],
view: new View({
center: [0, 0],
zoom: 2
}),
controls: [
new FullScreen()
]
});
В этом случае OpenLayers автоматически применяет полноэкранный режим
к контейнеру карты, указанному в target.
Контрол опирается на стандартный Fullscreen API:
Element.requestFullscreen()document.exitFullscreen()document.fullscreenElementOpenLayers абстрагирует различия между браузерами и использует совместимые префиксы там, где это необходимо (в старых окружениях).
При активации режима происходит:
При выходе:
exitFullscreenКонтрол поддерживает набор опций, позволяющих адаптировать поведение и внешний вид.
Определяет CSS-класс для кнопки.
new FullScreen({
className: 'ol-full-screen-custom'
})
Позволяет переопределять стили кнопки через CSS.
Используются для отображения символов на кнопке.
label — иконка или текст в обычном состоянииlabelActive — отображение в активном полноэкранном
режимеПример:
new FullScreen({
label: '⛶',
labelActive: '⛶'
})
В реальных проектах чаще заменяются на иконки через CSS.
Подсказка при наведении:
new FullScreen({
tipLabel: 'Полноэкранный режим'
})
Используется для доступности и улучшения UX.
Позволяет явно указать DOM-элемент, который будет разворачиваться.
new FullScreen({
source: document.getElementById('map-container')
})
Это важно, когда карта находится внутри сложной верстки и требуется разворачивать не сам target, а внешний контейнер.
В реальных интерфейсах карта часто находится внутри вложенных контейнеров:
<div class="layout">
<header></header>
<div class="content">
<div id="map-wrapper">
<div id="map"></div>
</div>
</div>
</div>
В таких случаях fullscreen-контейнером должен выступать
map-wrapper, иначе при переходе в полноэкранный режим могут
обрезаться элементы интерфейса или ломаться стили.
new FullScreen({
source: document.getElementById('map-wrapper')
})
Контрол является наследником базового Control и
поддерживает стандартные события OpenLayers.
Основное событие, отражающее изменение состояния:
const fullScreen = new FullScreen();
fullScreen.on('change:active', function (event) {
console.log(event.target.getActive());
});
Событие срабатывает при переключении режима.
Браузер также генерирует событие:
fullscreenchangeOpenLayers использует его для синхронизации состояния контрола с фактическим состоянием DOM.
document.addEventListener('fullscreenchange', () => {
console.log(document.fullscreenElement);
});
Это важно в ситуациях, когда fullscreen был изменён не через контрол, а программно или через системные действия.
Хотя контрол предназначен для пользовательского взаимодействия, состояние можно изменять программно через DOM API.
const element = document.getElementById('map');
if (!document.fullscreenElement) {
element.requestFullscreen();
} else {
document.exitFullscreen();
}
OpenLayers автоматически синхронизирует свой контрол при изменении состояния.
Контрол FullScreen использует стандартные CSS-классы OpenLayers:
.ol-full-screen.ol-control.ol-control buttonПример переопределения внешнего вида:
.ol-full-screen {
top: 4em;
left: .5em;
}
.ol-full-screen button {
background-color: #1f1f1f;
color: #ffffff;
border-radius: 4px;
}
При активном состоянии браузеры часто добавляют псевдоклассы и системные стили, поэтому важно учитывать:
position: fixed может вести себя иначе в разных
браузерахПолноэкранный режим имеет ряд ограничений, накладываемых браузерами:
Также важно учитывать, что:
OpenLayers обычно вызывает перерасчёт размера карты при входе/выходе из fullscreen, но в сложных интерфейсах может потребоваться ручной вызов:
map.updateSize();
FullScreen часто используется вместе с:
ZoomRotateScaleLineOverviewMapПроблема заключается в перекрытии элементов интерфейса при переходе в fullscreen.
Рекомендуется группировать контролы в единый контейнер:
import {defaults as defaultControls} from 'ol/control';
const map = new Map({
controls: defaultControls().extend([
new FullScreen()
])
});
И управлять их позиционированием через CSS.
В приложениях на React, Vue или Angular fullscreen-контрол требует аккуратного обращения с жизненным циклом DOM.
Ключевые моменты:
source должен существовать в DOM к моменту
инициализацииПример принудительного выхода:
if (document.fullscreenElement) {
document.exitFullscreen();
}
При переходе в полноэкранный режим происходит изменение размеров контейнера, что влияет на:
OpenLayers автоматически реагирует на изменение размера, но в нестандартных сценариях (анимированные контейнеры, CSS transitions) может возникнуть рассинхронизация, требующая ручного обновления состояния карты.
setTimeout(() => {
map.updateSize();
}, 300);
Одной из распространённых проблем является использование fullscreen
на неправильном DOM-уровне. Например, если fullscreen применяется к
внутреннему div, а не к контейнеру карты, интерфейс может
обрезаться.
Другие ошибки:
Правильная архитектура DOM для карты с fullscreen обычно предполагает
выделенный контейнер верхнего уровня, управляемый через
source.