zoukankan      html  css  js  c++  java
  • 判断鼠标进入容器的方向小Demo

    参考资料:

      贤心博客:http://sentsin.com/web/112.html,

      Math.atan2(y,x) 解释 :http://www.w3school.com.cn/jsref/jsref_atan2.asp;

    Demo: Demo

    截图:

    代码:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    
    <head>
      	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     	<title>Document</title>
    	<style>
    	*{ margin:0;padding:0;}
    	#box{ position: absolute;top:200px;left:200px; 560px;height:560px;border:1px solid #999;padding:10px 0 0 10px; }
    	#box div{ position: relative; float:left;100px;height: 100px; margin:0 10px 10px 0;border:1px solid #ccc;overflow: hidden;}
    	#box div.big-box{ 324px;}
    	#box .mark{ position: absolute;left:-200px;top:-200px;100%;height:100%;background-color: #000; opacity: 0.5; border:none; }
    	</style>
    	<script src="jquery-1.8.3.min.js"></script>
    	<script>
    		$(function(){
    
    			var $oBox = $('#box');
    			var $aDivs = $oBox.children();
    			var $aMarks = $('.mark');
    
    			$aMarks.on('mouseenter',function(event){
    				event.stopPropagation();
    				return false;
    			});
    
    			$aDivs.on('mouseenter mouseleave',function( event ){
    				
    				var $this = $(this),
    					$mark = $this.find('.mark'),
    					w = $this.width(),
    					h = $this.height(),
    					offset = $this.offset(),
    					scaleX = w > h ? (h / w) : 1,
    		        	scaleY = h > w ? (w / h) : 1,
    		        	x = (event.pageX - offset.left - (w / 2)) * scaleX,
    		        	y = (event.pageY - offset.top - (h / 2)) * scaleY,
    		        	direction = Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4,
    		        	type = event.type;
    
    		        if( direction == 0 ){
    
    					if( type == "mouseenter" ){
    
    						$mark.css({
    							'top'  : -h,
    							'left' : 0
    						});
    
    						$mark.animate({
    							'top' : 0
    						},300);
    
    					}else{
    						
    						$mark.animate({
    							'top' : -h
    						},300);
    
    					}
    
    				}else if( direction == 1 ){
    
    					if( type == "mouseenter" ){
    
    						$mark.css({
    							'top'  : 0,
    							'left' : w
    						});
    
    						$mark.animate({
    							'left' : 0
    						},300);
    
    					}else{
    
    						$mark.animate({
    							'left' : w
    						},300);
    
    					}
    
    				}else if( direction == 2 ){
    
    					if( type == "mouseenter" ){
    
    						$mark.css({
    							'top'  : h,
    							'left' : 0
    						});
    
    						$mark.animate({
    							'top' : 0
    						},300);
    
    					}else{
    
    						$mark.animate({
    							'top' : h
    						},300);
    
    					}
    
    				}else if( direction == 3 ){
    
    					if( type == "mouseenter" ){
    
    						$mark.css({
    							'top'  : 0,
    							'left' : -w
    						});
    
    						$mark.animate({
    							'left' : 0
    						},300);
    
    					}else{
    
    						$mark.animate({
    							'left' : -w
    						},300);
    
    					}
    				
    				}else{
    
    					$mark.css({
    						'top'  : 0,
    						'left' : 0
    					});
    
    				}
    
    			});
    
    		});
    	</script>
    </head>
    <body>
    	
    	<div id="box">
    
    		<div >
    			<a href="#" class="mark"></a>
    		</div>
    		<div class="big-box">
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div>
    			<a href="#" class="mark"></a>
    		</div>
    		<div class="big-box">
    			<a href="#" class="mark"></a>
    		</div>
    	
    	</div>
    
    
    </body>
    </html>
    

      

    后记:

    其实核心的代码都是用贤心博客里的代码,讲解的也比较清楚。

    1.要知道父级容器有正方形和长方形所以要算一个比例关系,求出x,y的值;

    2.Math.atan2(y, x) 返回从 x 轴到点 (x,y) 之间的角度 其实返回的是弧度然后在* 180 / Math.PI 转成角度;

    3.至于+ 180) / 90) + 3) % 4  +180 是为了角度的反转,除90是平均分成四份 +3其实为了%4求出0,1,2,3;

    大概的逻辑是这样,可以也有个人理解不对的方法,欢迎指出;

  • 相关阅读:
    ESP8266 wifi钓鱼
    九,ESP8266 判断是断电上电(强制硬件复位)之后运行的内部程序还是内部软件复位之后运行的程序(基于Lua脚本语言)
    关于Http 传输二维json
    Android6.0权限大全和权限分类
    Android 多线程-----AsyncTask详解
    关于加密(转载文章)
    java基础之:匿名内部类
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    java多线程之:SynchronousQueue队列
    Hibernate之:各种主键生成策略与配置详解
  • 原文地址:https://www.cnblogs.com/auok/p/4672688.html
Copyright © 2011-2022 走看看