【问题标题】::hover triggered directly after page reload on Firefox (but not on Mac OS X Chrome):hover 在 Firefox 上重新加载页面后直接触发(但不是在 Mac OS X Chrome 上)
【发布时间】:2017-01-15 04:04:25
【问题描述】:

请使用 a) Firefox 和 b) Chrome 检查 this codepen。进行如下操作:

  1. 在链接上移动鼠标
  2. 点击链接后鼠标光标不要移动
  3. 等待页面重新加载。

如果你没有移动鼠标光标,页面重新加载后它仍然会在链接上方。

Firefox 现在将应用 :hover 样式。

Chrome (Mac OS X) 将以非悬停状态显示元素(这是我在我的场景中更喜欢的)。

这里有没有人知道哪个浏览器做得对,以及如何让一个浏览器模仿另一个浏览器的行为?

对于我目前的情况,我想知道如何避免在页面重新加载后直接触发:hover。如果我不得不为此求助于 Javascript,我会很不高兴。

为了完整起见,这里是演示的代码:

<a href="https://codepen.io/connexo/pen/pEJbqj" target="_top">This Codepen</a>
a {
  color: #333;
  background-color: #ddd;
  display: inline-block;
  line-height: 40px;
  padding: 20px;
  text-decoration: none;
  transition-duration: .4s;
  &:before {
    content: "non-hovered";
  }
  &:hover {
    background-color: #a00;
    color: white;
    &:before {
      content: "hovered state";
    }
  }
}

编辑:正如我的一位同事刚刚告诉我的,Chrome 似乎只在 OS X 上以所述方式运行,而在 Windows 上则不然。有人可以详细说明整个问题吗?

【问题讨论】:

  • 我可能做错了,但在 FF 48.0.1 上,只要我悬停,样式就会被应用(在过渡时间之后),并且单击链接不会重新加载页面

标签: html css hover


【解决方案1】:

哪种行为是正确的?

很难说哪个是正确的行为,因为 W3C 规范没有详细介绍 :hover 伪类的机制:

:hover 伪类在用户使用指针设备指定元素时应用,但不一定激活它。例如,当光标(鼠标指针)悬停在元素生成的框上时,可视用户代理可以应用此伪类。

The user action pseudo-classes :hover, :active, and :focus

考虑到具体情况,这两种行为似乎都是合理的。

如何避免在页面重新加载后直接触发:hover

在这种特殊情况下,您似乎希望在用户移动鼠标之前禁用悬停状态,为此您可以执行以下操作:

  • 将 CSS 属性 pointer-events: none; 添加到页面加载链接。这将禁用链接上的任何鼠标事件
  • 将移动事件附加到body,当用户移动鼠标时激活一次(之后鼠标解除绑定)
  • 在链接上的移动事件中设置pointer-events: auto;以启用鼠标事件

$("a").css("pointer-events", "none");
$("body").one("mousemove", function() {
  $("a").css("pointer-events", "auto");
});
a {
  color: #333;
  background-color: #ddd;
  display: inline-block;
  line-height: 40px;
  padding: 20px;
  text-decoration: none;
  transition-duration: .4s;
}
a:before {
  content: "non-hovered";
}
a:hover {
  background-color: #a00;
  color: white;
}
a:hover:before {
  content: "hovered state";
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" target="_top"></a>

鉴于默认情况下堆栈片段是折叠的,因此最好在 CodepenJS Fiddle 中查看该示例。

【讨论】:

  • 感谢您的详细解答。所以我假设你也没有看到没有 Javascript 的解决方案?
  • 没什么可想到的@connexo,我觉得如果有解决方案,它将取决于pointer-events,但我想不出不使用 JavaScript 的方法来取消它。
  • 现在我即将实施建议的解决方案,疑虑爬上了我的脑海。指针事件不会以这种方式在触摸设备上保持禁用状态吗?如果是这样,将touchmove 添加到mousemove 到触发事件列表中是否是解决此问题的正确事件?
  • 嗯,这是一个很好的观点,事实上我没有考虑过。 I've amended the snippet 在调用 mousemove 时输出文本,并且它确实在移动设备上被触发(至少在 Chrome 和我的三星 S5 上的股票浏览器中)。我没有方便的 iPhone 或 iPad 来测试它们,所以如果它们不起作用 touchmove 听起来像是一种合理的方法。另一种选择可能是添加对触摸事件支持的检查并相应地打开/关闭代码。有关更多信息,请参阅 stackoverflow.com/a/20293441/3400962 并在实践中查看 jsfiddle.net/chnk8t95/4
猜你喜欢
  • 2012-03-23
  • 1970-01-01
  • 2011-02-02
  • 2012-11-16
  • 2015-07-07
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2019-01-23
相关资源
最近更新 更多