当前位置:首页 > JavaScript

js实现按住旋转

2026-03-16 02:27:49JavaScript

实现按住旋转的 JavaScript 方法

监听鼠标事件

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

js实现按住旋转

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() 实现旋转效果。计算鼠标移动的角度差,动态更新旋转角度。

js实现按住旋转

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 优化旋转动画的流畅度,避免频繁重绘导致的性能问题。

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实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…