用途:为 3D 网页接入滚动交互,让页面滚动驱动相机移动或物体动画。核心原则是只选一种滚动来源,避免两套机制互相冲突。
方案 A(Lenis + GSAP ScrollTrigger):DOM 正常滚动,滚动进度驱动 3D。适合 HTML 与 3D 混合的营销页、故事页。安装命令:npm i gsap @studio-freight/lenis。用法为在应用根部初始化 Lenis,用 lenis.on('scroll', ScrollTrigger.update) 与 gsap.ticker 同步;再通过 ScrollTrigger 把某段区块映射为 0..1 的 progress 存入状态库(如 zustand),在 Canvas 的 useFrame 中读取并用 CatmullRomCurve3 的 getPointAt(p) 移动相机,配合 camera.position.lerp 与 lookAt;frameloop 为 demand 时需调用 invalidate()。
方案 B(drei ScrollControls):滚动位于 Canvas 内的虚拟轨道。使用 <ScrollControls pages={3} damping={0.2}> 包裹内容,内部组件用 useScroll().offset 获取 0..1 进度,在 useFrame 中驱动旋转等;<Scroll html> 可放置随轨道滚动的 HTML。适合纯 3D 体验。
必备注意:尊重减少动态偏好,matchMedia('(prefers-reduced-motion: reduce)') 命中时禁用平滑滚动并改为跳变而非 scrub;卸载时清理 ScrollTrigger 并销毁 Lenis;移动端需实测触摸滚动,必要时设 smoothTouch:false;通过 lerp 与 scrub 调参获得平滑感。验证方式为滚动页面确认相机或物体平滑同步、无抖动,且路由切换后正确清理。复杂编排可交由 motion-choreographer 智能体处理。
限制:资料未说明具体版本要求、浏览器兼容范围与性能指标,暂未提供。