【问题标题】:Mouseover/mouseout, mouseenter/mouseleave, hover flickering issueMouseover/mouseout、mouseenter/mouseleave、hover 闪烁问题
【发布时间】:2011-09-06 22:33:03
【问题描述】:

我有一个 div,里面有一张图片。当我悬停图像时,我创建了一个绝对定位在图像的一部分上的工具提示 div(绝对位置很重要)。它包含标题和替代文本。

这一切都很好,直到您将鼠标悬停在工具提示框上。它不会冒泡,它认为我不再将鼠标悬停在图像上,从而使工具提示框消失。但随后它注册我再次悬停图像,它在显示工具提示框和隐藏它之间来回切换。

因此闪烁问题。

在 SO 上有很多关于闪烁问题的帖子,我尝试了很多解决方案,但都没有奏效。我尝试过 Mouseover/mouseout、mouseenter/mouseleave、hover,甚至将 live() 与它们结合使用。我什至从从头开始创建工具提示切换到在那里有空的 div,这样当页面加载时它会在 DOM 中,以防出现问题。我真的不知道该怎么办了。这是我目前的代码。

$("img").bind("mouseover", function() {
    var pimg = $(this);
    var position = pimg.position();
    var top = position.top;
    var left = position.left;
    var title = $(this).attr('title');
    var alt = $(this).attr('alt');
    $('.toolTip').css({'left' : left, 'top' : top, 'width' : width}).append('<div><h3>' + title + '</h3><p>' + alt + '</p></div>');
});

$("img").bind("mouseout", function() {
    $('.toolTip').empty();
});

【问题讨论】:

    标签: javascript hover mouseover mouseout


    【解决方案1】:

    问题是 a) 您需要使用 mouseenter / mouseleave 和 b) 工具提示 div 需要存在于具有 mouseenter / mouseleave 侦听器的元素内。

    例如:

    <div id="mouseoverdiv">
    <div class="tooltip">some text</div>
    <img src="" />
    </div>
    

    【讨论】:

    • 我已经尝试过 mouseenter/mouseleave 解决方案(如标题中所述),但我没有尝试将侦听器提升到更高的元素。正如您从我的示例中看到的那样,我已将其附加在图像上。我将把它移到共享父级并切换到 mouseenter/mouseleave 并在一个小时左右回来告诉你它是如何进行的。
    • 快速问题,我直接定位img,因为div中有几个相邻的图像,如果监听器在父级上,我如何定位鼠标悬停的图像?跨度>
    • 是的,埃特特!我很确定您闪烁的原因是因为使用 mouseenter / mouseleave 冒泡仅在子元素包含在具有侦听器的元素中时才有效。当您将工具提示悬停在上面时,它会注册为鼠标离开,因为工具提示元素不在图像标签“内部”(因为它不应该是)。然后,当提示消失时,砰的一声,你的图像再次出现。
    • 您必须为每个图像设置一个 div... 对待每个 div 您现在如何处理每个图像。对它进行 CSS 处理,这样 div 的大小就足以容纳每个图像而没有任何多余的空间,它应该可以按照您的意愿工作。
    • 您可能需要“位置:相对;”在每个容器 div 上,以便工具提示不会将其自身定位在窗口上的 0,0 处。我认为规则是,如果您不指定坐标,则父元素不需要是相对的。如果您为绝对工具提示提供坐标,则 div 需要是相对的。
    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多