当前位置:首页 > 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 控制

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实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…