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

如何让ScrollControls仅在网站首屏完全滚动后才激活?

解决React-three-drei ScrollControls与页面父滚动条冲突的问题

核心方案

让ScrollControls直接监听全局页面滚动,同时将Model组件的高度设置为与ScrollControls的pages数量匹配的高度,确保页面滚动条覆盖整个3D交互区域,避免局部滚动独立运行。

具体修改步骤

  1. 调整Canvas高度:因为你的ScrollControls设置了pages={3},将Canvas的高度改为300vh(每个page对应100vh),让页面滚动条能延伸到整个3D组件的滚动范围。
  2. 绑定全局滚动元素:给ScrollControls添加scrollEl={window}属性,让它监听浏览器的全局滚动事件,替代自身的局部滚动。
  3. 优化OrbitControls配置:移除OrbitControls上的style={{ height: "50vh" }},避免限制其交互区域导致的事件冲突,同时可以禁用不需要的交互(如enablePan={false})减少冲突概率。

修改后的Model组件代码

import { Canvas } from '@react-three/fiber';
import { OrbitControls, ScrollControls } from '@react-three/drei';

const Model = () => {
  return (
    <>
      <Canvas
        style={{
          height: "300vh", // 匹配3个pages的高度
          marginTop: 20, // 替换原mt:5为标准CSS属性
        }}
        camera={{ fov: 64, position: [2.3, 4.5, 4.3] }}
        shadows
        gl={{ antialias: false }}
      >
        <ambientLight intensity={1} />
        <OrbitControls enableZoom={false} enablePan={false} /> {/* 优化交互配置 */}
        <ScrollControls 
          pages={3} 
          maxSpeed={0.5} 
          damping={0.25}
          scrollEl={window} // 绑定全局滚动元素
        >
          <VTol />
          <Works />
        </ScrollControls>
      </Canvas>
    </>
  );
};

export default Model;

说明

  • 无需使用useState/useEffect手动同步滚动:ScrollControls的scrollEl属性是官方提供的外部滚动绑定方案,内部基于requestAnimationFrame处理动画,能保证流畅性,不会破坏原有动画效果。
  • 页面滚动条现在会覆盖首屏Charger和整个Model组件的高度,滚动时ScrollControls会根据全局滚动进度同步更新3D内容的位置,解决了局部滚动独立的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:30:18