防止伪元素触发悬停?

Posted

技术标签:

【中文标题】防止伪元素触发悬停?【英文标题】:prevent a pseudo element from triggering hover? 【发布时间】:2013-05-16 05:07:22 【问题描述】:

如果我有标记:

<div class="a b"></div>

.a 类有一个与之关联的悬停类

并且 .b 类有一个与之关联的伪元素......就像这样:

div

    width: 100px;
    height: 100px;

.a  background: red; display: inline-block; 
.a:hover  background: green; 

.b:after

    content: '';
    display: inline-block;
    width: 100px;
    height: 100px;
    margin-left: 100px;
    background: pink;

是否可以使用 css 来防止伪元素触发 .a 类悬停?

FIDDLE

【问题讨论】:

你能提供一下你想要什么以及你拥有什么的快照吗? Afaik 这是不可能的,因为伪元素是真实元素的子元素。 not 选择器有帮助吗? 【参考方案1】:

以下 css 为现代浏览器解决了问题(not IE10-):

.b:after 
  pointer-events: none;

pointer-events: none 允许元素不接收悬停/点击事件。

见this fiddle。


注意

pointer-events 对非 SVG 元素的支持处于相对早期的状态。 developer.mozilla.org 给你以下警告:

在 CSS 中对非 SVG 元素使用指针事件是 实验性的。 该功能曾经是 CSS3 UI 草案的一部分 规范,但由于许多未解决的问题,已推迟到 CSS4。

Chrome 对display: inline-block 的盒模型解释导致the above fiddle 闪烁。 如果您改用display: block,您将获得对该框的正确解释。 Firefox 没有这个问题。 为确保一致的盒模型解释,请使用以下内容:

.b:after 
  pointer-events: none;
  display: block;

在 Chrome 中查看 this fiddle 以查看闪烁效果。

【讨论】:

嗯,这是个好主意,但我看到了闪烁……有什么想法吗? 嗯,我看不到闪烁。您使用哪种浏览器/操作系统? 我在 windows7 上使用 chrome @tessi 我刚刚注意到一些事情:如果我从 bottom 悬停到 .b:after - 那么我会得到闪烁,但如果我从其他方向悬停到它- 我不明白闪烁。去图吧。 我可以在 Chrome 中重现这个(使用 Linux)。 Firefox 完美运行。可能是 chrome(ium) 错误(尽管我在他们的错误跟踪器中找不到匹配的问题)。结论:最好不要在跨浏览器生产代码中使用pointer-events

以上是关于防止伪元素触发悬停?的主要内容,如果未能解决你的问题,请参考以下文章

防止伪元素触发滚动

在悬停一个伪元素时,让另一个伪元素出现?

如何为伪元素制作悬停效果?

如何调试悬停等伪元素?

css 闪亮的动画悬停伪元素

jQuery设置另一个项目的css“颜色”元素覆盖了它的悬停伪类