当前位置:首页 > JavaScript

原生js实现动画

2026-04-04 06:37:48JavaScript

原生 JavaScript 实现动画的方法

使用 requestAnimationFrame

requestAnimationFrame 是浏览器提供的专门用于动画的 API,性能优于 setTimeoutsetInterval。它会根据屏幕刷新率自动调整回调频率。

function animate() {
  const element = document.getElementById('target');
  let position = 0;

  function step(timestamp) {
    position += 1;
    element.style.transform = `translateX(${position}px)`;

    if (position < 200) {
      requestAnimationFrame(step);
    }
  }

  requestAnimationFrame(step);
}

animate();

使用 CSS transition 结合 JavaScript

通过 JavaScript 动态修改 CSS 属性,利用 CSS 的过渡效果实现动画。

原生js实现动画

const element = document.getElementById('target');
element.style.transition = 'transform 1s ease-in-out';
element.style.transform = 'translateX(200px)';

使用 CSS @keyframes 动画

定义关键帧动画并通过 JavaScript 控制其播放。

原生js实现动画

@keyframes slide {
  from { transform: translateX(0); }
  to { transform: translateX(200px); }
}

#target {
  animation: slide 2s infinite;
}
const element = document.getElementById('target');
element.style.animationPlayState = 'paused'; // 暂停动画
element.style.animationPlayState = 'running'; // 继续动画

使用 setIntervalsetTimeout

虽然不推荐,但可以通过定时器实现简单动画。

function animate() {
  const element = document.getElementById('target');
  let position = 0;

  const intervalId = setInterval(() => {
    position += 1;
    element.style.transform = `translateX(${position}px)`;

    if (position >= 200) {
      clearInterval(intervalId);
    }
  }, 16); // 约 60fps
}

animate();

性能优化建议

  • 使用 transformopacity 属性实现动画,这些属性不会触发重排(reflow),性能更好。
  • 避免在动画中频繁修改 widthheightmargin 等会触发重排的属性。
  • 使用 will-change 提示浏览器元素即将发生变化,例如 will-change: transform;

复杂动画示例

以下是一个包含缓动函数的动画示例,模拟更自然的运动效果。

function animateWithEasing(element, duration, easingFunc) {
  const startTime = performance.now();
  const startPos = 0;
  const endPos = 200;

  function step(currentTime) {
    const elapsedTime = currentTime - startTime;
    const progress = Math.min(elapsedTime / duration, 1);
    const easedProgress = easingFunc(progress);
    const currentPos = startPos + (endPos - startPos) * easedProgress;

    element.style.transform = `translateX(${currentPos}px)`;

    if (progress < 1) {
      requestAnimationFrame(step);
    }
  }

  requestAnimationFrame(step);
}

function easeOutQuad(t) {
  return t * (2 - t);
}

const element = document.getElementById('target');
animateWithEasing(element, 1000, easeOutQuad);

注意事项

  • 动画结束后应清理资源,例如取消未完成的 requestAnimationFrame 调用。
  • 对于移动端,注意处理触摸事件与动画的冲突。
  • 使用 window.matchMedia 检测用户是否 prefers-reduced-motion,为对动画敏感的用户提供无障碍支持。

标签: 动画js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…