管理在多个 div 上使用 IntersectionObserver 的问题
Issue managing to use IntersectionObserver on multiple divs
因为我想在每个 div 出现在屏幕上时实现动画,所以我使用 IntersectionObserver API 来了解它们何时出现在视口中。
我的想法是为每个div创建一个观察者如下
this.box.forEach(name => {
let isVis = false;
handleEachCategory(name, isVis);
})
我的数据包含 CSS div 的名称,到目前为止我确实设法为每个创建了单独的观察者,但只有一个 div 触发了isVis 值的变化(定义我的 div 何时完全可见。
function handleEachCategory(category, isVis) {
let target;
let observer;
window.addEventListener("load", (event) => {
target = document.querySelector(category);
createObserver();
}, false);
function createObserver() {
let options = {
root: null,
rootMargin: '0px',
threshold: 1.0
}
observer = new IntersectionObserver(handleIntersect, options);
observer.observe(target)
}
function handleIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.intersectionRatio === 1)
setAsVisible();
});
}
function setAsVisible() {
isVis = true;
console.log(isVis)
}
}
如您所料,我是 javascript 的新手,我的逻辑可能在某处失败了,到目前为止我似乎还看不出如何让它发挥作用。
表达我的问题的另一种方式是 "how to implement multiple intersection observers",如果有更多 standard/preferred 方式,我很想知道。
我已经对你的代码做了一些修改,如下所示,这应该可以帮助你做你想做的事。
您的代码可能存在的问题是 window.addEventListener("load" 仅在页面完全加载时发生一次。
window.addEventListener("load", (event) => {
["one", "two", "three"].forEach(name => {
handleEachCategory(name);
});
}, false);
function handleEachCategory(category) {
let target = document.getElementById(category);
let observer;
let isVis;
createObserver();
function createObserver() {
let options = {
root: null,
rootMargin: '0px',
threshold: 1.0
}
observer = new IntersectionObserver(handleIntersect, options);
observer.observe(target)
}
function handleIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.intersectionRatio === 1)
setAsVisible();
});
}
function setAsVisible() {
isVis = true;
console.log(`${category} is${(!isVis ? " not" : "")} visible`)
}
}
#one,#two,#three {
min-height: 100px;
}
#one {
background: red;
}
#two {
background: yellow;
}
#three {
background: green;
}
<div>
<div id="one"></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div id="two"></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div id="three"></div>
</div>
因为我想在每个 div 出现在屏幕上时实现动画,所以我使用 IntersectionObserver API 来了解它们何时出现在视口中。
我的想法是为每个div创建一个观察者如下
this.box.forEach(name => {
let isVis = false;
handleEachCategory(name, isVis);
})
我的数据包含 CSS div 的名称,到目前为止我确实设法为每个创建了单独的观察者,但只有一个 div 触发了isVis 值的变化(定义我的 div 何时完全可见。
function handleEachCategory(category, isVis) {
let target;
let observer;
window.addEventListener("load", (event) => {
target = document.querySelector(category);
createObserver();
}, false);
function createObserver() {
let options = {
root: null,
rootMargin: '0px',
threshold: 1.0
}
observer = new IntersectionObserver(handleIntersect, options);
observer.observe(target)
}
function handleIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.intersectionRatio === 1)
setAsVisible();
});
}
function setAsVisible() {
isVis = true;
console.log(isVis)
}
}
如您所料,我是 javascript 的新手,我的逻辑可能在某处失败了,到目前为止我似乎还看不出如何让它发挥作用。
表达我的问题的另一种方式是 "how to implement multiple intersection observers",如果有更多 standard/preferred 方式,我很想知道。
我已经对你的代码做了一些修改,如下所示,这应该可以帮助你做你想做的事。 您的代码可能存在的问题是 window.addEventListener("load" 仅在页面完全加载时发生一次。
window.addEventListener("load", (event) => {
["one", "two", "three"].forEach(name => {
handleEachCategory(name);
});
}, false);
function handleEachCategory(category) {
let target = document.getElementById(category);
let observer;
let isVis;
createObserver();
function createObserver() {
let options = {
root: null,
rootMargin: '0px',
threshold: 1.0
}
observer = new IntersectionObserver(handleIntersect, options);
observer.observe(target)
}
function handleIntersect(entries, observer) {
entries.forEach(entry => {
if (entry.intersectionRatio === 1)
setAsVisible();
});
}
function setAsVisible() {
isVis = true;
console.log(`${category} is${(!isVis ? " not" : "")} visible`)
}
}
#one,#two,#three {
min-height: 100px;
}
#one {
background: red;
}
#two {
background: yellow;
}
#three {
background: green;
}
<div>
<div id="one"></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div id="two"></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div id="three"></div>
</div>