我正在尝试将页面的垂直滚动绑定到水平滚动,并且利用滚动捕捉(scroll-snapping)和流畅滚动效果,使得用户能够滚动到下一个或上一个“页面”。
请观看视频以了解脚本运行时出现的异常行为及其与样式表的交互方式。您可以通过CodePen重现这个bug,但我目前不确定是什么导致了这种故障现象。我在代码中添加了一个400毫秒的延迟,目的是防止用户不小心同时触发两个方向的滚动。
预期目标是让用户只有在当前元素完全显示后才能滚动到下一个元素。
当关闭滚动捕捉功能时,scrollBy
函数无法正常工作,只能使页面稍微移动一点(而不是按照预期滚动整个窗口宽度)。
视频链接
CodePen 链接
以下是JavaScript代码段:
// 初始化等待标志变量
var waiting;
if (waiting == null) {
waiting = 0;
}
document.querySelector(".main-nav").addEventListener("wheel", (event) => {
event.preventDefault();
// 如果等待标志为0,则开始处理滚动事件
if (waiting === 0) {
waiting = 1;
console.log("started wait");
// 根据鼠标滚轮的方向进行相应的水平滚动
if (event.deltaY > 0) {
scrlFF();
setTimeout(finishedWaiting, 400);
} else if (event.deltaY < 0) {
scrlFR();
setTimeout(finishedWaiting, 400);
}
}
});
function finishedWaiting() {
console.log("finished wait");
waiting = 0;
}
// 向前滚动一页
function scrlFF() {
document.querySelector(".main-nav").scrollBy({ left: window.innerWidth, behavior: 'smooth' });
}
// 向后滚动一页
function scrlFR() {
document.querySelector(".main-nav").scrollBy({ left: -window.innerWidth, behavior: 'smooth' });
}
以及相关的CSS样式:
.a {
background: red;
min-width: 100vw;
height: 100vh;
display: flex;
scroll-snap-align: center;
scroll-snap-stop: always;
}
.a ~ .a {
background: blue;
}
/* 更多颜色交替的 ".a" 元素样式... */
/* 隐藏垂直滚动条 */
* { overflow-y: hidden; }
.main-nav {
display: flex;
flex-direction: row;
height: 100%;
scroll-snap-type: x mandatory;
overflow-x: scroll;
scroll-behavior: smooth;
scrollbar-width: none;
width: inherit;
}
HTML结构:
<div class="main-nav">
<div class="a"></div>
<div class="a"></div>
<div class="a"></div>
<div class="a"></div>
</div>