当前位置:首页 > JavaScript

js实现按住旋转

2026-03-16 02:27:49JavaScript

实现按住旋转的 JavaScript 方法

监听鼠标事件

通过 mousedownmousemovemouseup 事件实现按住旋转的逻辑。在 mousedown 时记录初始角度和鼠标位置,mousemove 时计算旋转角度,mouseup 时移除事件监听。

let isDragging = false;
let startAngle = 0;
let startX, startY;

element.addEventListener('mousedown', (e) => {
    isDragging = true;
    startX = e.clientX;
    startY = e.clientY;
    startAngle = getCurrentRotation(element);
    document.addEventListener('mousemove', rotate);
    document.addEventListener('mouseup', stopRotate);
});

function rotate(e) {
    if (!isDragging) return;
    const centerX = element.offsetLeft + element.offsetWidth / 2;
    const centerY = element.offsetTop + element.offsetHeight / 2;
    const angle = Math.atan2(e.clientY - centerY, e.clientX - centerX) * 180 / Math.PI;
    element.style.transform = `rotate(${angle}deg)`;
}

function stopRotate() {
    isDragging = false;
    document.removeEventListener('mousemove', rotate);
    document.removeEventListener('mouseup', stopRotate);
}

function getCurrentRotation(el) {
    const transform = window.getComputedStyle(el).getPropertyValue('transform');
    if (transform === 'none') return 0;
    const values = transform.split('(')[1].split(')')[0].split(',');
    const a = values[0];
    const b = values[1];
    return Math.round(Math.atan2(b, a) * (180 / Math.PI));
}

使用 CSS 变换

通过 transform: rotate() 实现旋转效果。计算鼠标移动的角度差,动态更新旋转角度。

element.addEventListener('mousemove', (e) => {
    if (!isDragging) return;
    const rect = element.getBoundingClientRect();
    const centerX = rect.left + rect.width / 2;
    const centerY = rect.top + rect.height / 2;
    const angle = Math.atan2(e.clientY - centerY, e.clientX - centerX) * 180 / Math.PI;
    element.style.transform = `rotate(${angle - startAngle}deg)`;
});

支持触摸事件

为移动端设备添加触摸事件支持,逻辑与鼠标事件类似。

element.addEventListener('touchstart', (e) => {
    isDragging = true;
    startX = e.touches[0].clientX;
    startY = e.touches[0].clientY;
    startAngle = getCurrentRotation(element);
    document.addEventListener('touchmove', rotateTouch);
    document.addEventListener('touchend', stopRotateTouch);
});

function rotateTouch(e) {
    if (!isDragging) return;
    const centerX = element.offsetLeft + element.offsetWidth / 2;
    const centerY = element.offsetTop + element.offsetHeight / 2;
    const angle = Math.atan2(e.touches[0].clientY - centerY, e.touches[0].clientX - centerX) * 180 / Math.PI;
    element.style.transform = `rotate(${angle}deg)`;
}

function stopRotateTouch() {
    isDragging = false;
    document.removeEventListener('touchmove', rotateTouch);
    document.removeEventListener('touchend', stopRotateTouch);
}

优化性能

使用 requestAnimationFrame 优化旋转动画的流畅度,避免频繁重绘导致的性能问题。

js实现按住旋转

function rotateOptimized(e) {
    if (!isDragging) return;
    requestAnimationFrame(() => {
        const centerX = element.offsetLeft + element.offsetWidth / 2;
        const centerY = element.offsetTop + element.offsetHeight / 2;
        const angle = Math.atan2(e.clientY - centerY, e.clientX - centerX) * 180 / Math.PI;
        element.style.transform = `rotate(${angle}deg)`;
    });
}

标签: js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现复制功能

js实现复制功能

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

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…