需要获取鼠标的移动角度
1、mousedown 确定起始点
2、mousemove 确立相关点
3、先计算两点的斜率,然后根据三角函数和反三角函数。转换为角度
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style type="text/css">
.circle{
position: absolute;
width: 10px;
height: 10px;
border-radius: 50%;
background: red;
}
</style>
</head>
<body>
<div class="circle" id="circle"></div>
</body>
<script type="text/javascript">
function MouseGesture(opt){
opt = opt || {};
if(opt.wise){
//是否 获取顺时针角度,默认为逆时针角度
this.getDeg = this._clockWise;
}else{
this.getDeg = this._antiClockWise;
}
this.throat = opt.throat || 50; //执行频率,每 50 毫秒 执行一次回调
this.distance = opt.distance || 4; //最小有效距离
this.moveP = null; //开始的点
this.events = {};
this._init();
}
MouseGesture.prototype._init = function(){
var $this = this;
$this.moveP = null;
function calcEvent(type,e){
var start = {
x:$this.moveP.x,
y:$this.moveP.y
}
var pos = {
x:e.clientX,
y:e.clientY
}
var dis = Math.sqrt((start.x - pos.x) * (start.x - pos.x) + (start.y - pos.y)*(start.y - pos.y));
if(dis >= $this.distance){
var deg = $this.getDeg(start,pos);
e["deg"] = deg;
e["missX"] = pos.x - start.x;
e["missY"] = pos.y - start.y;
$this._triggerEvent(type,e);
}
}
var move = $this._throat((e)=>{
if($this.moveP){
calcEvent("move",e);
}
},$this.throat);
window.addEventListener("mousedown",function(e){
$this.moveP = {
x:e.clientX,
y:e.clientY
};
$this._triggerEvent("start",e);
})
window.addEventListener("mousemove",function(e){
if($this.moveP){
move(e);
}
})
window.addEventListener("mouseup",function(e){
calcEvent("end",e);
$this.moveP = null;
})
}
//每次开始之前,都可以手动设置起始点,如果不设置,则默认为鼠标的 mousedown 的点
MouseEvent.prototype.setStartPoint = function(point){
if(point){
$this.moveP = point;
}
}
MouseGesture.prototype._antiClockWise = function(start,end){
//获取逆时针的旋转角度
var x1 = start.x;
var y1 = start.y;
var x2 = end.x;
var y2 = end.y;
var deg = 0;
if(x1 != x2){
var k = (y1-y2)/(x1-x2);
var a = Math.atan(k);
deg = a * 180 /Math.PI - 90; //弧度转角度
deg = Math.abs(deg);
if( x1 >= x2){
deg = deg + 180;
}
}else{
if(y2 > y1){
deg = 0;
}else{
deg = 180;
}
}
return Math.floor(deg);
}
MouseGesture.prototype._clockWise = function(start,end){
//获取顺时针的角度
return 360 - this._antiClockWise(start,end);
}
MouseGesture.prototype._throat = function(callback,num){
var timer = null;
callback = callback || function(){};
return function(){
if(!timer){
var that = this;
var arg = arguments;
timer = setTimeout(function(){
callback.apply(that,arg);
timer = null;
},num);
}
}
}
MouseGesture.prototype.on = function(type,fn){
if(!this.events[type]){
this.events[type] = [];
}
this.events[type].push(fn);
return this;
}
MouseGesture.prototype.off = function(type,fn){
if(this.events[type] ){
var index = this.events[type].indexOf(fn);
if(index > -1){
this.events[type].splice(index);
}
}
return this;
}
MouseGesture.prototype.offAll = function(){
this.events = {};
return this;
}
MouseGesture.prototype._triggerEvent = function(){
var args = arguments;
var type = args[0];
var arg = [];
for(var i = 1; i < arguments.length; i++){
arg.push(args[i])
}
var evts = this.events[type] || [];
for(var i = 0; i < evts.length; i++){
evts[i] && evts[i].apply&&evts[i].apply(this,arg);
}
return this;
}
var circle = document.getElementById("circle");
var ins = new MouseGesture({wise:true})
.on("start",function(e){
circle.style.left = e.clientX - 5 + "px";
circle.style.top = e.clientY - 5 + "px";
})
.on("move",function(e){
console.log(`角度为:${e.deg}; x方向位移:${e.missX}; y方向位移:${e.missY}`);
})
.on("end",function(e){
console.log(`角度为:${e.deg}; x方向位移:${e.missX}; y方向位移:${e.missY}`);
})
</script>
</html>
原文:https://www.cnblogs.com/muamaker/p/10637754.html