GSAP中文文档 - CSS
GSAP (GreenSock Animation Platform) 能够动画化几乎所有与 CSS 相关的 DOM 元素属性。常见的动画属性包括变换、透明度和颜色。但实际上,GSAP 能够处理你提供的任何属性。虽然没有一个官方的属性列表(因为列表会太长),但如果你有疑问 - 试试吧!
CSS 属性
GSAP 可以动画化任何可动画化的 CSS 属性,以及许多使用 CSS 官方不支持动画化的属性。
连字符 CSS 属性
提示
需要注意的是,连字符名称会变成驼峰命名。所以不是 "font-size",而是使用 "fontSize"。"background-color" 将成为 "backgroundColor"。
javascript
// 一些示例属性。
gsap.to(element, {
backgroundColor: 'red', // background-color
fontSize: 12, // font-size
boxShadow: '0px 0px 20px 20px red', // 动画化复杂字符串
borderRadius: '50% 50%',
height: 'auto', // 在 auto 和 px 值之间动画化 🪄
})非动画化属性...
如果你定义了一个非动画化属性 - 比如 position: "absolute" 或 borderStyle: "solid" - GSAP 会立即为你应用这个属性。这些非可 tween 属性将在 tween 开始时设置(除了 display: "none",出于明显的原因,它将在 tween 结束时应用)。
什么是“非动画化属性”?
为了让一个属性可动画化,开始、结束和中间值必须有效。如果你在 rotation: 0 和 rotation: 360 之间动画化,中间有有效的数值。按照这个逻辑,你不能在两个不同的背景图像之间动画化,因为没有有效的 CSS 用于 一点那个图像和一点点那个图像。background-image 是一个二元属性,有或没有图像,没有中间动画化。
动画布局
一些其他“不可能的属性”是 布局 属性。这些对于普通 tween 来说太复杂了 - 但将由 GSAP 的 FLIP 插件 神奇地 处理。
变换
GSAP 提供了内置的变换别名,这些别名跨浏览器友好,比动画化 transform 字符串更高效、更可靠。
javascript
gsap.to(element, {
// 写出 transform 字符串 🔥
// transform: "translate(-50%,-50%)"
xPercent: -50,
yPercent: -50,
})在常规 CSS 中,你列出变换的顺序很重要,但 GSAP 总是以相同的顺序应用它们以保持一致性:平移(x, y, z),然后是 scale,然后是 rotationX,然后是 rotationY,然后是 skew,然后是 rotation(与 rotationZ 相同)。
深入探究 — 为何使用快速变换?
当你以字符串形式定义变换,比如 "transform: translateX(50px)",GSAP会将其应用到元素上,然后读取并解析浏览器创建的 matrix() 或 matrix3d()。这个过程是必要的,因为字符串可以包含任意数量或顺序的变换值,比如 "translateX(50px) rotate(40deg) scale(0.5,0.5) translateY(100px) rotate(30deg)"。这种方法涉及很多额外的工作。此外,根据 CSS 规范,操作顺序很重要,这可能会导致不熟悉 CSS 变换的人得到意外的结果。
当你使用简写属性定义,比如使用 x:50 而不是 "transform: translateX(50px)",GSAP 可以直接处理那个单一值,无需额外计算。简而言之,使用 GSAP 进行变换可以提供性能提升,优化速度,并提供直观一致的操作顺序。
我们强烈建议使用GSAP内置的变换别名,除非你特别需要非标准的操作顺序,这种情况很少见。
快速参考
以下是简短的变换和其他一些常用属性的列表。
| GSAP | 描述或等效 CSS |
|---|---|
| x: 100 | transform: translateX(100px) |
| y: 100 | transform: translateY(100px) |
| xPercent: 50 | transform: translateX(50%) |
| yPercent: 50 | transform: translateY(50%) |
| scale: 2 | transform: scale(2) |
| scaleX: 2 | transform: scaleX(2) |
| scaleY: 2 | transform: scaleY(2) |
| rotation: 90 | transform: rotate(90deg) |
| rotation: "1.25rad" | 使用弧度 - 无 CSS 替代品 |
| skew: 30 | transform: skew(30deg) |
| skewX: 30 | transform: skewX(30deg) |
| skewY: "1.23rad" | 使用弧度 - 无 CSS 替代品 |
| transformOrigin: "center 40%" | transform-origin: center 40% |
| opacity: 0 | 调整元素的透明度 |
| autoAlpha: 0 | 透明度的简写 & 可见性 |
| duration: 1 | animation-duration: 1s |
| repeat: -1 | animation-iteration-count: infinite |
| repeat: 2 | animation-iteration-count: 2 |
| delay: 2 | animation-delay: 2 |
| yoyo: true | animation-direction: alternate |
关于变换的注意事项
- 要进行基于百分比的平移,使用
xPercent和yPercent而不是通常基于像素的x或y。这允许你将 px 单位和平百分比变换结合起来使用。 - 你可以使用
scale作为一个快捷方式,来相同地控制scaleX和scaleY属性。 - 你可以定义相对值,比如
rotation: "+=30"。 - 你声明变换属性的顺序没有影响。
- GSAP 与浏览器中元素的渲染质量无关。有些浏览器似乎能很好地渲染变换后的元素,而有些则在抗锯齿处理上表现不佳。
- 基于百分比的 x/y 平移也适用于 SVG 元素。
复杂字符串
GSAP 可以动画化复杂的值,如 boxShadow: "0px 0px 20px 20px red", borderRadius: "50% 50%", 和 border: "5px solid rgb(0,255,0)"。在必要时,它会尝试计算属性是否需要供应商前缀,并相应地应用它。
单位
GSAP 对单位有合理的默认值。如果你想设置 x 属性,你可以说 x: 24 而不是 x: "24px",因为 GSAP 使用像素作为 x 的默认单位。如果你想指定一个特定的单位,你可以在末尾追加单位值,并用字符串包裹值。
javascript
gsap.to(HTMLelement, {
rotation: 360 // 默认 deg
rotation: "1.25rad" // 使用弧度代替
x: 24 // 使用 px
x: "20vw" // 使用视口宽度代替
});提示
如果当前使用的测量单位与当前的一个不匹配,GSAP 会为你转换它们。例如,将元素的宽度从 "50%" 动画化到 "200px"。
3D 变换
你可以在所有现代浏览器中动画化 3D 属性,如 rotationX, rotationY, rotationZ(与常规 rotation 相同), z, perspective, 和 transformPerspective(查看 Can I Use 了解浏览器对 3D 变换的支持详情)。你可以直观地一起动画化 3D 变换属性和 2D 属性:
javascript
gsap.to(element, {
duration: 2,
rotationX: 45,
scaleX: 0.8,
z: -300,
})警告
为了让你元素具有真正的 3D 视觉透视效果,你必须设置父元素的 perspective 属性,或者设置元素本身的 special transformPerspective
transformPerspective 就像在 CSS transform 样式中直接添加 perspective(),比如:transform: perspective(500px) rotateX(45deg) 这只应用于特定元素。常见值范围从大约 200 到 1000,数字越低,透视失真越强。如果你想让一组元素共享一个共同的透视(相同的消失点),你应该在那些元素的父/容器上设置常规 perspective 属性。
javascript
// 对父元素(容器)应用透视,使透视应用于所有子元素(通常是最好的)
gsap.set(container, { perspective: 500 });
// 或者使用 "transformPerspective" 应用单个元素的透视
gsap.set(element, { transformPerspective: 500 });
//sample css:
.myClass {
transform: translate3d(10px, 0px, -200px) rotateY(45deg) scale(1.5, 1.5);
}
//对应的 GSAP 变换(2 秒内动画化):
gsap.to(element, {
duration: 2,
scale: 1.5,
rotationY: 45,
x: 10,
y: 0,
z: -200
});
//sample CSS 使用 perspective():
.myClass {
transform: perspective(500px) translateY(50px) rotate(120deg);
}
//对应的 GSAP 变换(设置,不动画化):
gsap.set(element, {
transformPerspective: 500,
rotation: 120,
y: 50
});有关透视的更多信息,请查看这篇文章。
关于3D变换的注意事项
在不支持3D变换的浏览器中,这些变换将被忽略。例如,rotationX可能不起作用,但rotation会。可以参考caniuse网站查看支持3D变换的浏览器版本分布情况。
所有变换都是缓存的,所以你可以在补间动画中只定义需要动画化的单独属性,而不必担心它们会丢失。你不需要在每个补间动画中定义所有的变换属性——只需定义你想要动画化的属性。你可以随时使用方法读取与变换相关的值(或任何属性)。如果你想清除这些值(包括应用于元素内联样式的变换),可以使用
clearProps: "transform"。如果你想强制GSAP重新从CSS解析变换数据(而不是使用之前补间动画记录的数据),可以在配置对象中传递parseTransform: true。GSAP与浏览器中元素的渲染质量无关。有些浏览器似乎能很好地渲染变换后的元素,而有些则在抗锯齿处理上表现不佳。
基于百分比的x/y平移也适用于SVG元素。
要了解更多关于CSS 3D变换的信息,可以参考这篇文章。
Opera mini不支持3D变换。
force3D
force3D 默认为 "auto" 模式,这意味着变换通过使用 translate3d() 而不是 translate() 自动优化以提高速度。这通常会导致浏览器将该元素放到自己的合成层上,使动画更新更高效。在 "auto" 模式下,GSAP 在 tween 完成时会自动切换回 2D(如果不需要 3D)以释放更多 GPU 内存。如果你想保持在 3D 模式,你可以设置 force3D: true。或者,尽可能保持在 2D 模式,设置 force3D: false。有关性能的更多详情,请参阅《神话破除 CSS 动画 vs JavaScript》。
transformOrigin
设置所有变换(2D 和/或 3D)发生的原点。默认情况下,它在元素的中心("50% 50%")。你可以使用关键词 "top", "left", "right", 或 "bottom" 定义值,或者你可以使用百分比(右下角是 "100% 100%")或像素。例如,如果你想让一个对象围绕其左上角旋转,你可以这样做:
javascript
//围绕元素的左上角旋转
gsap.to(element, {
duration: 2,
rotation: 360,
transformOrigin: 'left top',
})第一个值对应于 x 轴,第二个值对应于 y 轴,所以如果你想让对象围绕从左边缘正好 50px 和从顶部 20px 的偏移点变换,你可以这样做:
javascript
//围绕从左上角偏移 50px, 20px 的点旋转/缩放
gsap.to(element, {
duration: 2,
rotation: 270,
scale: 0.5,
transformOrigin: '50px 20px',
})这也适用于 SVG 元素!
你可以定义一个 transformOrigin 作为 3D 值 通过添加第三个数字,比如要围绕 y 轴从 400px 距离的点旋转,你可以这样做:
javascript
//围绕一个在 3D 空间中后退 400px 的点旋转,创造出有趣的效果:
gsap.to(element, {
duration: 2,
rotationY: 360,
transformOrigin: '50% 50% -400px',
})SVG
GSAP 确实使 transformOrigin 在 SVG 元素上跨浏览器一致工作。但请记住,SVG 元素根据规范并不官方支持 3D 变换。
SVG
svgOrigin
仅适用于 SVG 元素 与 transformOrigin 完全相同,但它使用 SVG 的全局坐标空间而不是元素的局部坐标空间。这在例如你想让一堆 SVG 元素围绕一个共同点旋转时非常有用。你可以定义一个 svgOrigin 或一个 transformOrigin,不能同时定义两者(显而易见的原因)。所以如果你想旋转 svgElement 就好像它的原点在 SVG 画布的全局坐标 x: 250, y: 100,你可以这样做:gsap.to(svgElement, {duration: 1, rotation: 270, svgOrigin: "250 100"})。单位不是必需的。它还在 data-svg-origin 属性中记录了值,以便可以重新解析。svgOrigin 不支持基于百分比的值。
smoothOrigin
仅适用于 SVG 元素 当改变 SVG 元素的 transformOrigin(或 svgOrigin)时,CSSPlugin 现在会自动记录/应用一些偏移量,以确保元素不会“跳跃”。你可以通过设置 CSSPlugin.defaultSmoothOrigin = false 来禁用此功能,或者你可以在每个 tween 基础上使用 smoothOrigin: true 或 smoothOrigin: false 控制。
深度解析 - 为什么使用简写变换?
在浏览器中(以及根据官方规范),变换和变换原点(transform-origins)的工作方式是,改变原点会导致元素以一种突兀的方式跳跃。例如,如果当变换原点在元素的左上角时,你旋转180度,它最终的位置会与围绕其右下角旋转相同角度时的位置大不相同。由于GSAP专注于为动画师解决实际问题(他们中的大多数人更喜欢平滑地改变变换原点),GSAP中的smoothOrigin特性解决了这个问题。这也意味着,如果你在像Adobe Flash这样的创作程序中创建SVG作品,可能不容易/明显地控制元素的原点在哪里,当你通过GSAP定义transformOrigin时,事情会“自然地工作”。目前,这个特性只适用于SVG元素,因为那里是它更常见的痛点。
简写变换的优势在于它们允许作者独立地指定简单变换,以一种映射到典型用户界面使用的方式,而不是必须记住transform中保持transform()、rotate()和scale()独立作用的顺序,并在屏幕坐标中执行。这意味着,无论你如何编写它们,这些新属性都会以直观的顺序应用,而不考虑你编写它们的顺序。此外,当你使用CSS转换或动画时,这种优势尤为明显,因为我们通常只想动画化变换的一个方面。使用简写属性,可以减少代码的重复,并且由于它们默认为0,可以完全省略起始属性,这为我们的动画提供了一个清晰、明确的定义。
方向旋转
Tweens 旋转 CSS 属性在特定方向,可以是 顺时针("_cw" 后缀),逆时针("_ccw" 后缀),或 最短方向("_short" 后缀),在这种情况下,插件为你选择方向,基于最短路径。例如,如果元素的旋转目前是 170 度,你想要 tween 它到 -170 度,一个正常的旋转 tween 将总共在逆时针方向上旅行 340 度,但如果你使用 _short 后缀,它将在顺时针方向上旅行 20 度。示例:
javascript
gsap.to(element, {
duration: 2,
rotation: '-170_short',
})
//甚至可以在 3D 旋转上使用它,并使用相对前缀:
gsap.to(element, {
duration: 2,
rotation: '-170_short',
rotationX: '-=30_cw',
rotationY: '1.5rad_ccw',
})注意,值在引号内,因此是一个带有特定后缀指示方向的字符串(_cw, _ccw, 或 _short)。你也可以使用 "+=" 或 "-=" 前缀来表示相对值。方向旋转后缀在所有旋转属性(rotation, rotationX, 和 rotationY)中都受支持;你不需要使用 directionalRotation 作为属性名称。有一个 DirectionalRotationPlugin,你可以用它来动画化不是 DOM 元素的对象,但如果
你只是用 CSSPlugin 动画化 CSS 相关属性,就没有必要加载那个插件,因为它已经包含了 DirectionalRotationPlugin 的功能。在这里查看一个交互式示例。
autoAlpha
与 opacity 相同,除了当值达到 0 时,visibility 属性将被设置为 hidden 以提高浏览器渲染性能,并防止点击/与目标交互。当值不是 0 时,visibility 将被设置为 inherit。它不被设置为 visible 以尊重继承(想象父元素被隐藏 - 明确地将子元素设置为可见将导致它出现,这可能不是预期的)。为了方便,如果元素的 visibility 最初设置为 hidden 且 opacity 是 1,它将假设 opacity 也应该从 0 开始。这使得在你的页面上使事物不可见(设置你的 CSS visibility: hidden)然后当你想要的时候淡入它们变得简单。
javascript
// 淡出并将 visibility 设置为 hidden
gsap.to(element, {
duration: 2,
autoAlpha: 0,
})
// 在 2 秒内淡回,并将 visibility 设置为 visible
gsap.to(element, { duration: 2, autoAlpha: 1, delay: 2 })CSS 变量
GSAP 可以在支持它们的浏览器中动画化 CSS 变量。
clearProps
你可以在 clearProps 中输入一个逗号分隔的属性名称列表,这些属性你希望在 tween 完成时从元素的 style 属性中清除(或使用 "all" 或 true 清除所有属性)。这在例如你有一个类(或一些其他选择器)应该在 tween 结束时应用某些样式到元素,否则会被 element.style-特定的数据覆盖的情况下很有用。通常你不需要包括供应商前缀。clearProps 还清除了受 GSAP 影响的 SVG 元素的 "transform" 属性,因为 GSAP 总是通过 transform 属性 应用变换(像 x, y, rotation, scale 等)以避免浏览器错误/怪癖。清除任何与 transform 相关的属性(像 x, y, scale, rotation 等)将清除整个 transform,因为它们全部合并为一个 "transform" CSS 属性。
javascript
// tweens 3 个属性,然后仅清除 "left" 和 "transform"(因为 "scale" 影响 "transform" css 属性。CSSPlugin 自动应用必要的供应商前缀)
gsap.from(element, {
duration: 5,
scale: 0,
left: 200,
backgroundColor: 'red',
clearProps: 'scale,left', // 注意:"scale"(或任何与 transform 相关的属性)清除所有变换
})autoRound
默认情况下,CSSPlugin 会在 tween(中间值)期间将像素值和 zIndex 四舍五入到最接近的整数,因为这可以提高浏览器性能,但如果你宁愿禁用这种行为,可以在 CSS 对象中传递 autoRound: false。你仍然可以使用 SnapPlugin 手动定义你想要四舍五入的属性。
如果你需要动画化数字属性(而不是 CSS 相关属性),你可以使用 AttrPlugin。要替换 DOM 元素中的文本,请使用 TextPlugin。
试试你学到的东西!
常见问题解答
我如何将这个包含在我的项目中?
只需加载 GSAP 的核心 - CSSPlugin 自动包含!
我需要在 tweens 中使用 css: 包装器吗?
不需要。这在 GSAP 最初创建时是必需的,但由于动画化 DOM 元素的频率,GSAP 移除了动画化 CSS 属性的需要。


