做网页动画时,transition 是个好帮手。但一上线,发现有些用户看到的效果不对劲,甚至完全没动画——大概率是兼容性问题在作祟。
IE 8 和 9 根本不认 transition
老系统上跑着 IE8、IE9?那基本可以放弃用原生 CSS transition 了。这两个版本压根不支持这个属性。如果你的公司还有内部系统必须兼容老浏览器,别指望 transition 能起作用,得靠 JS 来模拟动画效果。
带前缀的浏览器曾是常态
几年前,不是所有浏览器都统一标准。Firefox 曾经要用 -moz- 前缀,Chrome 和 Safari 早期版本依赖 -webkit-。虽然现在新版浏览器基本都去前缀了,但如果你的用户还在用旧版 Chrome(比如某些锁定版本的企业环境),只写 transition: all 0.3s 可能会失效。
稳妥的做法是把常见前缀都写上:
<style>
.button {
-webkit-transition: all 0.3s;
-moz-transition: all 0.3s;
-ms-transition: all 0.3s;
-o-transition: all 0.3s;
transition: all 0.3s;
}
</style>
移动端也有意外
你以为手机端没问题?某些国产定制 Android 系统里的“全家桶”浏览器,内核更新慢,对 CSS3 支持残缺。比如 transition 搭配 transform 使用时,可能卡顿或直接跳过动画。这时候加一句 -webkit-transform: translateZ(0) 反而能触发硬件加速,让动画顺滑起来。
属性值不是都能过渡
transition 并非万能。像 display: none 到 block 这种切换,没法做渐变。visibility 虽然能过渡,但它是突然生效的,中间没有过程。正确做法是结合 opacity 和 height 控制显隐,这样 transition 才能起作用。
<style>
.fade-box {
opacity: 0;
height: 0;
overflow: hidden;
transition: opacity 0.3s, height 0.3s;
}
.fade-box.show {
opacity: 1;
height: auto;
}
</style>
别忽略低性能设备
公司发的旧款笔记本,或者爸妈用的入门级安卓机,GPU 性能弱。复杂的 transition 动画在这些设备上容易掉帧。建议避免同时过渡多个属性,尤其是 width、height 这类会触发重排的。优先用 transform 和 opacity,它们由合成层处理,更高效。
开发时不妨用手机热点连到测试页面,拿老手机亲自试试,比看文档更直观。