You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Three.js滚动动画实现中如何禁止超出页面顶部及无限滚动?

解决方案

你需要做三处调整即可实现滚动边界限制:

  • 阻止wheel事件的默认行为,避免原生页面滚动和自定义Three.js滚动逻辑冲突,这也是你之前遇到滚动条卡住的常见原因
  • 定义最大滚动阈值,可根据Three.js场景的实际高度灵活调整
  • 在渲染帧逻辑中对滚动位置变量做边界钳制,限制滚动范围

修改后的滚动监听代码

// 定义最大滚动阈值,可根据实际场景高度调整数值
const MAX_SCROLL = 10; 

// passive设为false才能正常阻止默认滚动事件
window.addEventListener("wheel", onMouseWheel, { passive: false });

let y = 0;
let pos = 0;

function onMouseWheel(e) {
    // 阻止原生页面滚动,避免和自定义逻辑冲突
    e.preventDefault();
    y = e.deltaY * 0.003;
    particlesMesh.rotation.y += 0.0005;
}

修改后的渲染逻辑代码

const clock = new THREE.Clock();

const tick = () => {
    // Scroll
    pos += y;
    y *= 0.9;
    // 钳制滚动位置:0为顶部边界,禁止超出页面顶部;MAX_SCROLL为底部边界,限制最大滚动范围
    pos = Math.max(0, Math.min(MAX_SCROLL, pos));
    camera.position.y = -pos;

    // Render
    renderer.render(scene, camera);
    window.requestAnimationFrame(tick);
};

tick()

调整说明

如果觉得底部滚动范围不够,就调大MAX_SCROLL的数值,反之调小即可。如果需要和页面其他DOM元素的滚动节奏对齐,也可以将MAX_SCROLL和页面实际高度绑定,示例:const MAX_SCROLL = (document.body.scrollHeight - window.innerHeight) / 100,调整除数的数值即可匹配滚动节奏。

内容的提问来源于stack exchange,提问作者relativenoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:06:02