muscimolus
@muscimolus

IntersectionObserver и slot?

Допустим, инициализируется IntersectionObserver:

const observer = new IntersectionObserver((entries: IntersectionObserverEntry[]) => (
    entries.forEach(({ target, isIntersecting }) => {
        if(isIntersecting){
                // ...
                observer.unobserve(target)
            }
        }
    })
), {
    root: document.querySelector('#root')
})


Но при этом, при исполнении скрипта - все наблюдаемые элементы являются слотами:

document.querySelectorAll('slot[name]').forEach((slot: Element) => {
    observer.observe(slot)
})


Сами по себе слоты не имеют (почему?) такого свойства, как видимость в DOM, потому что по-умолчанию их свойство стиля, а именно display - равняется contents (либо они в принципе интерпритируются как заведомо не имеющие видимости в DOM).

Если свойство стиля слота display = contents (по умолчанию) - то эти слоты никогда не будут обработаны обсервером, потому что даже при наведении на них в DOM консоли разработчика - они не имеют никаких (computed) размеров вообще.

Если установить слоту свойство стиля display = initial (например), то он принимает размеры в соответствии с размером содержимого дочернего (дочерних) элемента (элементов), но даже в этом случае, когда этот слот не в пределах зоны видимости обсервера - он всё равно обрабатывается обсервером как видимый.

P.S. Да, я понимаю что можно вместо слотов использовать какой-то div, но всё же.
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 1
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Сами по себе слоты не имеют (почему?) такого свойства, как видимость в DOM
ну как бэ потому что это слоты, в них просто подставляется контент.
Почитай https://developer.mozilla.org/en-US/docs/Web/API/W... для общего понимания
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы