当前位置:首页 > 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实现图片轮播

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

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现报表

js实现报表

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

js类实现

js类实现

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

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…