Three.js + React 实战系列 - 项目展示区开发详解 Projects 组件(3D 模型 + 动效 + 状态切换)✨

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦!!谢谢大家!!!

在这一篇博客中,我们将搭建项目主页中极具互动性的 Projects 区域。

该组件承担着展示个人项目展示的功能,融合 GSAP 动画、@react-three/fiber 3D 展示与交互式切换等高级特性,用户体验上极具冲击力。

React + ThreeJS 个人主页小项目:🎥 05 · 项目展示区开发详解 Projects 组件(3D 模型 + 动效 + 状态切换)

✨ 组件亮点概览

  • 结合 GSAP 实现文字动画过渡效果;
  • 通过 <Canvas> 实现 3D 电脑模型展示;
  • 支持左右翻页浏览多个项目;
  • 响应式设计与美观的卡片式信息布局。

📁 项目结构建议

组件路径:

复制代码
src/
├--- components/
│   └--- DemoComputer.jsx
├--- sections/
│   └--- Projects.jsx
└--- constants/
    ├--- index.js

🔄 状态切换逻辑

我们定义了 selectedProjectIndex 来记录当前浏览的项目,通过 handleNavigation 来控制前后切换逻辑,形成一个循环浏览:

js 复制代码
const handleNavigation = (direction) => {
  setSelectedProjectIndex((prevIndex) => {
    if (direction === 'previous') {
      return prevIndex === 0 ? projectCount - 1 : prevIndex - 1;
    } else {
      return prevIndex === projectCount - 1 ? 0 : prevIndex + 1;
    }
  });
};

🌟 动画效果(GSAP)

通过 useGSAP,我们对每次切换项目时的 .animatedText 类名文字应用淡入动画,增强用户体验:

js 复制代码
useGSAP(() => {
  gsap.fromTo('.animatedText', { opacity: 0 }, {
    opacity: 1,
    duration: 1,
    stagger: 0.2,
    ease: 'power2.inOut'
  });
}, [selectedProjectIndex]);

fromTo 方法:初始状态将文字透明度设为 0,然后在 1 秒内逐个淡入(通过 stagger 实现),动画曲线为 power2.inOut,使文字的出现显得柔和流畅,极大提升了用户在浏览项目时的沉浸感和专业感。


🖼️ 左侧:项目信息面板

包括:项目封面图、logo、标题描述、标签、跳转链接,以及左右切换按钮。

js 复制代码
<img src={currentProject.spotlight} alt="spotlight" className="..." />
<p className="text-white text-2xl font-semibold animatedText">{currentProject.title}</p>

所有数据来源于 myProjects 常量数组,并支持动态渲染每个项目对应的内容。


🖥️ 右侧:3D 电脑展示区域

采用 @react-three/fiber<Canvas> 实现沉浸式项目封面展示。

html 复制代码
<Canvas>
  <ambientLight intensity={Math.PI} />
  <directionalLight position={[10, 10, 5]} />
  <Center>
    <Suspense fallback={<CanvasLoader />}>
      <group scale={2} position={[0, -3, 0]} rotation={[0, -0.1, 0]}>
        <DemoComputer texture={currentProject.texture} />
      </group>
    </Suspense>
  </Center>
  <OrbitControls maxPolarAngle={Math.PI / 2} enableZoom={false} />
</Canvas>

其中 DemoComputer 是一个自定义 3D 模型组件,配合不同 texture 显示不同项目封面。


📌 总结

Projects.jsx 组件是整个主页中前后端交互最强、技术栈最丰富的板块之一,建议优先理清以下要点:

  • 熟练使用 state 管理当前展示内容;
  • 理解如何配合 GSAP 动画提升 UX;
  • 熟悉 Fiber Canvas 与 Drei 工具的用法;
  • 数据抽象与复用能力的提升。

🔠 下一篇预告:客户评价区域

我们将在下一节中:

  • 🌟 构建客户评价区域(Client)
  • ✨ 使用 gsap 为内容添加滑入动效
  • ⛳️ 信息条目数据化驱动,方便扩展

对个人主页设计和实现感兴趣的朋友可以订阅我的专栏哦!!谢谢大家!!!

我们下一节见!👋

相关推荐
用户298698530149 小时前
前端 Excel 处理进阶:React 中合并与取消合并单元格的实现
前端·javascript·react.js
触底反弹9 小时前
面试被问 RAG 只能说出六个字?这篇用 100 行 Node.js 代码帮你彻底搞懂
javascript·人工智能·面试
Highcharts9 小时前
@highcharts/react完整技术指南|新版Highcharts React使用、迁移、SSR、TS 优化全解
前端·javascript
老王以为9 小时前
Fiber 节点 —— 一个数据结构如何承载整个 React 运行时
前端·react native·react.js
gis开发之家10 小时前
vue3组合式函数(Composables)的艺术——将业务逻辑从UI组件中连根拔起
前端·javascript·vue.js·前端框架·vue3·前端工程化·前端架构
mONESY10 小时前
ReAct 智能体循环与 JavaScript 异步并发原理深度解析
react.js
liuniansilence10 小时前
一次讲透 H5 唤起原生 App:Scheme 协议、平台限制与生产级封装
前端·javascript
用户9385156350710 小时前
从“问答机器”到“智能体”:AI Agent 是如何自主工作的?
javascript·人工智能·全栈