translate3d,别只把它当一行CSS,我从一个生日页面里学到的3D动效真相

admin

translate3d 不是“性能神药”,也不是“高级动效”的通行证,它只是 CSS transform 里的一个三维平移函数,写起来很简单,用起来很顺手,但真正决定一个页面好不好用的,还是你有没有想清楚“为什么要动、动给谁看、动完以后用户能不能顺利完成任务”。

我第一次认真用 translate3d,是给朋友做一个生日祝福页面,那会儿我想得特别美:打开页面,一张卡片从屏幕右侧滑进来,稍微带一点纵深,再配上一句“生日快乐”,最好还有几颗星星从远处飘到近处,听起来是不是挺像那么回事?我当时脑子里已经有画面了,于是很自然地写下了类似这样的代码:

.card {
  transform: translate3d(60px, 0, 0);
  transition: transform 0.6s ease;
}
.card.show {
  transform: translate3d(0, 0, 0);
}

translate3d 接收三个方向的位移:x 轴、y 轴和 z 轴,前两个可以理解成左右和上下,z 轴则是“离你更近还是更远”,和普通的 translate 相比,translate3d 多了一个纵深维度,也常被前端同学拿来触发浏览器的合成层处理,很多人一看到“3D”“GPU 加速”这些词,就会下意识觉得它一定更流畅,我当年也这么想,直到我在朋友那台旧手机上打开页面,发现卡片确实滑进来了,但页面里同时动的东西太多,滚动时反而有点发飘,电量掉得也让我心里一紧。

这件事给我的第一个提醒是:translate3d 能帮你做位移,但它不会自动帮你做取舍,一个页面里如果十几张卡片、五六个光晕、三层背景都在各自 translate3d,浏览器要维护的合成层和绘制任务就会变多,你以为自己是在“优化性能”,实际上可能是在给设备增加负担,后来我把星星动画删掉一半,把背景视差改成只在桌面端开启,移动端只保留卡片滑入,页面立刻稳了很多,用户根本不会关心你用了几个 3D 函数,他们只会觉得“这个页面挺顺”或者“怎么有点卡”。

第二个生活实例,是帮楼下小店做一个产品展示页,店主想要那种“鼠标放上去,商品卡片会轻轻翻起来”的效果,我一开始用 hover 配合 translate3d 和 rotate3d 做得很开心,在电脑上测试时确实挺有质感:卡片向前推一点,阴影拉开,像从桌面上被拿起来,但问题来了,店主的很多顾客是用手机打开的,手机上没有鼠标 hover,卡片动效等于白做;还有一位顾客开了系统的“减少动态效果”,页面却仍然自顾自地旋转,体验就不太友好。

那次之后,我改成了点击触发,并且加了 prefers-reduced-motion 的媒体查询,动效不是不能做,而是要给人留退路,translate3d 很适合做这种“轻微抬起”的层次感,比如从 translate3d(0, 0, 0) 到 translate3d(0, -6px, 0),再加一点阴影变化,信息层级就出来了,但如果为了炫技让整个页面天旋地转,那就不是设计,是干扰,小店页面最后没有用特别夸张的 3D 翻转,只是让商品图轻轻上浮、价格标签稍微靠前,店主反而说“看着贵了一点,但不晕”,这句话我记了很久。

还有一个很典型的例子,是我自己做文章封面时踩的坑,那会儿我想做滚动视差:封面图随着页面滚动慢慢移动,标题稍微快一点,营造空间感,用 translate3d 写起来不复杂,滚动事件里根据 scrollY 算一个位移值就行,但一开始我没做节流,也没考虑图片尺寸,结果在长文章里滚动到中段,风扇声都起来了,后来我把动画限制在封面区域内,用 requestAnimationFrame 控制更新节奏,把大图换成合适尺寸,并且只在进入视口时计算,效果反而更克制:封面像一扇窗,标题像贴在窗前的纸片,轻轻错开一点就够了。

所以我对 translate3d 的个人观点很明确:它是一个很好用的“位移工具”,不是“性能免死金牌”,你可以用它做卡片入场、层级抬升、轻量视差、3D 翻转的某个阶段,但不要因为写了 translate3d 就默认页面一定会丝滑,真正需要关注的是:动画是否服务于信息?是否只在必要时发生?移动端和低性能设备上是否还成立?有没有尊重用户的动态效果偏好?有没有在 DevTools 的 Performance 面板里看过实际表现,而不是只凭感觉?

如果你也在写前端,我的建议是:先把 translate3d 当成普通 transform 来理解,明确 x、y、z 三个值分别把你带向哪里;再把它当成一种有成本的视觉语言,少用一点,用准一点,一个 200 毫秒的轻微位移,往往比满屏乱飞更有高级感,毕竟用户来你的页面,不是为了参观你的 CSS 技巧展,而是为了读内容、买东西、找信息,或者给朋友送上一句生日快乐,动效做得再好,也只是让这件事更顺一点,而不是挡住这件事本身,translate3d 值得学,但更值得学会的是:什么时候不写它。

目录[+]