JavaScript操作CSS样式和动画的核心是动态修改样式属性并利用浏览器渲染机制;可通过直接设置style属性、切换CSS类、CSS transition或requestAnimationFrame实现不同场景的动画效果。
JavaScript 操作 CSS 样式和实现动画效果,核心在于动态修改元素的样式属性,并借助浏览器渲染机制(如 requestAnimationFrame)或 CSS 过渡/动画规则来呈现流畅变化。
这是最基础的方式,适用于一次性、明确的样式变更。通过 element.style.属性名 设置内联样式:
div.style.color = 'red';div.style.fo
ntSize = '16px';(注意:CSS 中的 font-size 要写成驼峰 fontSize)div.style.backgroundColor = '#007bff';⚠️ 注意:这种方式只影响 style 内联样式,无法读取 CSS 类中定义的值(读取时返回空字符串),如需读取计算后样式,要用 getComputedStyle(element)。
把样式逻辑交给 CSS 类,JS 只负责控制类名,更清晰、易维护、支持伪类和媒体查询:
element.classList.add('active');element.classList.remove('hidden');element.classList.toggle('expanded');element.classList.replace('old', 'new');例如配合 CSS:
.fade-in { opacity: 1; transition: opacity 0.3s ease; }
.fade-in.hidden { opacity: 0; }JS 执行 el.classList.add('hidden') 就能触发动画。
适合「从 A 状态到 B 状态」的平滑过渡(如悬停、展开、淡入):
transition: background-color 0.2s, transform 0.3s;
className 或 style.transform),浏览器自动补间transitionend 事件做后续处理✅ 优点:性能好(GPU 加速可能启用)、代码简洁、可被用户偏好(如减少动画)影响。
适合需要精确控制每帧逻辑的场景(如物理模拟、滚动跟随、复杂路径动画):
setTimeout 或 setInterval 控制动画帧率requestAnimationFrame(callback) 让浏览器决定最佳时机示例(匀速移动):
function animateLeft(el, from, to, duration = 300) {
const start = performance.now();
const delta = to - from;
function step(now) {
const elapsed = now - start;
const progress = Math.min(elapsed / duration, 1);
el.style.left = `${from + delta * progress}px`;
if (progress < 1) requestAnimationFrame(step);
}
requestAnimationFrame(step);
}浏览器原生支持的 JS 动画接口,功能接近 CSS 动画但完全由 JS 控制:
element.animate(keyframes, options) 创建并播放动画onfinish)[{opacity: 0}, {opacity: 1}])示例:
el.animate(
[{ transform: 'scale(1)', opacity: 1 },
{ transform: 'scale(1.2)', opacity: 0.8 }],
{ duration: 300, easing: 'ease-out' }
);
兼容性良好(Chrome 36+/Firefox 48+/Safari 13.1+),旧版可用 polyfill。
不复杂但容易忽略:动画性能关键在避免触发布局(layout)和绘制(paint),优先用 transform 和 opacity,慎改 width、height、top、left 等会引发重排的属性。