当前位置:首页 > JavaScript

js实现转圈

2026-02-01 02:23:14JavaScript

使用 CSS 和 JavaScript 实现旋转动画

通过 CSS animation@keyframes 实现旋转效果,JavaScript 用于控制动画的启停。

HTML 结构

<div id="spinner"></div>
<button id="toggle">Toggle Spin</button>

CSS 样式

#spinner {
  width: 50px;
  height: 50px;
  border: 5px solid #f3f3f3;
  border-top: 5px solid #3498db;
  border-radius: 50%;
  animation: spin 1s linear infinite;
  margin: 20px auto;
}

@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

JavaScript 控制

const spinner = document.getElementById('spinner');
const toggleBtn = document.getElementById('toggle');

toggleBtn.addEventListener('click', () => {
  const isSpinning = spinner.style.animationPlayState !== 'paused';
  spinner.style.animationPlayState = isSpinning ? 'paused' : 'running';
});

纯 JavaScript 实现旋转(Canvas)

使用 requestAnimationFrame 逐帧绘制旋转效果,适合需要动态控制的场景。

HTML 结构

<canvas id="spinnerCanvas" width="100" height="100"></canvas>
<button id="startBtn">Start</button>
<button id="stopBtn">Stop</button>

JavaScript 代码

const canvas = document.getElementById('spinnerCanvas');
const ctx = canvas.getContext('2d');
let angle = 0;
let animationId = null;

function drawSpinner() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.save();
  ctx.translate(canvas.width / 2, canvas.height / 2);
  ctx.rotate((angle * Math.PI) / 180);
  ctx.fillStyle = '#3498db';
  ctx.beginPath();
  ctx.moveTo(0, 0);
  ctx.lineTo(30, 0);
  ctx.lineTo(15, 30);
  ctx.closePath();
  ctx.fill();
  ctx.restore();
  angle = (angle + 2) % 360;
  animationId = requestAnimationFrame(drawSpinner);
}

document.getElementById('startBtn').addEventListener('click', () => {
  if (!animationId) drawSpinner();
});

document.getElementById('stopBtn').addEventListener('click', () => {
  cancelAnimationFrame(animationId);
  animationId = null;
});

使用 SVG 实现平滑旋转

SVG 的 transform 属性结合 JavaScript 实现高性能旋转动画。

HTML 结构

<svg id="spinnerSvg" width="100" height="100" viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="40" stroke="#3498db" stroke-width="8" fill="none" stroke-dasharray="60 20" />
</svg>
<button id="svgToggle">Toggle</button>

JavaScript 控制

js实现转圈

const svgSpinner = document.getElementById('spinnerSvg');
const svgCircle = svgSpinner.querySelector('circle');
let rotation = 0;
let svgInterval = null;

function startSvgSpin() {
  svgInterval = setInterval(() => {
    rotation = (rotation + 2) % 360;
    svgCircle.setAttribute('transform', `rotate(${rotation} 50 50)`);
  }, 16);
}

document.getElementById('svgToggle').addEventListener('click', () => {
  if (svgInterval) {
    clearInterval(svgInterval);
    svgInterval = null;
  } else {
    startSvgSpin();
  }
});

注意事项

  • 性能优化:CSS 动画性能通常优于 JavaScript 实现的动画。
  • 浏览器兼容性requestAnimationFrame 和 CSS animation 在现代浏览器中支持良好。
  • 移动端适配:使用 transform 代替 top/left 变化以避免布局重排。

标签: js
分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现vue路由

js实现vue路由

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