我有以下IntersectionObserver代码,它们可以用作网站上所有动画正常的滚动触发器。

但是,我想将作为对IntersectionObserver的调用的forEach()方法切换为for循环,但是我无法使其正常工作。

我敢肯定这是可以做到的,但这让我有些疯狂。

想要这个的原因是因为我使用的是polyfill,以便IntersectionObserver在IE和Edge的旧版本中都可以使用,但是forEach()方法当然在这些浏览器中不起作用。

我已在代码底部注释掉了对循环的尝试。

任何帮助都将是惊人的。

Codepen: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]);
}


这应该起作用,但是未经测试。

09-20 23:16