个人主页:《爱蹦跶的大A阿》
当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》
鼠标移动是用户界面中非常重要的交互行为。学习区分不同的鼠标移动事件,可以帮助我们更准确地处理鼠标活动,创建出色的用户体验。
本文将详细介绍 mousemove、mouseover/out 以及 mouseenter/leave 事件之间的区别,并通过示例说明在何种场景下使用每个事件。准备好学习后,你将能够自由控制各种鼠标事件。
本文介绍 mousemove
,mouseover
/mouseout
,mouseenter
/mouseleave
的区别。
当鼠标移动时重复触发。
ball.onmousemove = function(event) {
let newTop = event.clientY - ball.clientHeight / 2;
let newLeft = event.clientX - ball.clientWidth / 2;
ball.style.left = newLeft + 'px';
ball.style.top = newTop + 'px';
};
当鼠标穿过任意子元素也会触发:
鼠标移入移出 只有穿过最外层元素自身边界时才触发: 内部元素移动不影响。 这更符合实际需要。 对于嵌套 鼠标事件对象包含鼠标位置信息: client坐标会随滚动变化,page坐标保持不变。 所有鼠标事件默认会冒泡。如果需要阻止冒泡可以使用: 这可以实现比如 hover 效果时防止触发底层事件。 理解不同鼠标事件的触发规则,可以防止事件混淆,也让我们可以选择最符合需求的事件。 本文不仅区分了 mousemove、mouseover 和 mouseenter 的区别,也介绍了事件对象的坐标属性,以及如何兼容老版本 IE 浏览器。希望通过这个博客,大家可以彻底掌握各种鼠标事件的使用场景。如果还有疑问,欢迎在评论区讨论。 也会触发
mouseenter/mouseleave
div.onmouseenter = () => alert(`Entered DIV`);
div.onmouseleave = () => alert(`Left DIV`);
嵌套 div
事件对象属性
elem.onmousemove = function(e) {
// e.pageX, e.pageY是基于文档
// e.clientX, e.clientY是基于视口
};
阻止冒泡
elem.onmouseover = function(e) {
e.stopPropagation();
};
跨浏览器问题
mouseenter/leave
事件不是 IE8 以下版本支持,需要通过 mouseover/out
兼容:function handleEnter() {
// 鼠标进入时处理函数
}
elem.addEventListener('mouseover', function(e) {
if (!isDescendant(elem, e.relatedTarget)) {
handleEnter();
}
})
✨ 结语