Hover 悬浮延时
简介
CSS的延时操作通常使用hover,原生js的延时操作通常使用mouseover+mouseout和mouseenter+mouseleave,jQuery使用hover()方法;但是这三个方法要么不够灵敏,要么产生冒泡情况,要么随着鼠标移入移出而反复执行一个事件。本框架使用axHover插件来执行悬浮延时事件。
axHover
axHover主要是解决两个问题:
一是判断是误操作还是刻意操作。当鼠标快速经过目标时应该被当做误触发而不执行任何mouseenter或mouseover事件;当鼠标缓慢经过目标则应该视为有意识的去触发mouseenter或mouseover事件。
二是离开目标后是依然保持enter状态。比如进入目标后显示一个外围的Dom,当鼠标快速移动到这个Dom,那么应该保持Dom的显示状态。
axHover
是一个class类,需要使用new
关键字创造实例。完整写法:new axHover(elem,options),参数说明如下:
- elem:必填项,可以填"#id"、".className"、"div"等原生选择器以及Dom对象
- options:必填项,具体的参数如下:
- timeout:鼠标离开按钮后多久事件恢复初始状态,单位毫秒,默认50
- interval:在按钮上移动是检查光标坐标的间隔时间,单位毫秒,默认50。该值越小越容易触发,越大越不容易触发;因为检查间隔时间长了,光标滑动的距离自然就长了,如果大于了threshold就不会触发的。
- threshold:触发阈值,无单位,默认7,在按钮上interval时间内移动直线距离小于该值才会触发enter事件。该值越大越容易触发,越小越不容易触发;因为阈值大,所以比较容易让移动距离小于阈值,也就容易触发。
- enter:进入元素后执行的事件,是一个函数,例如function(){}
- leave:离开元素后执行的事件,是一个函数,例如function(){}
- hold:选填项,让其他元素保持enter状态,可以填"#id"、".className"、"div"等原生选择器以及Dom对象
举例:new axHover('#demo', {enter:function(){console.log('进入了')},leave:function(){console.log('离开了')}})
显示隐藏
-
<a href="###" class="ax-btn hover" inhover>显示隐藏<span>中国!</span></a>
-
new axHover("#inhover", { enter: function () { this.targetDom.querySelector('span').style.display = 'block' }, leave: function () { this.targetDom.querySelector('span').style.display = 'none' } })
-
.hover span { padding: 0 1.4rem; border: 1px solid #ebebeb; border-radius: .3rem; background-color: #fff; position: absolute; left: 0; top: calc(100% + .8rem); display: none; }
在enter和leave函数内可使用如下变量:
- this.targetDom:移动目标对象的节点
- this.hold:保持状态对象的节点
- this.options:实例的参数
阈值
如果希望提高执行enter事件的灵敏度(提高触发enter事件概率),那么可将threshold
值设高一些;如果希望降低灵敏度(降低触发enter事件概率),将threshold值设低一些;threshold默认值是7。
对于下面三个例子,可尝试让鼠标用不同速度经过按钮,对比灵敏度。
-
<a href="###" class="ax-btn hover" id="sen7">默认灵阈值7<span>中国!</span></a> <a href="###" class="ax-btn hover" id="sen20">很灵敏,阈值20<span>中国!</span></a> <a href="###" class="ax-btn hover" id="sen1">不灵敏,阈值1<span>中国!</span></a>
-
new axHover("#sen7", { threshold: 7, enter: function () { this.targetDom.querySelector('span').style.display = 'block' }, leave: function () { this.targetDom.querySelector('span').style.display = 'none' } }) new axHover("#sen20", { threshold: 20, enter: function () { this.targetDom.querySelector('span').style.display = 'block' }, leave: function () { this.targetDom.querySelector('span').style.display = 'none' } }) new axHover("#sen1", { threshold: 1, enter: function () { this.targetDom.querySelector('span').style.display = 'block' }, leave: function () { this.targetDom.querySelector('span').style.display = 'none' } })
-
.hover span { padding: 0 1.4rem; border: 1px solid #ebebeb; border-radius: .3rem; background-color: #fff; position: absolute; left: 0; top: calc(100% + .8rem); display: none; }
保持状态
使用hold
参数可以让某Dom保持enter状态,典型的用法是:当显示隐藏的元素并不在按钮内部,如果不使用hold参数,当鼠标移开按钮会自动隐藏该元素;如果使用hold参数后,当鼠标迅速移开按钮并迅速进入该元素,那么该元素依然保持显示状态(enter状态)。
-
<a href="###" class="ax-btn" id="hold">迅速移入气泡看看,还在!</a> <a href="###" class="ax-btn" id="nohold">迅速移入气泡看看,消失!</a> <div class="out" id="holdcon">稳定的中国!</div> <div class="out" id="noholdcon">消失的美国!</div>
-
new axHover("#hold", { enter: function () { document.querySelector('#holdcon').style.display = 'block'; }, leave: function () { document.querySelector('#holdcon').style.display = 'none' }, hold:'#holdcon', }) new axHover("#nohold", { enter: function () { document.querySelector('#noholdcon').style.display = 'block'; }, leave: function () { document.querySelector('#noholdcon').style.display = 'none' }, })
-
.out { margin:.8rem 0; padding: 0 1.4rem; border: 1px solid #ebebeb; border-radius: .3rem; background-color: #fff; display: none; }