- 作者:老汪软件技巧
- 发表时间:2024-09-09 10:01
- 浏览量:
GSAP 动画从性能到核心概念性能差的属性
先来说一下做动画性能比较差的属性。
这是用写动画能丝滑的前提,因为 CPU 密集型 CSS 属性(重点点名 filter),用了它就容易有性能问题,浏览器渲染起来会占用大量 CPU,所以我们应该在写完项目后测试动画性能。
filter:blur(5px),filter:backdrop-filter:blur(5px),这个数值越大越容易引起卡顿。
同理,其它 css 属性比如 boxShadow 计算复杂的渐变也会造成性能问题。
性能好的属性
说了性能较差的属性,那有没有性能好的属性呢?当然 css 也有好的性能属性。
如果可能,请对动画使用 transforms 和 opacity,而不是 “top”、“left” 或 “margin” 等布局属性,它有如下好处:
硬件加速:浏览器通常会对 transform 和 opacity 属性进行优化,利用 GPU (图形处理单元) 来提高动画性能。这意味着动画可以更加流畅,尤其是在移动设备上。重绘与回流:修改 top、left 或 margin 会导致浏览器重新计算布局(回流)和重绘元素。而使用 transform 只会触发重绘,不会引起回流,因此动画性能更好。
gsap 支持简写,比如:
gsap.to('.box', {
transform: rotate(360deg) translateX(10px) translateY(50%)
})
可以简写成:
gsap.to('.box', {
{ rotation: 360, x: 10, yPercent: 50 }
})
下面是所有支持简写的属性,左边是简写,右边是完整写法:
动画的偏移量
我们知道了使用 transform 会更丝滑,那么如何合理地设置 transform 补间动画的偏移量呢?偏移量多一点和少一点如何抉择?
我们先看一下偏移量多点的例子,这是 100 的偏移量:
再看一下偏移量少一点的例子,这是 20 的偏移量:
可以看出当模块大的时候,偏移量多一点,动画会更有冲击力和动态感的效果。
同理模块小的时候,偏移量少一点,动画会显得简洁和专业,这里就不举例了。
当然这个结果也不总是对,有时候用 xPercent 和 yPercent 来设置百分比偏移量更合适,还要考虑实际开发因素。
动画的时间
除了补间动画,我们还知道 GSAP(以时间轴为维度的补间动画) 还有一个概念是时间轴,那我们怎么合理设置动画的时间呢?
下面是 GSAP 关于时间的属性:
这里举例常用的 ease、duration、stagger、。
我们先说第一个 ease,ease 就是我们熟知的动画曲线,官网贴心的提供了一个可视化设置动画曲线的地方。
ease 最常用的值是 power1.out、power1.out、power1.out。
ease: "power1.out": 开始快,结束慢,就像一个滚动的球慢慢停止,默认值。
ease: "power1.in":开始慢,结束快,就像一个重物下落。
ease: "power1.inOut":开始慢,结束慢,就像汽车加速和减速一样。
像 power1.out 这样的动画曲线最适合 UI 过渡;它们启动速度很快,这有助于 UI 感觉响应迅速,然后在结束时缓和,从而产生自然的摩擦感。
再说第二个属性duration,也就是动画持续时间。
duration 默认时间是 0.5s,需要注意的是 duration 太短 ease 的效果不是很明显。
当 duration 为 0s 时候相当于 gsap.set
最后一个属性是 stagger,它表示一个错位时间,是一个十分有用的属性,在多个相同的模块做相同的动画的时候(比如下面的例子其实是 querySelectAll(.box) 然后都加上动画),我们可以使用 stagger 来设置错位时间,来让动画依次执行有错落有致的感觉。如下面的例子:
gsap.to('.box', {
{y: 10, stagger:0.1 }
})
GSAP ScrollTrigger 插件
GSAP 三个重要的点,一个是补间动画,一个是动画时间,还有一个就是强大的插件,ScrollTrigger 就是最有用插件之一,用于做滚动动画。
我们先看一下写法:
import { ScrollTrigger } from 'gsap/dist/ScrollTrigger'
import { gsap } from 'gsap'
import { useGSAP } from '@gsap/react'
gsap.registerPlugin(ScrollTrigger, useGSAP)
let tl = gsap.timeline({
scrollTrigger: {
trigger: '.container',
pin: true,
start: 'top top',
end: '+=500',
scrub: 1
}
})
tl.addLabel('start')
tl.from('.box p', { scale: 0.3, rotation: 45 })
tl.from('.box', { backgroundColor: '#28a92b' })
首先是 ScrollTrigger 的注册,然后是 gsap.timeline 的创建,最后是 ScrollTrigger 的配置,配置项有:
属性名作用
trigger
触发器元素,值是一个元素的类或者引用
pin
把元素钉在页面,原理是给元素加一个父级,并加上padding,这个padding的值为end的值
start
ScrollTrigger 的起始滚动位置,可以百分比也可以top center bootom,第一个值是触发器元素的值,第二个值是屏幕的值,两个值在页面重叠时触发动画
end
ScrollTrigger 的结束滚动位置,可以是一个数值+=500,也可以同上,重叠时结束动画
scrub
将动画的进度直接链接到滚动条,可以设置为boolean或者number,设置为true或者1可以让动画更加丝滑
addLabel
在时间轴上打上标识,后面可以根据这个标识来决定后续动画的触发时机