Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >gsap太硬核了,实现复杂的交互动画

gsap太硬核了,实现复杂的交互动画

作者头像
Maic
发布于 2023-09-11 05:20:08
发布于 2023-09-11 05:20:08
1.5K00
代码可运行
举报
文章被收录于专栏:Web技术学苑Web技术学苑
运行总次数:0
代码可运行

通常在C端交互上,产品与UI会在交互上提出一些比较炫酷的效果,面对视觉效果,通常来说,我们会借助第三方优秀的动画库来满足这些需求。通俗来说,就是我们并不是原生从0到1去实现,而是结合现有的库与框架帮我们高效的实现那些看似非常炫酷的效果。

今天介绍一个非常强大动画库,希望看完在业务中能带来一些思考和帮助

正文开始...

开始之前主要从以下几点介绍

  • 如何使用,开始一个最简单的gsap[1]
  • 连续动画如何实现
  • 如何暂停开启动画

registerEffect

现在有个需求,我想让一个动画按照顺序依次消失

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 <div id="app">
  <p class="text1">欢迎关注</p>
  <p class="text2">公众号:Web技术学苑</p>
  <p class="text3">好好学习,天天向上</p>
</div>
<script src="./lib/gsap-latest-beta.min.js"></script>

然后我们写一段简短的动画

  • 注册动画
  • 初始化时间线
  • 按照顺序调用自定义动画
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

// 注册一个动画名
gsap.registerEffect({
        name: "myFade",
        effect: (targets, config) => {
            return gsap.to(targets, {duration: config.duration, opacity: 0,repeat: -1});
        },
        defaults: {duration: 2},
        extendTimeline: true
 });
 // 初始化一个timeline时间线
 const timeline = gsap.timeline();
 // 调用动画
 timeline.myFade(".text1", {duration: 1}).myFade(".text2", {duration: 2}).myFade(".text3");

最终效果

从以上我们发现text1,text2,text3都依次执行了我们自定义注册的myFade方法,如果我想每组动画都一样,那么需要怎么办呢?

  • 首先定义一组数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

const gsapData = [
    {
        name: "setRed",
        props: { opacity: 0.5, x: 300, yoyo: true, repeat: -1 }
    },
    {
        name: "setBlue",
        animate: 'from', 
        props: { opacity: 0.25, x: 300, yoyo: true,  }
    },
    {
        name: "setGreen",
        animate: 'fromTo', 
        props: { opacity: 0.1, x: 300}, 
        props2: { opacity: 1, x: 600, yoyo: true, repeat: -1  }
    }
]
  • 注册多个动画
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

gsapData.forEach(v => {
  gsap.registerEffect({
      name: v.name,
      defaults: { duration: 1 },
      extendTimeline: true,
      effect(target, config) {
          if (config.animate === "from") {
              return gsap.from(target, {
                  ...v.props,
                  ...config
              })
          } else if (config.animate === 'fromTo') {
              return gsap.fromTo(target, {
                  ...v.props,
                  ...config
              }, {...config.props2})
          } else {
              return gsap.to(target, {
                  ...v.props,
                  ...config
              })
          }
      }
  })
})
  • 执行动画
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

 const timeline = gsap.timeline();
timeline.setRed(".text1", {duration: 3}).setBlue(".text2", {duration: 1}).setGreen(".text3", 1)

最后的效果

暂停/开始动画

如果我想暂停动画或者开始动画,那么我需要手动控制

对应的html结构

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

<div id="app">
  <p class="text1">欢迎关注</p>
  <p class="text2">公众号:Web技术学苑</p>
  <p class="text3">好好学习,天天向上</p>
  <button id="stop">暂停</button>
  <button id="play">播放</button>
  <button id="reset">重置</button>
</div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

const stopBtn = document.getElementById('stop');
const playBtn = document.getElementById('play');
const resetBtn = document.getElementById('reset');
...
const timeline = gsap.timeline();
timeline.setRed(".text1", {duration: 3}).setBlue(".text2", {duration: 1}).setGreen(".text3", 1);

stopBtn.addEventListener('click', () => {
    timeline.pause();
})
playBtn.addEventListener('click', () => {
    timeline.play();
})

resetBtn.addEventListener('click', () => {
    timeline.reverse();
})

只要你调用了pauseplayreverse三个方法就行

react中如何卸载动画

比如我们在react中写了这一段动画

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

useEffect(() => {
  const stopBtn = document.getElementById('stop');
  const playBtn = document.getElementById('play');
  const resetBtn = document.getElementById('reset');
  ...
  const timeline = gsap.timeline();
  timeline.setRed(".text1", {duration: 3}).setBlue(".text2", {duration: 1}).setGreen(".text3", 1);
})

初略一看好像并没有什么问题,但实际上当我们组件销毁的时候,我们需要重置这些动画

其实你只需要这样就行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

const ctx = gsap.context(() => {
  const stopBtn = document.getElementById('stop');
  const playBtn = document.getElementById('play');
  const resetBtn = document.getElementById('reset');
  ...
  const timeline = gsap.timeline();
  timeline.setRed(".text1", {duration: 3}).setBlue(".text2", {duration: 1}).setGreen(".text3", 1);
  return () => ctx.revert()
})

from and fromTo

在以上动画中我们有用到fromfromTo这两个执行动画

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

<div id="app">
  <p class="text">公众号:Web技术学苑</p>
</div>
<script src="./lib/gsap-latest-beta.min.js"></script>
<script>
    window.onload = function () {
        gsap.from(".text", {
            opacity: 0,
            y:100,
            duration: 1
        })
    }
</script>

上面这段动画意思就是从y100的位置,opacity0的状态持续时间1s钟开始执行

当我们使用fromTo时会是怎么样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

  <script>
  window.onload = function () {
      gsap.fromTo(".text", {
          opacity: 0
      }, {
      opacity: 1,
      duration: 2,
      delay: 1,
      x: 100,
      repeat:-1
    })
  }
</script>

从上面得知fromTo(className, start, end)其实是更加友好的控制动画的开始与结尾。

如果我们想手动控制动画执行呢

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

<div id="app">
  <p class="text">公众号:Web技术学苑</p>
  <button value="start" id="start"></button>
</div>
<script src="./lib/gsap-latest-beta.min.js"></script>
<script>
  window.onload = function () {
      const startDom = document.getElementById("start");
      let tween = gsap.fromTo(".text", {
          opacity: 0,
      }, {
          opacity: 1,
          duration: 2,
          delay: 1,
          x: 100,
          repeat:-1
      });
      tween.pause();
      startDom.addEventListener("click", () => {
          tween.seek(2);
          tween.progress(0.5);
          tween.play();
      })
  }
</script>

总结

  • 主要介绍了在gsap中比较常用的几个动画,如何使用registerEffect注册定义的动画,如何实现一个连续动画
  • 如何在react中卸载动画
  • 如何暂停一个动画,如何使用fromTofrom的动画
  • 本文示例code example[2]

参考资料

[1]gsap: https://greensock.com/docs/

[2]code example: https://github.com/maicFir/lessonNote/tree/master/javascript/23-gasp

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web技术学苑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
GSAP基础学习
Getting Started with GSAP - continued - Learning Center - GreenSock
心安事随
2024/07/29
1800
GSAP基础学习
使用GSAP创建惊艳的动画效果(一)
GSAP语法由三部分组成,分别是方法、目标和变量,其调用格式为gsap.to( “.box” ,{ x:200 })各部分含义如下图所示:
九仞山
2023/10/14
3.6K0
使用GSAP创建惊艳的动画效果(一)
使用GSAP库打造酷炫网页文字动画效果
GSAP,全称GreenSock Animation Platform,是一个高性能的JavaScript动画库。它可以让你在网页上轻松创建高效、流畅的动画效果。GSAP的优势在于它的简洁性、灵活性和强大的功能,可以兼容各种浏览器,并且有丰富的文档和示例。
前端达人
2024/06/27
4580
使用GSAP库打造酷炫网页文字动画效果
React 动画框架简介
由于 React 加持了虚拟 DOM 等诸多特性,所以在 React 上实现常规的动画效果有一些特别之处。本文不会深入探讨 React 对动画的处理逻辑,只会简单地演示如何使用 React 创建动画效果。 React 插件 React 官方提供了两个插件用于处理动画效果:一个是偏底层的 react-addons-transition-group,一个是在前者基础上进一步封装的 react-addons-css-transition-group。在使用它们之前,需要先检查下你使用的是哪种类型的 React 版
xiangzhihong
2018/01/26
1.4K0
23个项目管理经典案例_交互动画
注意: speed = (end - box.offsetLeft)/20; 代表用(终点位置-当前位置)/动画系数 动画系数可以控制动画的快慢
全栈程序员站长
2022/11/03
1.8K0
【程序员的浪漫】圣诞节到了,何不送给Ta一份程序员的浪漫
接下来是雪花❄,圣诞树🎄,新年💌和更好的我们 世上本无圣诞老人,所有的礼物都来自爱你的人 今天给大家带来几个好看的基于HTML+CSS(+JS)的圣诞树,希望圣诞节那天圣诞老爷爷能把我喜欢的你塞到我床上 雪花 和 樱花 以及 浪漫贺卡 我前两天刚做过,感兴趣的也可以看看我前两期的博客: 雪花:https://haiyong.blog.csdn.net/article/details/105786233 樱花:https://haiyong.blog.csdn.net/article/details/1220
海拥
2021/12/20
4.3K0
【程序员的浪漫】圣诞节到了,何不送给Ta一份程序员的浪漫
【H5游戏】红包雨 实现详解
之前总结了一个用pixi 实现的人物换装游戏,没看过的可以看 PIXI 实现人物换装 今天继续总结用 pixi 实现一个 红包雨 H5 游戏,可以来体验下
神仙朱
2021/11/30
3K1
【H5游戏】红包雨 实现详解
超强的苹果官网滚动文字特效实现
每年的苹果新产品发布,其官网都会配套更新相应的单页滚动产品介绍页。其中的动画特效都非常有意思,今年 iPhone 14 Pro 的介绍页不例外。
Sb_Coco
2022/10/31
2.3K0
Marp 教程:实现幻灯片的交互性
Marp 是一个基于 Markdown 的幻灯片制作工具,结合 VSCode 的强大编辑功能,可以让你的 PPT 制作过程变得更加高效和专业。虽然 Marp 本身不支持复杂的交互性,但通过嵌入 HTML 和 JavaScript,可以实现一些简单的交互效果。本教程将详细介绍如何在 Marp 中实现幻灯片的交互性。
码事漫谈
2024/12/20
1930
Marp 教程:实现幻灯片的交互性
前端模块化开发--React框架(一): 入门和面向组件编程
React中文官网 一、简介 1、特点 1)Declarative(声明式编码) 2)Component-Based(组件化编码) 3)Learn Once, Write Anywhere(支持客户端与服务器渲染) 4)高效 5)单向数据流 2、React高效的原因 1)虚拟(virtual)DOM, 不总是直接操作DOM 2)DOM Diff算法, 最小化页面重绘 3、相关的js核心库 1)react.js: React的核心库 2)react-dom.js: 提供操作DOM的react扩展库 3)bab
MiChong
2020/09/24
2.2K0
前端模块化开发--React框架(一): 入门和面向组件编程
css3动画如何解决动画的播放、暂停和重新开始
我们播放动画时,如要暂停动画,就要用到animation-play-state这个属性。animation-play-state属性有两个值:
小小咸鱼YwY
2020/06/19
1.6K0
后端小白的 Vue 入门笔记 —— 基础篇
出处:https://www.cnblogs.com/ZhuChangwu/p/11303521.html
IT技术小咖
2019/08/20
2.2K0
膜拜!用最少的代码却实现了最牛逼的滚动动画!
ScrollTrigger是基于GSAP实现的一款高性能页面滚动触发HTML元素动画的插件。
程序员老鱼
2022/11/27
3.2K0
膜拜!用最少的代码却实现了最牛逼的滚动动画!
Element: getAnimations() 精确拿捏动画时间
Element.getAnimations() 是一种用于获取与元素关联的所有动画(包括 CSS 动画和 Web 动画 API 动画)的方法。它返回一个包含 Animation 对象的数组。这些 Animation 对象表示元素当前正在运行或挂起的动画。
前端黑板报
2024/06/03
1760
Element: getAnimations() 精确拿捏动画时间
基于 HTML+CSS+JS 的纸牌记忆游戏
这节博客我们将使用 HTML、CSS 和 JavaScript 制作纸牌记忆游戏。
海拥
2022/04/13
2.8K0
基于 HTML+CSS+JS 的纸牌记忆游戏
膜拜!用最少的代码却实现了最牛逼的滚动动画!
ScrollTrigger是基于GSAP实现的一款高性能页面滚动触发HTML元素动画的插件。
程序员老鱼
2022/12/02
2.8K0
通过GASP让vue实现动态效果
单页应用及支持它们的前端框架提供了一个很好的机会,可以为程序设计提供令人惊叹的交互层,本文,我们将了解 vue.js 及如何集成 GASP 动画库来添加令人惊叹的动画效果。
icepy
2019/12/03
3.3K0
通过GASP让vue实现动态效果
JQuery分析及实现part6之动画模块功能及实现
JQuery模块分析及其实现第六部分动画部分功能及实现,接第五部分! 动画原理 根据人眼具有 0.1 秒的视觉残留,只有在一秒切换至少 24 个画面就会产生动画 动画的基本结构 function animate() { function render() { //动画 } window.setInterval(render, time); } 小动画案例 奔跑的小矩形 <html lang="en"> <head> <meta charset="UTF-8"> <title>奔跑吧矩形</ti
ihoey
2018/10/31
6620
Vue学习1:实例及生命周期
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Vue1</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <!--<link rel="stylesheet" type="text/css" href="main.css"/>
用户1149564
2018/05/28
4830
使用 Web Animations API 实现一个精确计时的时钟
在 JavaScript 中,当事情准时发生时,很自然地会想到使用计时器函数。 但是,当某件事由于其他事情依赖于它而在准确的时刻发生时,你很快就会发现计时器会存在一个不准时的问题。而本文所要介绍的 Web Animations API 可以在某些情况下替代计时器函数,同时保持精确。
前端修罗场
2022/12/17
1K0
使用 Web Animations API 实现一个精确计时的时钟
推荐阅读
相关推荐
GSAP基础学习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验