【问题标题】:Hover not right when element moves元素移动时悬停不正确
【发布时间】:2014-10-15 01:58:08
【问题描述】:

我有一个动态 div,我想知道鼠标何时悬停在这个 div 上。我尝试了.is( ':hover' ),但没有用。

jsFiddle demo

在演示中,我制作了一个移动的 div,如果我不移动鼠标,则永远不会调用日志,但如果我手动将鼠标悬停在框上,它总是会写入日志。

从不将日志写入控制台。

总是在控制台写日志,连盒子都没了。

这是一个错误还是我犯了一个错误?如何正确检测悬停?

【问题讨论】:

  • onmouseover 对您有帮助吗?那是你要找的吗?您能否更清楚地提及您的期望?
  • 我必须知道鼠标是否在创建的对象上,但我还没有移动鼠标。
  • 检查这个jsbin,有帮助吗
    jsbin.com/dorufe/2/edit?html,css,js,console,output
  • 看来:hover 伪类只在鼠标移动时更新。您可能需要在每次更新以手动检查悬停时将鼠标位置与框位置进行比较。
  • @Wishy - 如果你对鼠标保持坚定,则不起作用

标签: javascript jquery html css hover


【解决方案1】:

您应该使用mousemove() 事件跟踪鼠标移动,并检查鼠标在 div 移动时的最后已知位置。

例子:

HTML 和 CSS:

.red-box {
    display : inline-block;
    position : absolute;
    width : 50px;
    height : 50px;
    top : 10px;
    left : 0px;
    background-color : red;
}
#wrapper {
    height: 100vh;
    width: 100vw;
}

<div id="wrapper">
    <div class="red-box"></div>
</div>

JavaScript:

var posX = 0;
var step = 10;
var maxX = 200;
var mouseX = -1;
var mouseY = -1;
var entered = false;
var $box = $('.red-box');

setInterval(function () {
    posX += step;
    if (posX >= maxX) 
        posX = 0;
    $box.css("left", posX);

    var top = $box.offset().top;
    if (mouseX >= posX && mouseX <= (posX + $box.width()) && mouseY >= top && mouseY <= (top + $box.height())) {
        console.log("mouse entered");
        entered = true;
    } else if (entered) {
        console.log("mouse left");
        entered = false;
    }
}, 500);

$("#wrapper").on("mousemove", function (e) {
    mouseX = e.pageX - $(this).position().left;
    mouseY = e.pageY - $(this).position().top;
}).on("mouseleave", function()
{
    mouseX = -1;
    mouseY = -1;
});

FIDDLE

编辑:向包装器添加了一个新的 mouseleave() 事件。

【讨论】:

  • zinned 这个想法很棒,但最后我意识到它不能正常工作。在你的小提琴中尝试这个,将鼠标保持在矩形的路径上,并尝试将它移出窗口,沿着矩形移动的同一行路径。因此,即使鼠标移出窗口,鼠标最后存储的值仍然指向路径行。所以 mouseenter 和 mouseleave 仍然会被击中
  • 解释更好地保持鼠标在矩形移动的路径上,然后在你的小提琴中从结果窗口水平移动到 javascript 窗口。所以最后记录的鼠标移动指向你的结果窗口中最左边的点。当矩形重置或再次从左侧开始其旅程时,鼠标进入和离开将被击中。
  • @Wishy 我已经更新了答案。包装器 div 上的 mouseleave 事件将抵消这种行为。
  • 完美。大声笑我尝试了更长的方法,但是当鼠标移出更快时遇到了问题。你的更新答案应该可以完美jsfiddle.net/wishy/ywr1kb2z/1
猜你喜欢
  • 2018-03-04
  • 2019-12-29
  • 2012-12-28
  • 2016-01-21
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多