JavaScript实现动画的核心是随时间改变元素样式。1. 使用requestAnimationFrame可实现流畅动画,如让元素平滑移动;2. 通过递增opacity并结合requestAnimationFrame实现淡入效果;3. 结合CSS transition能简化逻辑,适合简单交互动画;4. 封装通用动画函数可复用,支持不同属性与持续时间。根据需求选择精细控制或简洁方案。

JavaScript 实现动画效果的核心是通过控制元素的样式属性,结合时间变化让视觉产生连续变化的“动”感。最常用、性能较好的方式是使用 requestAnimationFrame,它能根据屏幕刷新率优化渲染时机。
1. 使用 requestAnimationFrame 实现平滑动画
这个方法告诉浏览器你要执行动画,让浏览器在下一次重绘前调用指定函数。它比 setTimeout 或 setInterval 更流畅,且节省资源。
示例:让一个元素向右移动
const element = document.getElementById('box');
let position = 0;
function animate() {
position += 2;
element.style.transform = `translateX(${position}px)`;
if (position < 200) {
requestAnimationFrame(animate);
}
}
animate();
说明:每次调用 animate 函数都会更新元素位置,并递归调用 requestAnimationFrame,直到达到目标位置。
2. 改变 CSS 属性实现淡入淡出
通过修改透明度(opacity)来实现渐变效果,也可以配合 transition 使用纯 CSS 过渡,但 JavaScript 可以更灵活地控制过程。
立即学习“Java免费学习笔记(深入)”;
示例:淡入效果
const element = document.getElementById('fade-box');
element.style.opacity = 0;
let opacity = 0;
function fadeIn() {
opacity += 0.01;
element.style.opacity = opacity;
if (opacity < 1) {
requestAnimationFrame(fadeIn);
}
}
fadeIn();
3. 结合 CSS transition 简化动画逻辑
如果不需要逐帧控制,可以直接设置 CSS transition,然后用 JavaScript 触发样式变化。
CSS 部分:
#box {
transition: transform 0.5s ease, opacity 0.5s ease;
}
.moved {
transform: translateX(200px);
opacity: 0.5;
}
JavaScript 触发:
const element = document.getElementById('box');
element.classList.add('moved');
这种方式更简洁,适合简单交互动画。
4. 动画函数封装(可复用)
可以封装一个通用的动画函数,支持不同属性和持续时间。
function animateProperty(element, property, start, end, duration) {
const startTime = performance.now();
function step(currentTime) {
const elapsed = currentTime - startTime;
const progress = Math.min(elapsed / duration, 1);
const value = start + (end - start) * progress;
element.style[property] = value;
if (progress < 1) {
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);
}
// 使用示例
const box = document.getElementById('box');
box.style.left = '0px';
animateProperty(box, 'left', 0, 200, 1000); // 1秒内从0px移到200px
基本上就这些。选择哪种方式取决于需求:精细控制用 requestAnimationFrame,简单过渡用 CSS transition。关键是要理解动画的本质——随时间改变样式。











