手写一个需要 DOM 事件操作的 Hover 菜单功能

2021-08-13 · 周五烦躁

今天的工作任务,原本只有九点会议提到的 WP 项目里面的 Hover 菜单(这是重点),之后被测试发现了 2 个新问题,于是也变成了今天的任务了。

这个 Hover 菜单挺难搞的,因为除了要考虑到电脑端,还得考虑移动端。移动端相对简单一些,弄一个 Fixed 的弹出框,实现一个点击直接访问,长按弹出菜单的效果就可以了。

CodeSandbox 传送门

长按的实现其实就是一个定时器,点击的时候激活,如果长按就会设置一个长按的状态,在松开的时候进行检查。长按弹出菜单,没长按就模拟成「单击」的方式,执行指定操作(这里不能恢复 DOM 的默认操作,有没有大神指点给个更好的办法)

PC 端就更难搞了,因为需要将菜单使用 Absolute 定位到每个项目里面,且需要保证鼠标移出项目之后进入菜单,保证菜单不会消失。正常思路鼠标离开了项目就得认为“需要隐藏菜单”,但是如果我把鼠标移动到了菜单呢?怎么保证它不会消失?

后续:已经专门为此又写了一篇博文《使用原生 JS 写一个悬浮下拉菜单》做记录

一开始我使用的是 onmouseout 事件设置在项目上,实践证明这个事件是错误的,会导致「存在子元素的父元素」从父元素移到其子元素上也会触发。正确方式是使用 onmouseleave 替代,而保证移入到菜单里面不消失,是 @Shawn 给了我启发,这里也需要使用定时器。

大概思路就是,我将鼠标移出项目之后,并不会立即执行隐藏菜单,而是先设置一个 300ms 的定时器。(是不是和上面移动版长按的效果差不多?)此时如果我把鼠标移到了菜单,会设置一个标记为 true 的变量,此时定时器执行,检测到变量为 true,就跳过隐藏菜单的动作了。

为了保证下次设置定时器不会串,需要在鼠标移入到项目的时候就清除一次定时器,避免因为标记变量还原为 false 以及定时器仍然存在的情况。你可能会问为什么不在设置定时器那里取消,如果延时之后才取消,就会状态异常(不经过菜单直接离开 A,再进入 B,300ms 时间以内 A 下的定时器就仍然存在),导致下一次显示菜单还没出来多久就消失了。

移动端长按弹菜单
Paul

Paul

特立独行的一只前端菜狗。这篇日记编写大概耗时了 0 分钟,内容均为个人原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!如本站内容对你有所帮助的话,不妨 捐助支持 一下?

近期评论

鲍小螺: 前辈多多指教!ahu: 后生可畏寻梦xunm: 真不错,板子很好看。timochan: 太惨了( ,更新暴毙,如果恢复没成功,数据也 dump 不出来鲍小螺: 在这部分对话中,广树和保罗继续讨论生活的不同方面。保罗提到了技术更新和国内的优秀 IT 技术。广树解释了在国内积累的经验如何在日本产生穿越的感觉,并表达了对于日本生活节奏的喜爱。他还提到了医疗水平的差异和对于生活方式的感受。保罗表示,通过动漫和现实的对比,艺术来源于现实,日本生活的确有着独特之处。他们讨论了国内的生活节奏和就医等方面的压力,以及个人选择的自由。最后,他们也谈到了不结婚不买房的选择和对于房价的困扰。鲍小螺: 该对话进一步讨论了房地产和税收的问题。保罗提到了国内的房地产税和增值税以及日本的固定资产税。广树解释了日本房地产税的收取方式,以及房产税对于国内房产的影响。他认为,与国内相比,日本的房子质量和服务更好。保罗提出疑问,为什么自己拥有的地也要交税。广树解释了类似增值税的原理,并指出在日本拥有房产是稳定安全的。最后,保罗表示从广树的角度来看,情况确实是如此。鲍小螺: 这篇文章的聊天记录也尝试过用 GPT 总结,结果并不是太好,不知道是不是 Prompt 的问题,实际出来的内容过于简练了,于是又耗费了半小时写完,呼~
奇趣音乐盒技术源于 Kico Player
Emmm,这里是歌词君