【问题标题】:Chrome won't apply css hover style when left mouse button is held down按住鼠标左键时 Chrome 不会应用 css 悬停样式
【发布时间】:2011-12-24 20:14:13
【问题描述】:

在谷歌浏览器中,按住鼠标左键时不会触发 CSS 悬停状态,如下所示:

a:hover {
  color: red;   
}
<a href="http://www.jsfiddle.net">words</a>

http://jsfiddle.net/RHGG6/1/

在 FF8 或 IE9 中都不会出现此问题。这是有问题的,因为我正在实现拖放操作并使用 CSS 突出显示放置目标。我可以在 JavaScript 中非常简单地做到这一点,但对于本质上是 CSS 问题的问题,这似乎有点笨拙。有什么解决方法吗?

【问题讨论】:

标签: css google-chrome webkit


【解决方案1】:

稍微玩一下,如果在移动元素时按住左键,windows7 上的 Chrome 30.0.1599.69 m 似乎不会生成 mouseenter 事件。因此,依赖 onmouseenter 事件会得到与使用 css 相同的结果 - 也许这个(非触发)事件用于向 css 引擎发出信号需要更改某些内容。

无论如何,您只需添加代码来处理 mousemove 和 mouseout 事件。我只是用 js 设置了文本颜色,尽管切换类的东西可能是一个更好的选择。至少 js 将使用 css 应该使用的时间,所以它不会都是开销,尽管它确实很糟糕,只要鼠标移动就重做它。

也许您可以在您尝试删除的处理程序中使用 removeEventListener。如果是这样,您可以附加 js 以使用 addEventListener 处理事件,在页面加载时附加到这两个事件。当 onmousemove 事件被触发时,您可以更改样式,然后删除处理程序。然后,当 mouseout 事件触发时,您可以恢复样式并重新附加 onmove 处理程序。如果尝试从事件中删除处理程序,我不会感到惊讶,从处理程序本身内部会失败,但只能尝试。它只会向 js 添加几个字节,但会极大地提高效率(就链接而言,而不是整个页面) - 如果鼠标在链接上移动很多时可能非常糟糕到 100% - 即样式在每个进入/离开周期中被设置一次并被清除一次。

<a href="http://www.jsfiddle.net" onmousemove = "this.style.color='red'" onmouseout = "this.style.color=''">words</a>

为我工作 - 注意:仅在 win7 中使用 chrome 测试。

【讨论】:

【解决方案2】:

我也检查了 Safari 和 Opera,它们的行为就像 IE9 和 Firefox。似乎 Chrome 是唯一以这种方式运行的浏览器。我能够获得所需行为的唯一方法是使用 Javascript。 :active 伪类的建议绝对不起作用,我认为他们误解了这个问题。奇怪的是,Chrome 中的 :hover 在按住鼠标右键时起作用,而不是在按住鼠标左键时起作用。去图吧。

【讨论】:

    【解决方案3】:

    当我使用 Chrome 17.0.948.0 (Developer Build 111321) Ubuntu 10.04 将鼠标悬停在链接上时,该链接变为红色,因此您可能需要更新您的 Chrome。 在相关的说明中,:hover 伪类适用于被鼠标指针悬停的元素。要在单击链接时按住鼠标按钮时应用样式,请使用 :active 伪类。我不确定为什么 FF 和 IE 的行为不同。

    【讨论】:

      【解决方案4】:

      当您按下鼠标左键时,该元素不应该处于活动状态吗?这里的区别在于 Firefox 和 IE 允许从悬停状态继承活动状态,而 Chrome 不允许。在 CSS 中,可以使用 :active 伪类来控制活动状态。您需要显式设置活动状态的样式,以确保浏览器之间的一致性。

      【讨论】:

        【解决方案5】:

        现在(2018 年),虽然该错误仍然存​​在于 Chrome 中,但您可以使用 HTML5 拖放的 dragenterdragleave 事件解决它。如果你有一个嵌套的 dom 元素,你可以应用一个计数器来减轻鼠标移到子元素上时发生的 dragleave 事件。

        var h1 = document.querySelector('h1')
        var counter = 0
        h1.ondragenter = _=> ++counter && h1.classList.add('dragover')
        h1.ondragleave = _=> --counter || h1.classList.remove('dragover')
        span { font-style:italic }
        h1:hover { color:red }
        h1.dragover { color:blue }
        <h1>hover over me<span>, and me</span></h1>
        <h2 draggable=true>drag me</h2>

        【讨论】:

          【解决方案6】:

          您正在寻找 :active 伪类。 :hover 只会在节点被鼠标悬停时激活。 :active 只会在节点被选中或点击时触发。

          这是 jsFiddle:http://jsfiddle.net/RHGG6/21/

          【讨论】:

          • 不知道为什么有人赞成这个。它没有解决问题(猜肖恩误解了)。
          猜你喜欢
          • 2015-05-21
          • 1970-01-01
          • 2014-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多