IntersectionObserver
当元素进入视口时,我正在使用向元素添加和删除类。
而不是说“当 X% 的元素可见时 - 添加此类”我想说“当 X% 的元素可见或当 X% 的视口被元素覆盖时 - 添加此类”。
我假设这是不可能的?如果是这样,我认为这有点缺陷,IntersectionObserver
因为如果你有一个比视口高 10 倍的元素,除非你将阈值设置为 10% 或更低,否则它永远不会被视为可见。当你有可变高度元素时,特别是在响应式设计中,你必须将阈值设置为 0.1% 之类的东西,以“确定”元素将接收类(但你永远无法真正确定)。
编辑:回应摩西的回复。
Edit2:更新了几个阈值以强制它更频繁地计算 percentOfViewport。还是不理想。
var observer = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
var entryBCR = entry.target.getBoundingClientRect();
var percentOfViewport = ((entryBCR.width * entryBCR.height) * entry.intersectionRatio) / ((window.innerWidth * window.innerHeight) / 100);
console.log(entry.target.id + ' covers ' + percentOfViewport + '% of the viewport and is ' + (entry.intersectionRatio * 100) + '% visible');
if (entry.intersectionRatio > 0.25) {
entry.target.style.background = 'red';
}
else if (percentOfViewport > 50) {
entry.target.style.background = 'green';
}
else {
entry.target.style.background = 'lightgray';
}
});
}, {threshold: [0.025, 0.05, 0.075, 0.1, 0.25]});
document.querySelectorAll('#header, #tall-content').forEach(function (el) {
observer.observe(el);
});
#header {background: lightgray; min-height: 200px}
#tall-content {background: lightgray; min-height: 2000px}
<header id="header"><h1>Site header</h1></header>
<section id="tall-content">I'm a super tall section. Depending on your resolution the IntersectionObserver will never consider this element visible and thus the percentOfViewport isn't re-calculated.</section>