将 forEach() 方法更改为 For 循环以与 IntersectionObserver 一起使用 - Javascript
Change a forEach() method to a For Loop to use with IntersectionObserver - Javascript
我有以下 IntersectionObserver 代码,它作为网站上动画的滚动触发器,一切正常。
但是,我想将调用 IntersectionObserver 的 forEach() 方法切换为 for 循环,但我无法让它工作。
我确信这是可以做到的,但这让我有点抓狂。
想要这个的原因是因为我使用了一个 polyfill 以便 IntersectionObserver 在旧版本的 IE 和 Edge 中工作,但是当然 forEach() 方法在这些浏览器中不起作用。
我在代码底部的循环中注释掉了我的尝试。
任何帮助都会很棒。
代码笔:https://codepen.io/emilychews/pen/xJaZay
window.addEventListener("load", function(){
var iO = "IntersectionObserver" in window; /* true if supported */
var box = document.querySelectorAll('.box');
if (iO) {
const config = {
root: null, // sets the framing element to the viewport
rootMargin: '0px',
threshold: .5
};
let observer = new IntersectionObserver(function(entries) {
entries.forEach(function(item) {
if (item.intersectionRatio > .5) {
item.target.classList.add("active");
} else {
item.target.classList.remove("active");
}
});
}, config);
box.forEach(function(item){
observer.observe(item);
});
// for (i = 0; i < box.length; i++) {
// observer[i].observe(item);
// }
} // end of if(iO)
}); // end of load event
body {
font-family: arial;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 280vh;
}
.box {
position: relative;
margin: 1rem 0;
width: 100px;
height: 100px;
background: blue;
opacity: 1;
transition: .5s all;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
}
#box1{
margin-bottom: 100px;
}
.active {
background: red;
opacity: 1;
}
<div id="box1" class="box">Box 1</div>
<div id="box2" class="box">Box 2</div>
您有一个观察者,但您正在对其应用索引。当您遍历这些框时,您的索引访问器应该在框上。
for (i = 0; i < box.length; i++) {
observer.observe(box[i]);
}
这应该可以,但尚未经过测试。
我有以下 IntersectionObserver 代码,它作为网站上动画的滚动触发器,一切正常。
但是,我想将调用 IntersectionObserver 的 forEach() 方法切换为 for 循环,但我无法让它工作。
我确信这是可以做到的,但这让我有点抓狂。
想要这个的原因是因为我使用了一个 polyfill 以便 IntersectionObserver 在旧版本的 IE 和 Edge 中工作,但是当然 forEach() 方法在这些浏览器中不起作用。
我在代码底部的循环中注释掉了我的尝试。
任何帮助都会很棒。
代码笔:https://codepen.io/emilychews/pen/xJaZay
window.addEventListener("load", function(){
var iO = "IntersectionObserver" in window; /* true if supported */
var box = document.querySelectorAll('.box');
if (iO) {
const config = {
root: null, // sets the framing element to the viewport
rootMargin: '0px',
threshold: .5
};
let observer = new IntersectionObserver(function(entries) {
entries.forEach(function(item) {
if (item.intersectionRatio > .5) {
item.target.classList.add("active");
} else {
item.target.classList.remove("active");
}
});
}, config);
box.forEach(function(item){
observer.observe(item);
});
// for (i = 0; i < box.length; i++) {
// observer[i].observe(item);
// }
} // end of if(iO)
}); // end of load event
body {
font-family: arial;
margin: 0;
padding: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 280vh;
}
.box {
position: relative;
margin: 1rem 0;
width: 100px;
height: 100px;
background: blue;
opacity: 1;
transition: .5s all;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
}
#box1{
margin-bottom: 100px;
}
.active {
background: red;
opacity: 1;
}
<div id="box1" class="box">Box 1</div>
<div id="box2" class="box">Box 2</div>
您有一个观察者,但您正在对其应用索引。当您遍历这些框时,您的索引访问器应该在框上。
for (i = 0; i < box.length; i++) {
observer.observe(box[i]);
}
这应该可以,但尚未经过测试。