REACT集成GSAP实现滚动效果时页面无输出该如何解决?
React结合GSAP实现滚动动画的问题修复
核心问题点
- 配置键名错误:GSAP时间线的滚动触发器配置需要小写开头的
scrollTrigger,你代码里写成了大写开头的ScrollTrigger,导致配置完全不生效 - 缺少3D上下文:你使用了
translateZ变换,但父容器没有设置perspective透视属性,3D变换效果无法正常渲染,图片会全部重叠不可见 - 滚动高度不足:
pin固定#ImgWrapper后需要足够的滚动高度触发动画,你当前代码没有给外层容器设置足够高度,滚动条无法触发,动画自然不会运行 - 动画逻辑错误:你所有
to动画的时间位置都设为0,相当于所有变换在初始化时就执行完毕,没有和滚动进度绑定的变化过程,看不到滚动动效 - 事件配置错误:
onMouseEnter、onMouseOut不是ScrollTrigger支持的配置项,写在这里不会生效,需要绑定到对应DOM元素的原生事件上
修复后的代码示例
JSX部分
import React, { useRef, useEffect } from 'react'; import './App.css'; import './components/Gsap.css' import { gsap } from 'gsap'; import { ScrollTrigger } from 'gsap/ScrollTrigger'; import yash1 from './components/yash1.png'; import yash2 from './components/yash2.png'; import yash3 from './components/yash3.png'; import manan1 from './components/manan1.png'; import manan2 from './components/manan2.png'; import ankit1 from './components/ankit1.png'; import ankit2 from './components/ankit2.png'; import ankit3 from './components/ankit3.png'; function App() { gsap.registerPlugin(ScrollTrigger) const ref = useRef(null); useEffect(() => { const element = ref.current if(!element) return // 先给所有图片设置初始translateZ为0 gsap.set('#ImgWrapper img', { z: 0 }) gsap.timeline({ scrollTrigger: { trigger: "#ImgWrapper", start: "0% 0%", end: "200% 0%", // 延长结束位置增加滚动距离 pin: "#ImgWrapper", scrub: 1, // 调整scrub值让滚动跟随更流畅 } }) // 滚动时逐步提升各图片的translateZ值 .to('#ImgWrapper #img8', { z: 5500 }, 0) .to('#ImgWrapper #img7', { z: 4500 }, 0) .to('#ImgWrapper #img6', { z: 3700 }, 0) .to('#ImgWrapper #img5', { z: 3100 }, 0) .to('#ImgWrapper #img4', { z: 2800 }, 0) .to('#ImgWrapper #img3', { z: 2600 }, 0) .to('#ImgWrapper #img2', { z: 2400 }, 0) .to('#ImgWrapper #img1', { z: 2200 }, 0) }, []) return ( <div className="App" ref = {ref} > <div id="wrapper"> <h1>Unusual Imaginative<br /> <span>GSAP Scroll Effect</span></h1> <p>Scroll Down</p> </div> <div id="ImgWrapper"> <img id = "img1" src = { yash1 } alt = '' /> <img id = "img2" src = { yash2 } alt = '' /> <img id = "img3" src = { yash3 } alt = '' /> <img id = "img4" src = { manan1 } alt = '' /> <img id = "img5" src = { manan2 } alt = '' /> <img id = "img6" src = { ankit1 } alt = '' /> <img id = "img7" src = { ankit2 } alt = '' /> <img id = 'img8' src = { ankit3 } alt = '' /> </div> </div> ); } export default App;
需要补充的CSS配置
/* 给App容器加足够高度和透视 */ .App { min-height: 300vh; /* 三倍视口高度保证足够滚动距离 */ background-color: #fff; } #ImgWrapper { perspective: 6000px; /* 透视属性开启3D上下文 */ width: 100vw; height: 100vh; position: relative; overflow: hidden; } #ImgWrapper img { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); max-width: 80%; max-height: 80%; object-fit: contain; }
内容的提问来源于stack exchange,提问作者user11464857
相关产品推荐
相关产品推荐

