HTML5动画的缓动效果是指动画运动过程中速度不是匀速变化,而是根据预设的函数规律调整速度,让动效更符合真实物理运动规律,避免生硬的线性运动。实现缓动效果主要有CSS3和JavaScript两种主流方案,不同方案适配不同的动效场景。

缓动效果的基本原理
缓动函数的核心是描述动画进度和时间的关系,输入是归一化的时间进度(0到1之间),输出是对应的动画属性进度(同样0到1之间)。常见的缓动类型包括:
- ease-in:先慢后快,适合元素进入视口的动画
- ease-out:先快后慢,适合元素离开视口的动画
- ease-in-out:两端慢中间快,适合循环类动效
- linear:匀速运动,无缓动效果
CSS3实现缓动动画
CSS3的transition和animation属性原生支持缓动函数,是最简单的实现方式,适合简单的属性过渡动效。
使用transition实现缓动
通过transition-timing-function属性指定缓动函数,代码如下:
/* 定义基础样式 */
.box {
width: 100px;
height: 100px;
background-color: #4a90e2;
/* 设置过渡属性、时长、缓动函数 */
transition: transform 1s ease-out;
}
/* 触发动画的状态 */
.box:hover {
transform: translateX(300px);
}
使用animation自定义缓动
如果需要更复杂的缓动曲线,可以使用animation-timing-function配合贝塞尔曲线,代码如下:
/* 定义关键帧动画 */
@keyframes slide {
0% {
transform: translateX(0);
}
100% {
transform: translateX(300px);
}
}
.box {
width: 100px;
height: 100px;
background-color: #4a90e2;
/* 应用动画,使用自定义贝塞尔曲线作为缓动函数 */
animation: slide 1s cubic-bezier(0.25, 0.1, 0.25, 1) forwards;
}
JavaScript实现缓动动画
当需要动态控制动画逻辑、或者需要兼容不支持CSS3过渡的旧环境时,可以使用JavaScript配合requestAnimationFrame实现缓动效果。
基础缓动动画实现
先定义缓动函数,再在动画帧中计算属性值,代码如下:
// 定义easeOutCubic缓动函数
function easeOutCubic(t) {
return 1 - Math.pow(1 - t, 3);
}
// 动画参数
const box = document.querySelector('.box');
const startX = 0;
const endX = 300;
const duration = 1000; // 动画时长1秒
let startTime = null;
// 动画帧回调函数
function animate(currentTime) {
if (!startTime) {
startTime = currentTime;
}
// 计算归一化时间进度
const elapsed = currentTime - startTime;
const progress = Math.min(elapsed / duration, 1);
// 应用缓动函数计算当前位置
const easedProgress = easeOutCubic(progress);
const currentX = startX + (endX - startX) * easedProgress;
box.style.transform = `translateX(${currentX}px)`;
// 进度未满则继续下一帧
if (progress < 1) {
requestAnimationFrame(animate);
}
}
// 启动动画
requestAnimationFrame(animate);
常见缓动函数封装
可以封装常用的缓动函数方便复用,代码如下:
const easing = {
// 线性
linear: function(t) {
return t;
},
// 缓入
easeInQuad: function(t) {
return t * t;
},
// 缓出
easeOutQuad: function(t) {
return t * (2 - t);
},
// 缓入缓出
easeInOutQuad: function(t) {
return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}
};
缓动效果使用注意事项
- 避免过度使用复杂缓动,简单的缓动函数往往能达到更好的视觉效果
- 动画时长建议控制在300ms到1000ms之间,过短用户无法感知,过长会让页面显得拖沓
- 优先使用CSS3实现缓动,性能优于JavaScript实现,只有在需要复杂逻辑控制时才选择JS方案
- 自定义贝塞尔曲线时可以通过Chrome开发者工具的动画面板调试,找到最合适的曲线参数
缓动函数选择参考表
| 缓动类型 | 适用场景 | 视觉感受 |
|---|---|---|
| ease-in | 元素进入视口、展开菜单 | 开始缓慢,逐渐加速 |
| ease-out | 元素退出视口、弹窗关闭 | 开始快速,逐渐减速 |
| ease-in-out | 轮播图切换、循环动效 | 两端慢,中间快 |
| linear | 加载进度条、无限循环动效 | 匀速运动 |
HTML5动画缓动函数requestAnimationFrameCSS_transition动画性能优化修改时间:2026-06-21 22:15:17