我主要是尝试将页面的垂直滚动绑定为水平滚动,同时使用滚动捕捉和平滑滚动行为来滚动到下一个/上一个“页面”。
请观看视频,看看脚本的奇怪行为,以及它如何与样式表交互,你可以用codepen重新创建bug。我不确定是什么导致了这个小故障。我在代码中添加了400毫秒的超时,这是为了防止用户意外地同时触发两个方向的滚动。
其目的是允许用户仅在当前元素处于视图中时才滚动到下一个元素。
当scroll-snap被禁用时,scrollBy函数不起作用,只是轻微移动(而不是整个窗口。innerWidth)
Video of bug
Link to CodePen的
var waiting
if (waiting == null) {
waiting = 0
}
document.querySelector(".main-nav").addEventListener("wheel", (event) => {
event.preventDefault();
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' }); }
.a { background: red;
min-width: 100vw; height: 100vh; display: flex; scroll-snap-align: center; scroll-snap-stop: always;}
.a ~ .a { background: blue;}
.a ~ .a ~ .a { background: red;}
.a ~ .a ~ .a ~ .a { background: blue;}
* { 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;}
<div class="main-nav"><div class="a"></div><div class="a"></div><div class="a"></div><div class="a"></div></div>
3条答案
按热度按时间nx7onnlm1#
鼠标滚轮和页面滚动通常是一个挑战。
这真的只是一个轻微的扭曲你有什么,但与一些补充,以平滑滚动。不完美,但真的只有奇怪的快速向上/向下轮滚动。
游戏/变化:
setTimeout
,因为我们可以对一些事件这样做-scrollend
是我们在触发时切换的关键。function scrollContainer(main, plus) {
而不是两个函数来干燥代码;为左/右传递一个布尔值。let
可能是const
,但将其作为单独的练习。fumotvh32#
虽然嵌入的代码片段似乎在stackoverflow上运行得很顺利,在事件侦听器的查询框中添加了“html,body”,但同样的代码在codepen或我的网站上却不能正常运行?
字符串
6uxekuva3#
我还没有将这个问题标记为已解决,因为我仍然不明白是什么导致了这个问题。然而,我能够为codepen和我的网站找到一个工作但不太理想的解决方案。
CSS:
字符串
JavaScript语言:
型
出于某种原因,在滚动过程中添加
pointer-events:none;
修复了故障。我添加了一个css变量来控制函数中指针事件的属性,以便在延迟结束时恢复为pointer-events:all;
。当您将鼠标悬停在
.main-nav
内部的子元素.a
(或任何子元素)上时,滚动无法正常工作。它无法滚动到下一个位置,并产生video中显示的毛刺,除非pointer-events具有属性none
如果有人能解释到底发生了什么,我很感激任何建议?