XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • leaflet改变坐标原点
  • 补间动画gsap与tween
    • 文字转语音mp3文件
    • JavaScript引入
    • JavaScript高级程序设计阅读笔记
    • Javascript函数参数按值传递传递
    • JS防抖和节流
    • 手写JS常用方法
    • 手写Promise
    • JS Event Loop
    • 重排和重绘
    • em、px、rem、vh、vw 区别
    • css也需要性能优化
    • 图解 js 原型链
    • js函数参数按值传递
    • BOM浏览器对象模型
    • DOM
    • 事件
    • js对象数组sort按需排序
    • 文件上传功能技术选型和前后端实现
    • 前端图片处理
    • 让你的JavaScript代码简单又高效
    • BEM:class命名规范
    • 前端规范-CSS属性那么多(杂),怎么排序
    • TypeScript Tips
    • jsx
    • canvas基础
    • 前端日志
    • 浏览器存储
    • CSS世界阅读笔记
    • CSS揭秘阅读笔记
    • js变量命名常用规范词
    • 你不知道的JavaScript阅读笔记
    • js对象的底层数据结构
    • js判断数据类型
    • JS浮点数精度问题和解决办法
    • js作用域
    • js堆栈溢出和内存泄漏
    • 浏览器是如何渲染页面的
    • 疑难杂症和踩坑问题合集
    • 免费在线API收集
    • 原生JS实现Ajax请求
    • cookie、session、localStorage、sessionStorage的区别
    • Sass与Less
    • arrayBuffer、blob、file对象
    • TypeScript基础
    • 前端
    XingYun
    2022-02-11
    目录

    补间动画gsap与tween

    # 一.GSAP 是什么

    GSAP 是一个十分强大的 动画脚本 ,可以实现大部分的动画需求。

    如果你想制作一款十分炫酷、复杂的动画,那么 GSAP 将是很好的选择,如果只是简单的动画,显然 animate 等可能会更适合。

    # 二、GSAP 制作动画

    # 1.下载导入

    
    npm i gsap
    
    import { gsap } from 'gsap'
    
    
    1
    2
    3
    4
    5

    # 2. gsap.to

    函数签名

    gsap.to(targets, second, options)

    将一个或多个元素 targets 在指定时间 second 内按一定的速率函数变化至某个指定的 options 状态

    可以理解为 ‘到哪里去’ 过程

    例 1: 操作变量

    <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.2.4/gsap.min.js"></script>
    
    <div id="animated-number-demo">
      <input v-model.number="number" type="number" step="20" />
      <p>{{ animatedNumber }}</p>
    </div>
    
    1
    2
    3
    4
    5
    6
    new Vue({
      el: '#animated-number-demo',
      data: {
        number: 0,
        tweenedNumber: 0
      },
      computed: {
        animatedNumber: function () {
          return this.tweenedNumber.toFixed(0)
        }
      },
      watch: {
        number: function (newValue) {
          gsap.to(this.$data, { duration: 0.5, tweenedNumber: newValue })
        }
      }
    })
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17

    效果:

    例 2: 操作 dom

    <h1 class="view">第一行文字</h1>
    <h2 class="view">第二行文字</h2>
    <h3 class="view">第三行文字</h3>
    
    <!-- 此处定义原状态: -->
    <style>
      .view {
        opacity: 0;
        transform: scale(0, 0);
      }
    </style>
    
    <script>
      gsap.to('.view', 0.3, {
        autoAlpha: 1, // autoAlpha 为 1 时元素可见,为 0 时元素 visibility: hidden; ,该选项性能优于 opacity 的变化
        scale: 1, // 缩放由 0 达到 1
        transformOrigin: 'center center', // 动画中心
        stagger: 0.1 // 当有多个元素时,可以交错 0.1 秒(如果只有一个元素,无需该项)
      })
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    目的:选择所有 .view 的元素,在 0.3 秒内达到相应的状态。

    效果:

    # gsap.from

    gsap.from 是 gsap.to 的逆过程

    上例中也可以用 gsap.from 实现

    gsap.from('.view', 0.3, {
      autoAlpha: 0,
      opacity: 0,
      scale: 0,
      transformOrigin: 'center center',
      stagger: 0.1
    })
    
    1
    2
    3
    4
    5
    6
    7

    更多用法可以看看 GSAP 官方文档 (opens new window)

    # 三、tween

    和 gasp.js 类似的还有 tween.js (opens new window)也很适合做动画

    这里用 Vue 官方文档的过渡组件例子来演示下

    补间动画组间

    // 任何整数都可以执行动画
    // 组件化使我们的界面十分清晰
    // 可以支持更多更复杂的动态过渡策略。
    Vue.component('animated-integer', {
      template: '<span>{{ tweeningValue }}</span>',
      props: {
        value: {
          type: Number,
          required: true
        }
      },
      data: function () {
        return {
          tweeningValue: 0
        }
      },
      watch: {
        value: function (newValue, oldValue) {
          this.tween(oldValue, newValue)
        }
      },
      mounted: function () {
        this.tween(0, this.value)
      },
      methods: {
        tween: function (startValue, endValue) {
          var vm = this
          function animate() {
            if (TWEEN.update()) {
              requestAnimationFrame(animate)
            }
          }
    
          new TWEEN.Tween({ tweeningValue: startValue })
            .to({ tweeningValue: endValue }, 500)
            .onUpdate(function () {
              vm.tweeningValue = this.tweeningValue.toFixed(0)
            })
            .start()
    
          animate()
        }
      }
    })
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44

    父组件

    <script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
    
    <div id="example-8">
      <input v-model.number="firstNumber" type="number" step="20" /> +
      <input v-model.number="secondNumber" type="number" step="20" /> = {{ result }}
      <p>
        <animated-integer v-bind:value="firstNumber"></animated-integer> +
        <animated-integer v-bind:value="secondNumber"></animated-integer> =
        <animated-integer v-bind:value="result"></animated-integer>
      </p>
    </div>
    
    <script>
      new Vue({
        el: '#example-8',
        data: {
          firstNumber: 20,
          secondNumber: 40
        },
        computed: {
          result: function () {
            return this.firstNumber + this.secondNumber
          }
        }
      })
    </script>
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

    效果:

    上次更新: 2023/04/05, 09:41:10
    leaflet改变坐标原点
    文字转语音mp3文件

    ← leaflet改变坐标原点 文字转语音mp3文件→

    最近更新
    01
    JavaScript-test
    07-20
    02
    二维码的原理
    07-20
    03
    利用ChatGPT优化代码
    07-20
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式