Published on

gsap 的基本使用

Authors

gsap 的基本使用

gsap 是一个动画库,不仅可以用在原生的js,也可以用于现在流行的前端框架;

目前最新的版本是 3.+ ; 下面的🌰也是基于3.+的 ;

好奇代码翻译

gsap 速查表

快速开始

安装

推荐使用 npm 包导入方式

npm i gsap
import gsap from 'gsap'

cdn 引入方式,如需要使用gsap的插件(),需要额外导入且注册 gsap cdn

<script src="https://cdn.bootcdn.net/ajax/libs/gsap/3.11.5/gsap.js"></script>

实现一个简单的demo

gsap.to('.grey', {
  duration: 3,
  x: 300,
})
gsap.to(dom, 状态对象)

dom : 元素节点,可以是一个也可以是多个;可以传 .dom , 也可以 document.querySelectorAll('.dom')

状态对象,描述动画的状态(delay, duration, repeat, 回调事件 ... 后面会详细说道)

  • gsap.to() 常用,元素从当前位置到目标位置
  • gsap.from() 目标位置到初始位置
  • gsap.fromTo() 需要定义两个状态的数据,从xx 到 xx
  • gsap.set() 直接设置成想要的状态

动画状态

属性作用
duration动画时长,默认 .5
delay延时,默认 .5
repeat重复次数
yoyo一直重复(a->b->b->a), 默认 false(a -> b , a -> b)
ease动画运动轨迹
stagger多个动画时交错
paused暂停动画 默认 false

(运动轨迹详情)[https://greensock.com/docs/v3/Eases]

运动方式

属性css
x: 100transform: translateX(100px)
y: 100transform: translateY(100px)
rotation: 360transform: rotate(360deg)
rotationX: 360transform: rotateX(360deg)
rotationY: 360transform: rotateY(360deg)
skewX: 45transform: skewX(45deg)
skewY: 45transform: skewY(45deg)
scale: 2transform: scale(2, 2)
scaleX: 2transform: scaleX(2)
scaleY: 2transform: scaleY(2)
xPercent: -50transform: translateX(-50%)
yPercent: -50transform: translateY(-50%)
width: 100width: 100px
height: '10vh'height: 10vh

我还能制作什么动画?

几乎所有的属性

css 中的 color / backgroundColor / border / fontSize ... ; 需要注意的是 需要采用小驼峰的写法

SVG 也支持 width height fill strokecx opacity viewBox attr

v1-blogs-showcase.webm

时间线

ScrollTrigger

滚动触发动画,常用于滚动到xxx地方 触发动画

import { gsap } from 'gsap'
import { ScrollTrigger } from 'gsap/ScrollTrigger'
gsap.registerPlugin(ScrollTrigger)
gsap.to('.box', {
  scrollTrigger: {
    trigger: '.box', // box元素进入视口时触发
    /*
     markers: 开发期间标记,显示动画滚动开始结束的位置,,markers: true 默认值: {startColor: "green", endColor: "red", fontSize: "16px", fontWeigth: "normal", indent: 0} 可自定义其样式。
    */
    markers: { startColor: 'green', endColor: 'red', fontSize: '12px' },
    start: 'top 30%', // 动画开始位置,滚动到距视口顶部30%
    end: 'top 20%', // 动画结束位置,滚动到距视口顶部20%
    // pin: true, // 在动画区域内,这个元素的位置固定不动,会在底部添加padding
    // pinSpacing: false, // pin的元素不在底部添加padding
    /* 
    scrub: Boolean | Number 
     将动画的进度直接链接到滚动条上
    */
    scrub: true,

    onEnter: () => {
      console.log('滚动到start位置触发')
    },
    onEnterBack: () => {
      console.log('滚动超过end位置,再进入滚动区域触发')
    },
    onLeave: () => {
      console.log('滚出end位置时触发')
    },
    onLeaveBack: () => {
      console.log('滚出end位置,再滚回来超过start位置触发')
    },
    onUpdate: (self) => {
      // 在start和end区域内滚动位置改变时触发
      console.log(self)
    },
    /*
    toggleAction: onEnter onLeave onBackEnter onBackLeave
    在onEnter onLeave onBackEnter onBackLeave这四个位置的动画的方式
    默认是: play none none none
    可以使用的关键字有: play(播放), pause(暂停), resume(恢复), reset(重置), restart(重新开始), complete(完成), reverse(倒退), none(无).
     */
    toggleAction: 'play pause resume reset',
    /* 
    toggleClass: String | Object 
    */
    toggleClass: { targets: '.box', className: 'box-pink' },
  },
  x: 100, // normal value
  /**
   * 可以通过函数获取值
   * @param {*} index :跟.box数量有关,如box有两个,index 分别为 0 1
   * @param {*} target : .box类的元素
   * @param {*} targets : 数组
   * @returns
   */
  y: function (index, target, targets) {
    //function-based value
    return index * 50
  },
})

stagger 交错

举个栗子