CSS中是否存在`pointer-events:hoverOnly`或类似的东西?


103

刚刚在玩pointer-eventsCSS中的属性。

div想让所有鼠标事件都不可见,除了:hover

因此,所有单击命令都将div转到其下一个,但div可以报告鼠标是否在其上方。

谁能告诉我是否可以做到?

HTML:

<div class="layer" style="z-index:20; pointer-events:none;">Top layer</div>
<div class="layer" style="z-index:10;">Bottom layer</div>

CSS:

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

2
只是一个注释,在IEpointer-events中没有很好的支持
Vucko 2014年

2
听起来您需要使用JavaScript
Pete 2014年

与皮特同意,我知道这是专门要求的CSS,但有同样的问题。对我来说最简单的解决方案是只是有孩子发起点击使用JavaScript向父stackoverflow.com/questions/35872534/...
杰里沙

Answers:


12

我认为仅凭CSS不可能实现您的目标。但是,正如其他贡献者所提到的那样,在JQuery中做起来很容易。这是我的操作方法:

的HTML

<div
  id="toplayer"
  class="layer"
  style="
    z-index: 20;
    pointer-events: none;
    background-color: white;
    display: none;
  "
>
  Top layer
</div>
<div id="bottomlayer" class="layer" style="z-index: 10">Bottom layer</div>

CSS(不变)

.layer {
    position:absolute;
    top:0px;
    left:0px;
    height:400px;
    width:400px;
}

jQuery查询

$(document).ready(function(){
    $("#bottomlayer").hover(
        function() {
            $("#toplayer").css("display", "block");
        },
        function() {
            $("#toplayer").css("display", "none");
        }
    );
});

这是JSFiddle:http : //www.jsfiddle.net/ReZ9M


107

仅悬停。这很容易。没有JS ...也防止链接默认操作。

a:hover {
	color: red;
}
a:active {
	pointer-events: none;
}
<a href="www.google.com">Link here</a>

编辑:在IE 11及更高版本中受支持 http://caniuse.com/#search=pointer-events


23
这确实行得通-但是它不允许单击下面的某个元素(至少当该元素是YouTube视频时不允许如此)-这可能是所有人首先需要该行为的唯一原因
Simon_Weaver

1
这是否不需要单击该元素以禁用进一步的指针事件?
Mindwin '16

3
这是
beutifull

2
@PriyanshuJain如果用户单击按钮,您会怎么想?
СвободенРоб

1
聪明的💐(我只想说)
Davious

24

“窃取” Xanco的答案,但没有那种丑陋,丑陋的jQuery。

摘要:注意DIV的顺序相反

.layer {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 400px;
  width: 400px;
}

#bottomlayer {
  z-index: 10
}

#toplayer {
  z-index: 20;
  pointer-events: none;
  background-color: white;
  display: none
}

#bottomlayer:hover~#toplayer {
  display: block
}
<div id="bottomlayer" class="layer">Bottom layer</div>
<div id="toplayer" class="layer">Top layer</div>


2
抱歉,我还是使用丑陋的jQuery。但是请支持仅CSS解决方案!
Jimmery 2014年

这很好-仅供参考,不幸的是,如果底层包含iframe,它就无法正常工作:jsfiddle.net/ReZ9M/82
Simon_Weaver

1
这如何解决这个问题?OP要求点击命令通过最初可见的元素。在您的解决方案中,它们不会,请注意如何无法突出显示“顶层”文本...
Trever Thompson

6

您还可以检测到不同元素上的悬停并将样式应用于其子元素,或使用其他css选择器(如相邻的子元素等)。

这取决于您的情况。

在父元素上悬停。我这样做:

.child {
    pointer-events: none;
    background-color: white;
}

.parent:hover > .child {
    background-color: black;
}

1

我使用:hover大小相等的父/容器的伪元素来模拟覆盖div上的鼠标悬停,然后将覆盖设置为pointer-eventsnone以将点击传递给下面的元素。


0

针对您的请求的纯CSS解决方案(opacity属性仅用于说明过渡的必要性):

.hoverOnly:hover {
    pointer-events: none;
    opacity: 0.1;
    transition-delay: 0s;
}
.hoverOnly {
    transition: ,5s all;
    opacity: 0.75;
    transition-delay: 2s;
}

它能做什么:

当鼠标进入该框时,它将触发:hover状态。但是,在该状态下,指针事件被禁用。

但是,如果您未设置转换计时器,则div会在鼠标移动时取消悬停状态。当鼠标在元素内移动时,悬停状态将闪烁。您可以通过将上面的代码与opacity属性一起使用来感知这一点。

设置从悬停状态过渡的延迟可以解决该问题。2s可以调整该值以满足您的需求。

学分转换调整:patad这个答案


当我尝试此解决方案时,该元素只是停留在“悬停”状态。
Flimm

0

只是纯CSS,不需要jquery

div:hover {pointer-events: none}
div {pointer-events: auto}

嗨-非常感谢您-您可以在答案中添加一个演示(例如代码段或在Codepen或jsfiddle中对此的链接吗?)-您知道它具有什么样的兼容性吗?这是CSS3的新功能吗?如果这样做有效,我一定会给您打个勾:)
吉米(Jimmery)

抱歉,我无法创建演示。但是按照我的逻辑,它绝对可以在所有浏览器上运行(我不知道ie,因为我没有ie)。并且,它得到css1的支持:)
Bariq Dharmawan

caniuse.com/#feat=pointer-events-在11以外的任何IE中都无法使用...如果您在这里创建了一个实际的演示示例,那么codepen.io我会为您测试,如果可以,我会为您提供正确的答案-抱歉,我不能将其授予理论代码-仅是一个有效的演示
Jimmery 18'Jan

@brillout您可以添加一个代码段吗?BCZ它的工作对我来说
Bariq Dharmawan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.