VisualViewport
Baseline Широко доступно *
Данная функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с августа 2021 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Интерфейс VisualViewport API визуального области просмотра представляет визуальную область просмотра для данного окна. Для страницы, содержащей фреймы, каждый фрейм, а также содержащая страница, будут иметь уникальный объект окна. Каждое окно на странице будет иметь уникальный VisualViewport, представляющий свойства, связанные с этим окном.
Вы можете получить визуальную область просмотра окна, используя Window.visualViewport.
Примечание: Только верхнее окно имеет визуальную область просмотра, отличную от области просмотра макета. Поэтому, как правило, только VisualViewport объекта верхнего уровня является полезным. Для <iframe>, метрики визуального просмотра, такие как VisualViewport.width, всегда соответствуют метрикам области просмотра макета, таким как document.documentElement.clientWidth.
Свойства экземпляра
Также наследует свойства от своего родительского интерфейса, EventTarget.
-
VisualViewport.offsetLeftТолько для чтения -
Возвращает смещение левого края визуальной области просмотра от левого края области просмотра макета в пикселях CSS.
-
VisualViewport.offsetTopТолько для чтения -
Возвращает смещение верхнего края визуальной области просмотра от верхнего края области просмотра макета в пикселях CSS.
-
VisualViewport.pageLeftТолько для чтения -
Возвращает координату x визуальной области просмотра относительно начала содержащей области вверху в пикселях CSS.
-
VisualViewport.pageTopТолько для чтения -
Возвращает координату y визуальной области просмотра относительно начала содержащей области вверху в пикселях CSS.
-
VisualViewport.widthТолько для чтения -
Возвращает ширину визуальной области просмотра в пикселях CSS.
-
VisualViewport.heightТолько для чтения -
Возвращает высоту визуальной области просмотра в пикселях CSS.
-
VisualViewport.scaleТолько для чтения -
Возвращает коэффициент масштабирования при масштабировании визуальной области просмотра.
Методы экземпляра
Также наследует методы от своего родительского интерфейса, EventTarget.
События
Подпишитесь на эти события, используя addEventListener() или назначив обработчик событий соответствующему oneventname свойству этого интерфейса.
resize-
Срабатывает при изменении размеров визуальной области просмотра. Также доступно через
onresizeсвойство. scroll-
Срабатывает при прокрутке визуальной области просмотра. Также доступно через
onscrollсвойство. scrollend-
Срабатывает при завершении операции прокрутки визуальной области просмотра. Также доступно через
onscrollendсвойство.
Примеры
Скрытие наложенного блока при масштабировании
В этом примере, взятом из README Visual Viewport, показано, как написать код, который будет скрывать наложенный блок (например, рекламный блок) при увеличении пользователем масштаба. Это хороший способ улучшить пользовательский опыт при масштабировании страниц. Также доступен живой пример.
const bottomBar = document.getElementById("bottom-bar");
const viewport = window.visualViewport;
function resizeHandler() {
bottomBar.style.display = viewport.scale > 1.3 ? "none" : "block";
}
window.visualViewport.addEventListener("resize", resizeHandler);
Моделирование позиции: device-fixed
В этом примере, также взятом из README Visual Viewport, показано, как использовать этот API для моделирования position: device-fixed, которое фиксирует элементы к визуальной области просмотра. Также доступен живой пример.
const bottomBar = document.getElementById("bottom-bar");
const viewport = window.visualViewport;
function viewportHandler() {
const layoutViewport = document.getElementById("layoutViewport");
// Since the bar is position: fixed we need to offset it by the visual
// viewport's offset from the layout viewport origin.
const offsetLeft = viewport.offsetLeft;
const offsetTop =
viewport.height -
layoutViewport.getBoundingClientRect().height +
viewport.offsetTop;
// You could also do this by setting style.left and style.top if you
// use width: 100% instead.
bottomBar.style.transform = `translate(${offsetLeft}px, ${offsetTop}px) scale(${
1 / viewport.scale
})`;
}
window.visualViewport.addEventListener("scroll", viewportHandler);
window.visualViewport.addEventListener("resize", viewportHandler);
Примечание: Этот метод следует использовать с осторожностью; эмуляция position: device-fixed таким образом может привести к мерцанию фиксированного элемента во время прокрутки.
Спецификации
| Спецификация |
|---|
| Модуль CSSOM View # the-visualviewport-interface |
Совместимость браузеров
| Рабочий стол | Мобильное устройство | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
VisualViewport |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
height |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
offsetLeft |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
offsetTop |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
pageLeft |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
pageTop |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
resize_event |
6261Обработчик событияonresize не поддерживается. |
79 | 91 | 4948Обработчик событияonresize не поддерживается. |
13 | 6261Обработчик событияonresize не поддерживается. |
68 | 4645Обработчик событияonresize не поддерживается. |
13 | 8.0 | 6261Обработчик событияonresize не поддерживается. |
scale |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
scroll_event |
6261Обработчик событияonscroll не поддерживается. |
79 | 91 | 4948Обработчик событияonscroll не поддерживается. |
13 | 6261Обработчик событияonscroll не поддерживается. |
68 | 4645Обработчик событияonscroll не поддерживается. |
13 | 8.0 | 6261Обработчик событияonscroll не поддерживается. |
scrollend_event |
126 | 126 | Нет | 112 | Нет | 126 | Нет | 83 | Нет | 126 | |
width |
61 | 79 | 91 | 48 | 13 | 61 | 68 | 45 | 13 | 8.0 | 61 |
См. также
- Описание web-визуализаций — полезное объяснение концепций web-визуализаций, включая разницу между визуальным и компонующим viewport.
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/VisualViewport