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