快速滚动以更改样式
Fast scroll to change style
是否可以滚动到 .project
并使背景变红而不滚动 慢且接近 class .project
?
基本上我希望用户能够滚动并显示红色,即使他或她快速滚动,但是当用户高于或低于 projectPosition.top
时,背景应该是标准颜色(黑色).
var project = document.getElementsByClassName('project')[0];
var projectPosition = project.getBoundingClientRect();
document.addEventListener('scroll', () => {
var scrollY = window.scrollY;
if (scrollY == projectPosition.top) {
project.style.background = "red";
project.style.height = "100vh";
} else {
project.style.background = "black";
project.style.height = "200px";
}
});
.top {
height: 700px;
}
.project {
background: black;
height: 200px;
width: 100%;
}
<div class="top"></div>
<div class="project"></div>
<div class="top"></div>
提前致谢。
要使其成为 'fast' 你最好使用 >=
运算符而不是 ==
:
var project = document.getElementsByClassName('project')[0];
var projectPosition = project.getBoundingClientRect();
document.addEventListener('scroll', () => {
var scrollY = window.scrollY;
if (scrollY >= projectPosition.top && scrollY <= projectPosition.top + projectPosition.height) {
project.style.background = "red";
project.style.height = "100vh";
} else {
project.style.background = "black";
project.style.height = "200px";
}
});
.top {
height: 700px;
}
.project {
background: black;
height: 200px;
width: 100%;
}
<div class="top"></div>
<div class="project"></div>
<div class="top"></div>
您可以使用 Intersection Observer API 来监视进入和离开视图的元素,而不是监听滚动事件。每次观察到的元素进入或离开视图时,都会触发一个回调函数,您可以在其中检查元素是否进入或离开视图,并进行相应处理。
它的性能也很高,可以让您免于一些顶部和高度的计算。
在下面的示例中查看。
如果您对此有任何疑问,请告诉我。
阈值
要在元素完全进入视图而不是部分进入视图时触发回调,请将 threshold
选项值设置为 [1]
。默认值为 [0]
,这意味着只要元素在视图中的最小距离为 1px,就会触发它。 [1]
表示元素的 100% 必须在视图中才能触发。该值的范围可以从 0 到 1,并且可以包含多个触发点。例如
const options = {
threshold: [0, 0.5, 1]
};
也就是说,开始,中途,完全进入视野。
const project = document.querySelector('.project');
const observerCallback = entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('red');
} else {
entry.target.classList.remove('red');
}
});
};
const options = {
threshold: [1]
}
const observer = new IntersectionObserver(observerCallback, options);
observer.observe(project);
.top,
.bottom{
height: 700px;
width: 100%;
}
.project {
background: black;
height: 200px;
width: 100%;
}
.project.red {
background: red;
}
<div class="top"></div>
<div class="project"></div>
<div class="bottom"></div>
是否可以滚动到 .project
并使背景变红而不滚动 慢且接近 class .project
?
基本上我希望用户能够滚动并显示红色,即使他或她快速滚动,但是当用户高于或低于 projectPosition.top
时,背景应该是标准颜色(黑色).
var project = document.getElementsByClassName('project')[0];
var projectPosition = project.getBoundingClientRect();
document.addEventListener('scroll', () => {
var scrollY = window.scrollY;
if (scrollY == projectPosition.top) {
project.style.background = "red";
project.style.height = "100vh";
} else {
project.style.background = "black";
project.style.height = "200px";
}
});
.top {
height: 700px;
}
.project {
background: black;
height: 200px;
width: 100%;
}
<div class="top"></div>
<div class="project"></div>
<div class="top"></div>
提前致谢。
要使其成为 'fast' 你最好使用 >=
运算符而不是 ==
:
var project = document.getElementsByClassName('project')[0];
var projectPosition = project.getBoundingClientRect();
document.addEventListener('scroll', () => {
var scrollY = window.scrollY;
if (scrollY >= projectPosition.top && scrollY <= projectPosition.top + projectPosition.height) {
project.style.background = "red";
project.style.height = "100vh";
} else {
project.style.background = "black";
project.style.height = "200px";
}
});
.top {
height: 700px;
}
.project {
background: black;
height: 200px;
width: 100%;
}
<div class="top"></div>
<div class="project"></div>
<div class="top"></div>
您可以使用 Intersection Observer API 来监视进入和离开视图的元素,而不是监听滚动事件。每次观察到的元素进入或离开视图时,都会触发一个回调函数,您可以在其中检查元素是否进入或离开视图,并进行相应处理。
它的性能也很高,可以让您免于一些顶部和高度的计算。 在下面的示例中查看。
如果您对此有任何疑问,请告诉我。
阈值
要在元素完全进入视图而不是部分进入视图时触发回调,请将 threshold
选项值设置为 [1]
。默认值为 [0]
,这意味着只要元素在视图中的最小距离为 1px,就会触发它。 [1]
表示元素的 100% 必须在视图中才能触发。该值的范围可以从 0 到 1,并且可以包含多个触发点。例如
const options = {
threshold: [0, 0.5, 1]
};
也就是说,开始,中途,完全进入视野。
const project = document.querySelector('.project');
const observerCallback = entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('red');
} else {
entry.target.classList.remove('red');
}
});
};
const options = {
threshold: [1]
}
const observer = new IntersectionObserver(observerCallback, options);
observer.observe(project);
.top,
.bottom{
height: 700px;
width: 100%;
}
.project {
background: black;
height: 200px;
width: 100%;
}
.project.red {
background: red;
}
<div class="top"></div>
<div class="project"></div>
<div class="bottom"></div>