关于js判断鼠标移入元素的方向——上下左右-程序员宅基地

技术标签: ViewUI  javascript  

 一开始我是这么想的,将待移入的元素分割四块,用mousemove获取第一次鼠标落入的区域来判断鼠标是从哪个方向进去的。

所以只要写个算法来判断鼠标的值落入该元素的区域就可以得出鼠标移入的方向,如下图:

  对于数学不太好的我,只能上网找下看有没有人解决了。找到了如下这段:

var x = (e.pageX - this.offsetLeft - (w / 2)) * (w > h ? (h / w) : 1);
var y = (e.pageY - this.offsetTop - (h / 2)) * (h > w ? (w / h) : 1);
var direction = Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4;

当时就惊呆了,初看不知道什么意思,重新梳理下,发现这段代码跟我的思路是一样的。

那就让我来一步一步解释这段代码吧!

1)、将判断区域问题转成判断角度。

2)、x和y的计算

  该元素的坐标原点是(offsetLeft, offsetTop),那么要转成判断角度,必须将原点拉到该元素的中点上。则中点的坐标是Oz(  offsetLeft + w/2,  offsetTop + h/2  );

那么鼠标落入的点M(e.pageX,e.pageY);

  如果要将这个点转成以Oz为中心,那么就得换算成 x点:e.pageX - (offsetLeft + w/2) ; y点:e.pageY - (offsetTop + h/2)。

那么x和y就出来了。  (w > h ? (h / w) : 1)和 (h > w ? (w / h) : 1)这两个请先忽略,后面会解释。

3)、Math.atan2(x,y)函数

  这个函数返回的值相当于这个点的角度,当然貌似这些编程语言里返回的基本都是弧度。而这代码是用角度来算的所以避免不了弧度和角度的转换,

公式:弧度=角度乘以π后再除以180,

    角度=弧度除以π再乘以180  

(Math.atan2(y, x) * (180 / Math.PI)  其实等于这个 (Math.atan2(y, x) / ( Math.PI/ 180) 

4)、核心部分,

   Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4;

  • +180 :从第三步我们可以得到角度了,但为什么还要加个180,原因是原来的坐标轴是(-180,180)度的,加个180那么就都成正的,即(0,360),这个不难理解。
  • /90 :那为什么要除于90呢,要知道90,就必须理解  (w > h ? (h / w) : 1)和 (h > w ? (w / h) : 1) 这段代码的意思将矩形矫正成正方形(特殊矩形的矩形是正方形所以也就有了这种判断,其实判不判段都一样)。如果我们的元素是个正方形的话,那两条对角线相交的那些角就都是90度了(下图,图中标明的那个角)。
  • +3  的意思,只要知道我们角度区间是从右上方开始算起的,然后顺时针计算的就可以了。该作者想要将结果显示的顺序是 上右下左,所以加三就是将第一区间变成上。
  •  Math.round() ,四舍五入,那么问题来,我们的X轴和Y轴可不是斜着的呀(如图),那这样角度计算不就成问题了。所以就由Math.round()函数发挥作用了,比如计算下0-90中任何一个数除于除于90,我们可以得到 0~1之间的数,如果加个四舍五入呢?那么结果就只有0和1了,刚好45度角是我们分割线。(只能说写出这个代码的人牛)
  • %4取余,保证结果是0、1、2、3 之间的一个(分别代表上、右、下、左)。

 这个是我的仿百度新闻传媒动画案例,当然比它实现更好些,就是加入了上面的判断,哈哈。 js库是jquery。

http://yunpan.cn/cjz5aBh3rck9e (提取码:ddc0)

转载于:https://www.cnblogs.com/liuyanxia/p/5666892.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34185320/article/details/94078305

智能推荐

SpringBoot跳转到静态html页面&&静态文件放置位置_springboot重定向到静态页面-程序员宅基地

文章浏览阅读3.1k次。SpringBoot跳转到静态html页面&&静态文件放置位置一、SpringBoot跳转到静态html页面1、在pom.xml中添加spring-boot-starter-thymeleaf。org.springframework.bootspring-boot-starter-thymeleaf2、在templates下建立a.html文件,新建qiu文件夹,并且在qiu文件夹中创建b.htmla.html内容如下:TitleAAaaAAb.html文件内容如下:T_springboot重定向到静态页面

android检测SD卡读写权限详情-程序员宅基地

文章浏览阅读854次,点赞11次,收藏8次。/减少是否拥有权限checkCallPhonePermission!//弹出对话框接收权限return;} else {=null){因为在android版本5.0以上才把SD卡的读写权限分离开,以前的老版本是没有进行分离的。故找不到SD卡的读写权限,而在测试的过程中,华为的手机出现SD卡读写权限分离在两个地方,有的时候可能不好找,本人就出现这个问题。

Vue不同组件之间的切换-程序员宅基地

文章浏览阅读874次,点赞14次,收藏8次。,},});使用v-if和v-else进行切换方式可以实现组件的切换,但是最多只能有2个,有一定的局限性。使用标签component来实现切换vueApp登录注册Vue提供了component,来展示对应名称的组件component是一个占位符,:is属性,用来指定要展示的组件的名称使用。

通过CUDA deviceQuery分析NVIDIA显卡性能-程序员宅基地

文章浏览阅读636次,点赞4次,收藏2次。参考:http://blog.sina.com.cn/s/blog_471e6c930102wlp5.html在这里插入图片描述序号名称值解释1Detected 1 CUDA Capable device(s)1检测到1个可用的NVIDIA显卡设备2Device 0: "GeForce 930M"GeForce 930M当前显卡型号为" GeForce 930M "3CUDA Driver Versio_devicequery

【C++深入浅出】初识C++上篇(关键字,命名空间,输入输出,缺省参数,函数重载)-程序员宅基地

文章浏览阅读391次,点赞3次,收藏7次。旧坑未填,新坑又起。C++深入浅出。振奋人心的C++学习终于来了在本系列中,你能感受到C++相比C语言特有的魅力,尽管学习的过程中可能会充满坎坷,但***风雨之后,仰望天空,即使没有彩虹,也会是睛空。***学完C++后,你甚至可以在C++中用短短几行代码就搞定C语言几十上百行的代码,是不是很神奇,这还只是C++其中的一个强大之处哦。所以,不要恐惧,让我们一起怀着激动的心情打开C++的大门吧C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的。

Weston中HDMI热拔插检测_udev_device_get_property_value-程序员宅基地

文章浏览阅读1.2k次。Weston中的检测drm_backend_create在创建时,会创建一个循环获取热拔插事件。b->udev_drm_source = wl_event_loop_add_fd(loop, udev_monitor_get_fd(b->udev_monitor), WL_EVENT_READABLE, udev_drm_event, b);static intudev_drm_event(int fd, uint32_udev_device_get_property_value

随便推点

【Python爬虫教程】基础篇-01爬虫介绍与课程规划,记得把每一次面试当做经验积累-程序员宅基地

文章浏览阅读861次,点赞17次,收藏16次。外链图片转存中…(img-QyYDLFCu-1713428823598)][外链图片转存中…(img-givLAm64-1713428823598)]

服务器基础知识大科普_服务器基础知识介绍(服务器全部组件)-程序员宅基地

文章浏览阅读1w次,点赞31次,收藏158次。“服务器”-互联网之魂服务器被誉为互联网之魂。我第一次见到服务器是在学校图书馆,是一种机架式服务器。第二次见到服务器是在公司机房,本期文章是对服务器进行大盘点和梳理,会介绍我拆装服务器过程,从中的学习感悟。一、服务器1.1服务器与PC机大部分程序员见到的服务器也就是云服务器,知名的那几家公司:阿里云、腾讯云…都是著名的云服务器提供厂商。在学校写个网站啥的,学生就可以优惠买买买。不过今天我们介绍的是服务器而非云服务器。在学校的时候,老师会说:“你们用的电脑也是服务器”。是的,那么现在我们来讨论,P_服务器基础知识介绍(服务器全部组件)

android5.0版本下载,安卓软件android-程序员宅基地

文章浏览阅读564次,点赞26次,收藏13次。其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。【Android思维脑图(技能树)】知识不体系?

纽约蹭饭手册:怎样利用Python和自动化脚本在纽约省钱又省心?_citi bikepython代码-程序员宅基地

文章浏览阅读227次。在家做饭不下馆子可以减少开支已经是公开的秘密。但作为一名美食天堂的国民,不下馆子几乎是不可能的。到处都是火锅店、烧烤餐厅或美味披萨店,瞅一眼这些美食,就足以摧毁大家省钱的意志力。如果你即不想让钱包当成受害者,又不想放弃美妙的用餐体验,就得自己“造”钱来支付饭费。来,跟随作者的脚步,让你走上了各种中餐、西餐、中西餐的蹭饭之路。本文作者NBC环球的数据工程师Chris Buetti,201..._citi bikepython代码

两种lca模版-程序员宅基地

文章浏览阅读534次。最值生成树lca

Chrome DevTools的performance面板查看性能_chrome devtools 上 performance 上咋查看 lcp-程序员宅基地

文章浏览阅读898次。Record 按钮打开想要记录的页面,然后重新加载页面。–> 按 Record 按钮开始一次新的记录,记录时,Record按钮变红。–> 执行页面交互,然后按 Record 按钮停止记录。记录完成后,我们可以通过以下方式去查看我们关心的那部分的数据。一次记录完成之后,可以在Summary区域查看每一项工作花费的时间............_chrome devtools 上 performance 上咋查看 lcp

推荐文章

热门文章

相关标签