一、直接上效果图:

然后是代码:

一共两种实现方式:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<style>
.box {
width: 200px;
height:100px;
background: #cccccc;
position: absolute;
top: 30%;
left: 40%;
transform-origin: 50% 50% 0;
}
</style>
</head>
<body>
<div id="box" class="box"></div> <script> // 第一种
var isMove = false;
$('#box').mousedown(function (event) {
const element = event.target;
const rect = element.getBoundingClientRect();
element.dataset.centerX = rect.left + rect.width / 2;
element.dataset.centerY = rect.top + rect.height / 2;
element.dataset.angle = getDragAngle(event);
isMove = true;
}); $('#box').mousemove(function (event) {
if (isMove) {
var angle = getDragAngle(event);
event.target.style.transform = 'rotate(' + angle + 'rad)';
}
}); $('#box').mouseup(function (event) {
isMove = false;
event.target.dataset.angle = getDragAngle(event);
}); function getDragAngle(event) {
var element = event.target;
var startAngle = parseFloat(element.dataset.angle) || 0;
var center = {
x: parseFloat(element.dataset.centerX) || 0,
y: parseFloat(element.dataset.centerY) || 0,
};
var angle = Math.atan2(center.y - event.clientY, center.x - event.clientX);
return angle - startAngle;
}
// 第二种
// $(document).on('mousemove',function(e){
// var x = e.clientX;
// var y = e.clientY;
// var origin = {x:950,y:190} // 先手动指定当前中心点,也可以根据当前元素的left+width/2 的到x top+height/2 得到y值 // // 计算出当前鼠标相对于元素中心点的坐标
// x = x - origin.x; // 因为x大于origin.x 是在y轴右边,直接减就行了
// y = origin.y - y;// 但是y如果要在x轴上方,它是比origin.y要小的,所以这里就需要反过来 // // 然后计算就可以了
// var ele = document.getElementById('box')
// var deg = Math.atan2(y, x) / Math.PI * 180;
// ele.style.transform = 'rotate('+ -deg +'deg)'
// }); </script> </body>
</html>

二、固定4个顶点

代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<style>
* {
user-select: none;
}
.box {
width: 200px;
height:100px;
background: #cccccc;
position: relative;
top: 30%;
left: 40%;
transform-origin: 50% 50% 0;
margin-top: 15%;
} .dot {
position: absolute;
width: 20px;
height: 20px;
background-color: #f60;
} .dot1 {
top: -10px;
left: -10px;
} .dot2 {
top: -10px;
right: -10px;
} .dot3 {
bottom: -10px;
right: -10px;
} .dot4 {
bottom: -10px;
left: -10px;
}
</style>
</head>
<body>
<div id="box" class="box">
<div class="dot dot1"></div>
<div class="dot dot2"></div>
<div class="dot dot3"></div>
<div class="dot dot4"></div>
</div> <script> // 第一种
var isMove = false;
$('.dot').mousedown(function (event) {
const element = $('#box')[0]
const rect = element.getBoundingClientRect();
element.dataset.centerX = rect.left + rect.width / 2;
element.dataset.centerY = rect.top + rect.height / 2;
element.dataset.angle = getDragAngle(event);
isMove = true;
}); $(document).mousemove(function (event) {
if (isMove) {
var angle = getDragAngle(event);
$('#box')[0].style.transform = 'rotate(' + angle + 'rad)';
}
}); $(document).mouseup(function (event) {
    if (isMove) {
  isMove = false;
  $('#box')[0].dataset.angle = getDragAngle(event);
   }
}); function getDragAngle(event) {
var element = $('#box')[0];
var startAngle = parseFloat(element.dataset.angle) || 0;
var center = {
x: parseFloat(element.dataset.centerX) || 0,
y: parseFloat(element.dataset.centerY) || 0,
};
var angle = Math.atan2(center.y - event.clientY, center.x - event.clientX);
return angle - startAngle;
}
</script> </body>
</html>

最新文章

  1. 前端学HTTP之网络基础
  2. 关于 .NET Core 动态链接库的开发
  3. centos7.2 默认启动内核修改
  4. Oracle的Connect By理解
  5. SGU 319. Kalevich Strikes Back (线段树)
  6. 两个升序链表的合并 Merge Two Sorted Lists 【 leetcode】
  7. DataGridView 控件用法(可能不是很全面,因为这是自己常常用到的一些小总结):
  8. 有图有真相,分享一款网页版HTML5飞机射击游戏
  9. 聚类算法:K均值、凝聚层次聚类和DBSCAN
  10. 安装64位Oracle 10g超详细教程
  11. java垃圾回收那点事(二)不同gc策略的heap分配
  12. C++封装SQLite实例&amp;lt;三&amp;gt;
  13. 面向服务的体系架构 SOA(三) --- Zookeeper API、zkClient API的使用
  14. [2017/5/28]FJ四校联考
  15. PostgreSQL 9.5.x的架构图及外存图
  16. word宏(macro) 之 注意事项,常见语法和学习地方
  17. CRM 2016 执行IFrame 子页面中函数
  18. 在MyEclipse(2015)中上传项目到github的步骤(很详细)
  19. 权限管理,pymysql模块
  20. HTTP basic 认证

热门文章

  1. layui 表单遇到的小问题
  2. Java快排
  3. GitHub:Google
  4. jq 实时监听input输入框的变化
  5. sql(存储过程,事务,索引,游标,触发器)
  6. Ubuntu 16.04 安装 google 输入法
  7. 【HANA系列】【第六篇】SAP HANA XS使用JavaScript(JS)调用存储过程(Procedures)
  8. git与gitlab工具
  9. python利用smtp发送邮件
  10. eclipse SVN插件的日常使用