javascript - 'mouseenter' 和 'mouseleave' 事件不断以 div 作为光标触发
问题描述
我通过隐藏用户光标并显示原始光标通常会显示在屏幕上的 div 来制作“自定义光标”。
现在的问题是我想在将鼠标悬停在元素上时添加一些动画(例如缩放“光标”,或者在这种情况下是充当光标的 div)。
在这个例子中,我制作了一个按钮,并给它一个“mouseenter”和“mouseleave”事件。
当您用光标输入按钮时,我 console.log("enter");
当您离开按钮时,console.log("leave");
您可以很快看到问题:当鼠标悬停在按钮上时,这两个事件被多次触发,而光标实际上并没有离开元素。
另请注意,当您非常缓慢地悬停到左侧或顶部(直线)时,不会发生此问题,这可能是因为“left:e.pageX and top:e.pageY”脚本中的一段代码。
你能做些什么来解决这个问题,以便两个事件正确触发?
$(document).ready(function() {
var cursor = $(".cursor");
/* Cursor */
$(document).on("mousemove", function(e) {
cursor.css({
left: e.pageX,
/*Or clientX and clientY */
top: e.pageY,
});
});
/* Button */
$(".btn").on("click", function(e) {
e.preventDefault();
});
$(".btn").on("mouseenter", function() {
console.log("entered");
});
$(".btn").on("mouseleave", function() {
console.log("left");
});
});
* {
cursor: none;
}
.cursor {
width: 10px;
height: 10px;
border-radius: 50%;
position: absolute;
background-color: black;
}
.btn {
text-decoration: none;
font-family: sans-serif;
font-weight: bold;
text-transform: uppercase;
color: black;
background-color: white;
border: 4px solid black;
padding: 0.5rem 0.8rem;
display: inline-block;
margin: 100px 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<!--Button-->
<div class="center marginB">
<a id="startChat" class="btn">Button</a>
</div>
<!--Cursor-->
<div class="cursor"></div>
解决方案
添加pointer-events: none
到您.cursor
以使光标(黑点)永远不会成为任何鼠标事件的目标,因此它永远不会影响鼠标进入和鼠标离开事件。您可以在此处阅读有关指针事件的更多信息
请参阅下面的工作示例:
$(document).ready(function() {
var cursor = $(".cursor");
/* Cursor */
$(document).on("mousemove", function(e) {
cursor.css({
left: e.pageX,
/*Or clientX and clientY */
top: e.pageY,
});
});
/* Button */
$(".btn").on("click", function(e) {
e.preventDefault();
});
$(".btn").on("mouseenter", function() {
console.log("entered");
});
$(".btn").on("mouseleave", function() {
console.log("left");
});
});
* {
cursor: none;
}
.cursor {
width: 10px;
height: 10px;
border-radius: 50%;
position: absolute;
background-color: black;
pointer-events: none;
}
.btn {
text-decoration: none;
font-family: sans-serif;
font-weight: bold;
text-transform: uppercase;
color: black;
background-color: white;
border: 4px solid black;
padding: 0.5rem 0.8rem;
display: inline-block;
margin: 100px 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!--Button-->
<div class="center marginB">
<a id="startChat" class="btn">Button</a>
</div>
<!--Cursor-->
<div class="cursor"></div>
推荐阅读
- c# - 如何将以下 C# lambda 表达式拆分为单独的方法?
- methods - 为什么在另一个方法中无法访问方法的返回值
- python - 如何将其绘制为散点图?
- module - 无法在 Utop 中使用 Float 模块
- objective-c - 如何保存和读取钥匙串中的 RSA 密钥?
- javascript - 用于浏览器应用程序的 JavaScript 中的状态图 xml 处理器
- maven - 在提交 Maven 项目的 Apache Storm 拓扑时激活配置文件(无需重新编译)
- ruby - 为什么我会收到类型错误:如果 max == ele % 0,则无法将第 11 行的范围强制转换为整数?
- c - 哪个更快:静态数组与非静态数组?
- python - 将 pyqt 按钮移出按钮列表