当前位置:首页 > 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中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

vue实现共享动画

vue实现共享动画

Vue 实现共享动画的方法 在 Vue 中实现共享动画(即多个元素间平滑过渡的动画效果)可以通过 Vue 的过渡系统和第三方库(如 GSAP)来实现。以下是几种常见方法: 使用 Vue 的 <…

vue实现js休眠

vue实现js休眠

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

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

vue实现进入动画

vue实现进入动画

Vue 进入动画实现方法 使用 Vue 的过渡系统实现进入动画,主要通过 <transition> 或 <transition-group> 组件结合 CSS 或 JavaSc…