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

js实现转圈

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 代码

js实现转圈

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实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js 实现vue

js 实现vue

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

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现显示隐藏

js实现显示隐藏

显示隐藏的实现方法 在JavaScript中,实现元素的显示和隐藏可以通过多种方式完成。以下是几种常见的方法: 修改CSS的display属性 通过改变元素的display属性可以在none(隐藏)…

js实现按钮点击

js实现按钮点击

实现按钮点击的JavaScript方法 HTML按钮元素 在HTML中创建按钮元素,为其添加id或class以便JavaScript选择: <button id="myButton">点…