当前位置:首页 > JavaScript

js实现按住旋转

2026-02-03 01:51:08JavaScript

实现按住旋转的JavaScript方法

使用JavaScript实现按住旋转功能通常涉及鼠标或触摸事件监听,结合CSS变换或Canvas绘制。以下是两种常见实现方式:

基于CSS和鼠标事件的旋转

通过监听鼠标移动事件计算旋转角度,并应用CSS的transform属性实现旋转效果。

js实现按住旋转

let isDragging = false;
let startAngle = 0;
let currentAngle = 0;
const element = document.getElementById('rotatable-element');

element.addEventListener('mousedown', (e) => {
  isDragging = true;
  startAngle = getAngle(e.clientX, e.clientY);
});

document.addEventListener('mousemove', (e) => {
  if (!isDragging) return;
  const angle = getAngle(e.clientX, e.clientY);
  currentAngle += angle - startAngle;
  startAngle = angle;
  element.style.transform = `rotate(${currentAngle}deg)`;
});

document.addEventListener('mouseup', () => {
  isDragging = false;
});

function getAngle(x, y) {
  const rect = element.getBoundingClientRect();
  const centerX = rect.left + rect.width / 2;
  const centerY = rect.top + rect.height / 2;
  return Math.atan2(y - centerY, x - centerX) * 180 / Math.PI;
}

基于Canvas的旋转控制

在Canvas中实现更精细的旋转控制,适合需要自定义绘制的情况。

js实现按住旋转

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
let angle = 0;
let isRotating = false;
let lastX, lastY;

canvas.addEventListener('mousedown', (e) => {
  const rect = canvas.getBoundingClientRect();
  lastX = e.clientX - rect.left;
  lastY = e.clientY - rect.top;
  isRotating = true;
});

canvas.addEventListener('mousemove', (e) => {
  if (!isRotating) return;
  const rect = canvas.getBoundingClientRect();
  const x = e.clientX - rect.left;
  const y = e.clientY - rect.top;

  const centerX = canvas.width / 2;
  const centerY = canvas.height / 2;
  const deltaAngle = Math.atan2(y - centerY, x - centerX) - 
                    Math.atan2(lastY - centerY, lastX - centerX);

  angle += deltaAngle * 180 / Math.PI;
  lastX = x;
  lastY = y;
  drawRotatedObject();
});

canvas.addEventListener('mouseup', () => {
  isRotating = false;
});

function drawRotatedObject() {
  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.fillRect(-50, -50, 100, 100); // 示例矩形
  ctx.restore();
}

触摸设备适配

为支持触摸设备,需要添加相应的事件监听器:

element.addEventListener('touchstart', (e) => {
  isDragging = true;
  const touch = e.touches[0];
  startAngle = getAngle(touch.clientX, touch.clientY);
});

document.addEventListener('touchmove', (e) => {
  if (!isDragging) return;
  const touch = e.touches[0];
  const angle = getAngle(touch.clientX, touch.clientY);
  currentAngle += angle - startAngle;
  startAngle = angle;
  element.style.transform = `rotate(${currentAngle}deg)`;
});

document.addEventListener('touchend', () => {
  isDragging = false;
});

性能优化建议

对于复杂场景,考虑使用requestAnimationFrame优化动画性能。避免在事件处理函数中直接进行DOM操作,改为在动画帧中统一处理。

function updateRotation() {
  if (isDragging) {
    requestAnimationFrame(updateRotation);
    element.style.transform = `rotate(${currentAngle}deg)`;
  }
}

标签: js
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取…