气泡浮动动画核心是@keyframes配合transform: translatey()实现,需设position:absolute/relative、容器overflow:hidden、气泡加pointer-events:none及radial-gradient替代box-shadow以保性能。

气泡浮动动画的核心是 @keyframes + transform: translateY()
纯 CSS 实现气泡上升,本质不是“让元素自己动”,而是用动画控制它在垂直方向的位置变化。关键点在于:必须给气泡设置 position: absolute 或 relative,否则 transform 在某些布局中会失效或触发意外重排。
常见错误是直接对 div 用 top 动画——这会频繁触发 layout,性能差;而 transform: translateY() 只影响合成层,GPU 加速更稳。
- 气泡容器(比如
.bubble-container)需设position: relative或overflow: hidden,防止气泡飞出视区 - 每个气泡元素建议加
will-change: transform(仅当数量多、帧率掉时启用) - 动画时长建议在
3s–6s之间,太短显突兀,太长看不出浮动感
如何让多个气泡随机上升?用 nth-child + 不同 animation-delay 和 animation-duration
真实气泡不会整齐划一地同时出发。靠 CSS 伪类批量生成差异,比 JS 创建 DOM 更轻量,也更适合静态页面。
示例片段:
.bubble {
position: absolute;
width: 12px;
height: 12px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.7);
animation: floatUp 4s ease-in infinite;
}
.bubble:nth-child(1) { animation-delay: 0s; animation-duration: 3.8s; }
.bubble:nth-child(2) { animation-delay: 0.7s; animation-duration: 4.5s; }
.bubble:nth-child(3) { animation-delay: 1.2s; animation-duration: 3.2s; }
@keyframes floatUp {
0% { transform: translateY(100px) scale(0.8); opacity: 0.6; }
100% { transform: translateY(-100px) scale(1.2); opacity: 0; }
}
- 注意
opacity: 0放在终点,配合overflow: hidden容器,气泡“升出画布”时自然消失 - 用
scale()模拟气泡上浮时轻微膨胀,增强真实感;但别超1.3,否则边缘失真明显 - 如果气泡数量超过 10 个,建议用 SCSS 循环生成规则,避免手写 20 条
nth-child
移动端气泡飘不起来?检查 transform 兼容性和 pointer-events
iOS Safari 13.4+、Android Chrome 80+ 基本支持 transform 动画,但老版本可能跳帧甚至卡死。更隐蔽的问题是:气泡区域默认响应点击事件,干扰底层按钮或链接。
- 务必加
pointer-events: none到气泡元素上,避免遮挡交互 - 若仍卡顿,把
animation-timing-function改为cubic-bezier(0.33, 1, 0.68, 1)(即ease-out变体),减少末尾加速抖动 - 不要用
left/right配合transform做横向漂移——移动端 GPU 对复合变换优化弱,容易掉帧
用 radial-gradient 做半透明气泡,比 box-shadow 更省性能
很多教程用多层 box-shadow 模拟气泡光晕,但每加一层阴影,渲染成本线性上升。实际测试显示,3 层以上 box-shadow 在低端安卓机上会导致 10–15fps 下降。
更优解是单层 radial-gradient 背景:
.bubble {
width: 16px;
height: 16px;
background: radial-gradient(circle at 30% 30%, rgba(255,255,255,0.9), transparent 70%);
border-radius: 50%;
}
- 渐变中心偏移(
at 30% 30%)模拟高光位置,比居中更像真实气泡 - 透明度用
rgba()控制,避免和父容器背景色硬叠加导致发灰 - 慎用
filter: blur()做柔边——它强制全图重绘,气泡一多就卡
@keyframes 就以为结束了,其实 will-change、pointer-events、渐变定位这些细节,才是上线后不被用户吐槽的关键。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











