会动的眼睛demo

效果图:

代码:

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="UTF-8">
  5         <title>反三角函数</title>
  6         <style type="text/css">
  7             #div1{
  8                  width: 176px;
  9                  height: 91px;
 10                  background: url(img/265.png) no-repeat;
 11                  position: absolute;
 12                  left:300px;
 13                  top: 200;
 14             }
 15             #div2{
 16                 border: 2px #000 solid;
 17                 position: absolute;
 18                 left: 115px;
 19                 top: 43px;
 20                 border-radius: 50%;
 21             }
 22             #div3{
 23                 border: 2px #000 solid;
 24                 position: absolute;
 25                 left: 135px;
 26                 top: 43px;
 27                 border-radius: 50%;
 28             }
 29         </style>
 30     </head>
 31     <body>
 32         <script type="text/javascript">
 33             /**
 34              * 已知 斜边   对边 求角度
 35              */
 36              //alert(Math.asin(弧度))
 37              // alert(Math.asin(1/2)*180/Math.PI) //30°
 38              window.onload = function()
 39              {
 40                   var oDiv2 = document.getElementById("div2");
 41                   var oDiv3 = document.getElementById("div3");
 42                   
 43                   var  r= 5;
 44                   var L2 = 115;
 45                   var T2 = 43;
 46                   var L3 = 135;
 47                   var T3 = 43;
 48                   
 49                   document.onmousemove = function(ev)
 50                   {
 51                        var ev = ev || window.event;
 52                        //为了复用封装函数
 53                        change(oDiv2,ev.clientX,ev.clientY,L2,T2);
 54                        change(oDiv3,ev.clientX,ev.clientY,L3,T3);
 55                        function change(obj,x,y,l,t)
 56                        {
 57                             var b = Math.abs(x - (obj.offsetLeft + obj.parentNode.offsetLeft));
 58                             //offsetLeft只是到定位父级的距离也就是到DIV1的距离 还要加上 父级到浏览器边的距离
 59                              var a = Math.abs(y - (obj.offsetTop + obj.parentNode.offsetTop));
 60                              //分四边  右上
 61                              var pointL = obj.offsetLeft + obj.parentNode.offsetLeft;
 62                              var pointT = obj.offsetTop + obj.parentNode.offsetTop;
 63                              var changeX = 0;
 64                              var changeY = 0;
 65                               //判断鼠标坐标点在哪一个方向
 66                              if(x > pointL && y < pointT) //右上
 67                              {
 68                                    
 69                                  changeX = Math.sin(Math.atan(b/a))*r;
 70                                  changeY = Math.cos(Math.atan(b/a))*-r;
 71                                  
 72                                  
 73                              }else if(x > pointL && y > pointT){ //右下
 74                                  
 75                                  changeX = Math.sin(Math.atan(b/a))*r;
 76                                  changeY = Math.cos(Math.atan(b/a))*r;
 77                                  
 78                              }else if(x < pointL && y > pointT){ //左下
 79                                  changeX = Math.sin(Math.atan(b/a))*-r;
 80                                  changeY = Math.cos(Math.atan(b/a))*r;
 81                                  
 82                              }else if(x < pointL && y < pointT){ //左上
 83                                  changeX = Math.sin(Math.atan(b/a))*-r;
 84                                  changeY = Math.cos(Math.atan(b/a))*-r;
 85                              }
 86                             
 87                             obj.style.left = l + changeX + "px";
 88                             obj.style.top = t + changeY +"px";
 89                        }
 90                   }
 91                   
 92                   
 93                   
 94              }
 95         </script>
 96         <div id="div1">
 97              <div id="div2">
 98              </div>
 99              <div id="div3"></div>
100         </div>
101         
102     </body>
103 </html>

技巧:

1.

offsetLeft只是到定位父级的距离也就是到DIV1的距离 还要加上 父级到浏览器边的距离
2.如何判断鼠标方向

 3.还有一种方式

JavaScript Math.atan2(y,x) 方法:得到从 x 轴到点 (x,y) 之间的角度

返回值

返回从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度(-PI 到 PI 之间的值)。

Math.atan2 方法实例

该例子取得不同点的角度:

<script language="JavaScript">

document.write( Math.atan2(1.5,1.5) + "<br />" );
document.write( Math.atan2(-1.5,-1.5) + "<br />" );
document.write( Math.atan2(5,10) + "<br />" );
document.write( Math.atan2(0,5) );

</script>

运行该例子,输出:

0.7853981633974483
-2.356194490192345
0.4636476090008061 
0

atan2(x,y)判断鼠标方向:返回-PI 到 PI 之间的值,是从 X 轴正向逆时针旋转到点 (x,y) 时经过的角度。

看维基网上的一张图:

那我们是不是计算出区块四个顶点的的atan2值,然和鼠标的atan2值比较确定范围看图:

是不由 

CB>=RB&&CB<RT就在左边


CB>=RT&&CB<LT就在上边

CB>=LB&&CB<RB就在下边

否则就在右边

是不是在鼠标进入及鼠标离开事件中就可以很容易的实现了

补充:

鼠标移入判断四个方向的方法用atan2

<script>
var oUl = document.getElementsByTagName("ul")[0];
var oLi = oUl.getElementsByTagName("li");
var lilen = oLi.length
var oSpan = oUl.getElementsByTagName("span");
//方向判断  
//获取元素的宽度和高度(不要认为是width和height 新手特别容易犯错)offsetHeight与offsetWidth
function getMousePos(obj,ev){
    var w = obj.offsetWidth;
    var h = obj.offsetHeight;
    //确定鼠标坐标
    var x = ev.pageX-(obj.offsetLeft+w/2);
    var y = ev.pageY-(obj.offsetTop+h/2);
//    return Math.round((Math.atan2(y,x)*180/Math.PI+180)/90)%4; 
    return Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4//retrn 0 1 2 3 代表4个方法
};

for (var i = 0; i <lilen; i++) {
       drag(oLi[i]);
}

function drag(obj)
{
    obj.onmouseenter = function(ev){
    var oEvent = ev||event;
    var q=getMousePos(this,oEvent);
    //选择方向
    switch(q){
        case 0:
         console.log("")
            this.oSpan.style.left = '0';
            this.oSpan.style.top='-200px';            
        break;
        case 1:
         console.log("")
            this.oSpan.style.left='200px'
            this.oSpan.style.top = '0';            
        break;
        case 2:
         console.log("")
            this.oSpan.style.left = '0';
            this.oSpan.style.top='200px';        
        break;
        case 3:
         console.log("")
            this.oSpan.style.left='-200px'
            this.oSpan.style.top= '0';        
        break;
    }
    move(oSpan,{left:0,top:0})
};
原文地址:https://www.cnblogs.com/h5monkey/p/6611410.html