判断鼠标移入移出元素时的方向

本文要介绍的是一种鼠标从一个元素移入移出时,获取鼠标移动方向的思路。这个方法可以帮助你判断鼠标在移入移出时,是从上下左右的哪个方向发生的。这个思路,是我自己琢磨出来,利用了一点曾经高中学过的数学知识,但是非常简单好理解,希望能对你有所帮助。

在线demo

http://liuyunzhuge.github.io/blog/mouse_direction/demo1.html

相关代码

https://github.com/liuyunzhuge/blog/blob/master/mouse_direction/demo1.js

另外demo1.html里面还有部分逻辑代码。

效果演示:

思路详解

1. 把元素框分成如下四部分:

只要能判断出鼠标移入移出时属于哪个部分的范围内,问题即可解决。而这个判断可通过斜率,结合鼠标的位置与元素框中心点的位置比较得出。这个判断原理,采用下面的坐标系图解来说明。

2. 解决这个问题,建立如下图坐标系:

1)上图以浏览器可视区域左上角为原点建立坐标系,坐标系与数学坐标系方向一致,往右表示x轴正方向,往下表示y轴负方向;

2)图中点(x1,y1)代表元素框左上角,(x4,y4)代表元素框右下角,(x0,y0)代表元素框的中心点,(x,y)表示鼠标移入移出时与元素框的边的交点;

3)根据下面的公式:

可得(x1,y1)与(x4,y4)这条对角线的斜率为 k = (y1-y4)/(x1-x4)。由于对称性,元素框另外一条对角线的斜率一定是 -k。

同时由于(x1,y1)与(x4,y4)这条对角线在坐标系中一定经过的是第二和第四象限,所以k肯定是负值,而 -k一定是正值。

4)根据同样的公式,当鼠标移入移出时的瞬间,与元素边框的交点与元素框中心点的斜率 k1 = (y-y0)/(x-x0)。

5)由图可知,当 k < k1 < –k时,鼠标一定是从元素的左右方向移动的;反之,一定是从上下方向移动的。

当鼠标是从左右方向移动时,如果x > x0,那么鼠标就是从右边移动的,反之就是从左边移动的;

当鼠标是从上下方向移动时,如果y > y0时,那么鼠标就是从上边移动的,反之就是从下边移动的。

注意:坐标系中所有的y值都是负的。

以上便是这个问题,我提供的解决思路,通过上面的图解说明,相信大家理解起来会比较容易。如果查看我提供的代码实现demo1.js,会发现代码的逻辑,跟上面的图解说明也是一致的。当然这个思路只是解决如何判断鼠标移入移出的方向问题,demo中的效果实现最后还得要借助css 过渡才行,不过这个部分就更简单了,详细代码可见demo1.html的源码,逻辑非常简单,这里就不再详细说明了。

其它思路

在得出上面的思路之前,我其实已经在网上了解到另外一个思路实现了,我把该实现也做了一个demo:

http://liuyunzhuge.github.io/blog/mouse_direction/demo2.html

代码:

https://github.com/liuyunzhuge/blog/blob/master/mouse_direction/demo2.js

当然这两个demo,从效果上没有任何区别,它们的区别仅仅在于鼠标移动方向判断的算法不同而已。这个算法可以在demo2.js中找到,你也可以通过下面的两篇文章了解到它的一些介绍:

http://www.w3cfuns.com/notes/13989/90cb3c048f6516f8a13a87b5e474a15e:storey-1

http://sentsin.com/web/112.html

不过惭愧的是,我并没有看懂这个思路的原理,所以我这里也给不出解释说明了,虽然在别的地方看到了一些解释,但是并不是很清晰,所以我才去想有没有更简单理解的方法实现。实际工作中,我认为这两种思路都是可以使用的,用哪个凭自己喜好决定就行了。

总结

最后希望本文提供的这个小东西在你平常工作的时候,能够派上用场,为你的页面添加一些活泼的滑入滑出效果等等,同时也算是自己的一个积累。

时间: 2024-08-02 19:05:50

判断鼠标移入移出元素时的方向的相关文章

判断鼠标移入移出方向设置

原理:以div容器的中心点作为圆心,以高和宽的最小值作为直径画圆,将圆以[π/4,3π/4),[3π/4,5π/4),[5π/4,7π /4),[-π/4,π/4)划分为四个象限,鼠标进入容器时的点的atan2(y,x)值在这四个象限里分别对应容器边框的下,右,上,左.如下图所示 Js代码 var x = (e.pageX - this.offsetLeft - (w / 2)) * (w > h ? (h / w) : 1); 计算x坐标值时,如果点原来的x坐标的绝对值大于圆的半径值,则按 h

js(jquery)鼠标移入移出事件时,出现闪烁、隐藏显示隐藏显示不停切换的情况

<script> $(".guanzhu").hover(function(){ $(".weixinTop").show(); },function(){ $(".weixinTop").hide(); }); </script> js代码如上: 最终发现: class="weixinTop" 的div,把class="guanzhu"所在的层遮住了,导致类似鼠标移出的效果,移出之

认清鼠标移入移出事件

本文也同步发表在我的公众号"我的天空" 鼠标的移入移出事件,是在我们做一些前端效果时使用相当频繁的事件,但在JS中,鼠标的移入移出事件有两对,分别是mouseover.mouseout:以及mouseenter.mouseleave,如果没有对其的区别有清新的认识话,则很容易掉坑里! 譬如某次有人反映需要做以下这么一个效果:当鼠标移入背景图片时,将有一个遮罩层升起,当鼠标移出后,遮罩层落下(如图),该效果还是很常见的: 其采用jquery的animate()结合鼠标的移入移出事件来处理

根据鼠标移入移出方向,实现hover效果

首先,我们要判断鼠标移入对象的方向:先获取该对象的左边距,然后通过判断鼠标距离上面.左面.右面.下面的值的最小值,来获取鼠标移入对象的方向. JS代码: ;(function($){ $.fn.extend({ dirMove:function(){ var $outer=this; var $mask=this.find("#mask"); var disL = $outer.offset().left; var disT = $outer.offset().top; var dis

[读码时间] 图片列表:鼠标移入/移出改变图片透明度

说明:代码来自网络.注释为笔者学习时添加. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>图片列表:鼠标移入/移出改变图片透明度</title> <style> ul,li{ /*去除内外边距,去除列表默认样式*/ margin:0; padding:0; list-style-type:none; } #imgList{ /

鼠标移入移出事件

鼠标移入移出事件: mouseover:鼠标移入到目标元素的上方,在其子元素上时也会触发,.所以说也就是说会产生冒泡. <html> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <head> <style> .parent{height: 400px; width: 400px;border: 1px solid red;}

HTML5+CSS3鼠标移入移出图片生成随机动画

今天分享使用html+css3+少量jquery实现鼠标移入移出图片生成随机动画,我们先看最终效果图(截图为静态效果,做出来可是动态的哟) 左右旋转 上下移动 缩放 由于时间关系我就不一步步解析各段代码所代表含义,我这里就给出一些思路及关键代码: 1.首先使用ul li展现4张图片 本示例中不仅使用了图片,在图片表面还放置了一段“WEB”字样文字,用于与图片实现隐藏或显示效果,故html中每张图片上方加入: <div class="mytext">WEB</div&g

Jquery事件:鼠标移入移出(mouseenter,mouseleave)

前几天帮朋友做了一个单页面,其中有个效果就是鼠标移动到头像上变换头像样式,当鼠标移出时恢复头像样式.当时没多想,脑子就蹦出了mouseover,mouseout两个方法. 但是在编写页面的过程中,无论我怎么调试只有mouseover方法可以,mouseout方法失效. 于是就google,百度寻找解决答案,可是找了好久都没找到合适的答案.只好问问同事了,同事看了我的代码后也觉得没有问题,但是怎么测都失效. 往往在一条路上遇到问题后,通过各种方式都解决不了时,我们就要调整思路转换道路. 同事跟我说

鼠标移入移出背景色渐变

写这些东西一定是思路清晰的时候,思路清的时候怎么着都行……加油吧,这条路还很远…… 方法一: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>鼠标移入移出,背景色渐变</title> <style> *{ margin:0; padding:0; } div{ margin:10px auto