IntersectionObserver
每当交集发生变化时,都会调用构造函数中的函数。你不能放在observer.observe(box);
里面。
另外,item
is 不是 DOM 元素——它是一个IntersectionObserverEntry
,所以你不能.classList
在它上面使用。您可能打算解决item.target
.
即使上述内容得到纠正,您的 CSS 也不会改变,因为您使用#box
选择器将 设置background
为blue
,它的特异性高于.active
. 一个简单的解决方法是改为#box
使用.box
HTML 并改为使用 HTML <div id="box" class="box"></div>
。
更正后的代码将如下所示:
const config = {
root: null, // Sets the framing element to the viewport
rootMargin: "0px",
threshold: 0.5
},
box = document.getElementById("box"),
observer = new IntersectionObserver((entries) => entries
.forEach(({target: {classList}}) => classList.add("active")), config);
observer.observe(box);
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 300vh;
}
.box {
width: 100px;
height: 100px;
background: blue;
}
.active {
background: red;
}
<div id="box" class="box"></div>
现在您需要在回调中添加一些逻辑:
entries.forEach(({target: {classList}, intersectionRatio}) => {
if(intersectionRatio > 0.5){
classList.add("active");
}
else{
classList.remove("active");
}
});
<div>
当超过 50% 可见时,这将使红色变为红色。
const config = {
root: null, // Sets the framing element to the viewport
rootMargin: "0px",
threshold: 0.5
},
box = document.getElementById("box"),
observer = new IntersectionObserver((entries) => entries
.forEach(({target: {classList}, intersectionRatio}) => {
if(intersectionRatio > 0.5){
classList.add("active");
}
else{
classList.remove("active");
}
}), config);
observer.observe(box);
body {
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 300vh;
}
.box {
width: 100px;
height: 100px;
background: blue;
}
.active {
background: red;
}
<div id="box" class="box"></div>