Допустим, инициализируется 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, но всё же.