GSAP 动画引擎实战:打造丝滑动效交互组件库

[复制链接]
发表于 2025-9-20 22:22:48 | 显示全部楼层 |阅读模式

一、媒介

在今世前端开发中,动画效果不但是用户体验加分项,更是构建交互体验的关键。
相比 CSS 动画的局限,GSAP(GreenSock Animation Platform)具备:


  • 更强的控制力(时间轴、多状态联动)
  • 更平滑的性能(GPU 加快)
  • 更丰富的插件支持(滚动触发、拖拽、3D 等)
本篇文章将带你从 0 到 1 构建一个基于 GSAP 的丝滑动效交互组件库,并通过 Vue 3 实战演示多个经典场景:元素入场、列表过渡、滚动触发、拖拽交互、打字动画等。

二、项目初始化

我们利用 Vite + Vue 3 快速启动项目,并安装 GSAP:
  1. npm install gsap
复制代码
基础目录布局如下:
  1. 📦src
  2. ┣ 📂components
  3. ┃ ┣ 📜FadeIn.vue
  4. ┃ ┣ 📜SlideList.vue
  5. ┃ ┣ 📜ScrollReveal.vue
  6. ┃ ┣ 📜DraggableBox.vue
  7. ┃ ┗ 📜Typewriter.vue
  8. ┣ 📜App.vue
  9. ┗ 📜main.js
复制代码

三、核心动效组件实战

1. 元素淡入组件:FadeIn.vue

  1. <script setup>
  2. import { onMounted, ref } from 'vue'
  3. import gsap from 'gsap'
  4. const el = ref(null)
  5. onMounted(() => {
  6.   gsap.from(el.value, {
  7.     opacity: 0,
  8.     y: 30,
  9.     duration: 1.2,
  10.     ease: 'power2.out',
  11.   })
  12. })
  13. </script>
  14. <template>
  15.   <div ref="el" class="p-4 bg-blue-100 rounded shadow">
  16.     🚀 我是淡入动画内容
  17.   </div>
  18. </template>
复制代码
2. 列表级联动画:SlideList.vue

  1. <script setup>
  2. import { onMounted, ref } from 'vue'
  3. import gsap from 'gsap'
  4. const list = ref(['Vue', 'React', 'Svelte', 'Solid'])
  5. onMounted(() => {
  6.   gsap.from('.list-item', {
  7.     x: -30,
  8.     opacity: 0,
  9.     stagger: 0.2,
  10.     duration: 0.8,
  11.     ease: 'back.out(1.7)',
  12.   })
  13. })
  14. </script>
  15. <template>
  16.   <ul>
  17.     <li v-for="(item, i) in list" :key="i" class="list-item mb-2">
  18.       {{ item }}
  19.     </li>
  20.   </ul>
  21. </template>
复制代码
3. 滚动触发 Reveal 动画:ScrollReveal.vue

  1. <script setup>
  2. import { onMounted, ref } from 'vue'
  3. import gsap from 'gsap'
  4. import ScrollTrigger from 'gsap/ScrollTrigger'
  5. gsap.registerPlugin(ScrollTrigger)
  6. const el = ref(null)
  7. onMounted(() => {
  8.   gsap.from(el.value, {
  9.     scrollTrigger: {
  10.       trigger: el.value,
  11.       start: 'top 80%',
  12.     },
  13.     opacity: 0,
  14.     y: 50,
  15.     duration: 1,
  16.   })
  17. })
  18. </script>
  19. <template>
  20.   <div ref="el" class="mt-64 p-4 bg-green-100 rounded">
  21.     🌿 我是滚动触发内容
  22.   </div>
  23. </template>
复制代码
4. 拖拽盒子组件:DraggableBox.vue

  1. <script setup>
  2. import { onMounted, ref } from 'vue'
  3. import gsap from 'gsap'
  4. import Draggable from 'gsap/Draggable'
  5. gsap.registerPlugin(Draggable)
  6. const box = ref(null)
  7. onMounted(() => {
  8.   Draggable.create(box.value, {
  9.     bounds: 'body',
  10.     inertia: true,
  11.     edgeResistance: 0.65,
  12.     type: 'x,y',
  13.   })
  14. })
  15. </script>
  16. <template>
  17.   <div ref="box" class="w-24 h-24 bg-pink-400 text-white flex items-center justify-center rounded cursor-move">
  18.     拖我
  19.   </div>
  20. </template>
复制代码
5. 打字机效果组件:Typewriter.vue

  1. <script setup>
  2. import { ref, onMounted } from 'vue'
  3. import gsap from 'gsap'
  4. const text = 'Hello, GSAP Typewriter!'
  5. const display = ref('')
  6. onMounted(() => {
  7.   let i = 0
  8.   const interval = setInterval(() => {
  9.     if (i >= text.length) return clearInterval(interval)
  10.     display.value += text[i++]
  11.   }, 80)
  12. })
  13. </script>
  14. <template>
  15.   <div class="text-lg font-mono">{{ display }}</div>
  16. </template>
复制代码

四、拓展功能实现

1. ScrollTrigger 动态吸顶动效组件

  1. <script setup>
  2. import { onMounted, ref } from 'vue'
  3. import gsap from 'gsap'
  4. import ScrollTrigger from 'gsap/ScrollTrigger'
  5. gsap.registerPlugin(ScrollTrigger)
  6. const bar = ref(null)
  7. onMounted(() => {
  8.   gsap.to(bar.value, {
  9.     scrollTrigger: {
  10.       trigger: bar.value,
  11.       start: 'top top',
  12.       toggleClass: 'fixed-bar',
  13.       pin: true,
  14.       pinSpacing: false,
  15.     },
  16.   })
  17. })
  18. </script>
  19. <template>
  20.   <div ref="bar" class="w-full bg-orange-400 p-3 text-white">
  21.     我是吸顶条
  22.   </div>
  23. </template>
  24. <style>
  25. .fixed-bar {
  26.   position: fixed;
  27.   top: 0;
  28.   left: 0;
  29.   right: 0;
  30. }
  31. </style>
复制代码
2. 卡片 Flip 动画:布局变化动画

  1. <script setup>
  2. import { ref, watchEffect, nextTick } from 'vue'
  3. import gsap from 'gsap'
  4. import Flip from 'gsap/Flip'
  5. gsap.registerPlugin(Flip)
  6. const cards = ref(['A', 'B', 'C'])
  7. function shuffle() {
  8.   const state = Flip.getState('.flip-card')
  9.   cards.value.reverse()
  10.   nextTick(() => {
  11.     Flip.from(state, { duration: 0.6, ease: 'power1.inOut', absolute: true })
  12.   })
  13. }
  14. </script>
  15. <template>
  16.   <div class="flex gap-4 mb-4">
  17.     <div v-for="c in cards" :key="c" class="flip-card w-16 h-16 bg-purple-300 text-white text-center leading-[4rem]">
  18.       {{ c }}
  19.     </div>
  20.   </div>
  21.   <button @click="shuffle" class="bg-purple-600 text-white px-3 py-1 rounded">打乱</button>
  22. </template>
复制代码
3. 路由转场动画(带 Timeline)

  1. <script setup>
  2. import { onMounted, watch } from 'vue'
  3. import { useRoute } from 'vue-router'
  4. import gsap from 'gsap'
  5. const route = useRoute()
  6. watch(() => route.fullPath, () => {
  7.   gsap.fromTo('main',
  8.     { opacity: 0, y: 20 },
  9.     { opacity: 1, y: 0, duration: 0.5 })
  10. })
  11. </script>
  12. <template>
  13.   <main class="transition-wrapper">
  14.     <router-view></router-view>
  15.   </main>
  16. </template>
复制代码

五、总结

我们基于 Vue 3 + GSAP 构建了一个动效组件库,包罗:


  • 核心动效组件(入场、滚动、拖拽、打字)
  • 高级动效实现(吸顶、Flip、Timeline)
  • 拓展功能以完备代码嵌入文章

   到这里,这篇文章就和大家说再见啦!我的主页里还藏着许多 篇 前端 实战干货,感兴趣的话可以点击头像看看,说不定能找到你须要的解决方案~
创作这篇内容花了许多的功夫。如果它帮你解决了问题,大概带来了开导,欢迎:
点个赞❤️ 让更多人看到优质内容
关注「前端极客探险家」🚀 每周解锁新本领
收藏文章⭐️ 方便随时查阅
📢 特别提示:
转载请注明原文链接,贸易合作请私信接洽
感谢你的阅读!我们下篇文章再见~ 💕
  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表