Как определить изменение состояния видимости элемента?
Допустим, есть у нас модельное окно которое естественно скрыто черед свойство display. В модельном окне, есть некая панель, в панели имеется выпадающий список который тоже скрыт через свойство display. В этом меню есть компонент который использует функции по типу getBoundingClientRect, getComputedStyle и т.д. и т.п. Вопрос, как можно подписаться на событие при котором модальное окно как и вып. список открыты? То есть, все родительские элементы как и сам конечный элемент видны. Есть ли способ запускать код всякий раз когда элемент становится видимым?
ПС: Структура только для примера!!! Вложенность может быть произвольной.
Дополнительно:
Кинь обоих в MutatuionObserver на атрибут style, там проверку какую надо производи
Расширю ответ imko кодом:
// return true, if element visible function isVisible(element) { return window.getComputedStyle(element).display !== 'none'; } // MutationObserver const observer = new MutationObserver((mutations, obs) => { const modal = document.querySelector('#modalWindow'); // modal selector const dropdown = document.querySelector('#dropdownMenu'); // dropdown menu selector // check is visible? if (isVisible(modal) && isVisible(dropdown)) { console.log('Element is visible'); obs.disconnect(); } }); // config const config = { attributes: true, attributeFilter: ['style'] } // run observer.observe(document.querySelector('#modalWindow'), config); observer.observe(document.querySelector('#dropdownMenu'), config); |
// return true, if element visible function isVisible(element) { return window.getComputedStyle(element).display !== 'none'; } // MutationObserver const observer = new MutationObserver((mutations, obs) => { const modal = document.querySelector('#modalWindow'); // modal selector const dropdown = document.querySelector('#dropdownMenu'); // dropdown menu selector // check is visible? if (isVisible(modal) && isVisible(dropdown)) { console.log('Element is visible'); obs.disconnect(); } }); // config const config = { attributes: true, attributeFilter: ['style'] } // run observer.observe(document.querySelector('#modalWindow'), config); observer.observe(document.querySelector('#dropdownMenu'), config);
- Спасибо! Уже разобрался. Я повесил все на ResizeObserver с проверкой что элемент в момент вызова виден. Так логичнее, ибо пересчёт нужно было делать после изменения размера родителя или конечного элемента.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для определения изменения состояния видимости элемента на веб-странице можно использовать методы JavaScript. Существует несколько способов проверки видимости элемента, в зависимости от конкретной ситуации.
Один из самых распространенных способов - использование свойства `display` или `visibility` в стилях элемента. Например, если элемент скрыт с помощью CSS свойства `display: none;`, то можно проверить его видимость следующим образом:
if (element.style.display === 'none') { // Элемент скрыт } else { // Элемент видим }
Еще один способ - использование методов `getComputedStyle` и `getPropertyValue` для получения актуальных стилей элемента. Например:
var elementStyle = window.getComputedStyle(element); if (elementStyle.getPropertyValue('display') === 'none') { // Элемент скрыт } else { // Элемент видим }
Также можно проверить видимость элемента относительно его родителя, используя методы `offsetParent` и `offsetTop`. Например:
if (element.offsetParent === null || element.offsetTop === 0) { // Элемент скрыт } else { // Элемент видим }
Наконец, можно использовать метод `getBoundingClientRect` для определения видимости элемента на экране. Например:
var elementRect = element.getBoundingClientRect(); if (elementRect.width > 0 && elementRect.height > 0) { // Элемент видим } else { // Элемент скрыт }
Выбор конкретного метода зависит от того, каким образом элемент скрывается или отображается на странице. В любом случае, эти способы позволят определить изменение состояния видимости элемента и выполнить необходимые действия в зависимости от этого.