如果在:before伪元素生成的内容上悬停,:hover不起作用。

5
我正在使用 css 的组合方式 :before:hover 来为按钮添加图像。
我遇到的问题是,当我悬停在 :before 元素上时,它会正确触发图像位置的更改,但并不会触发创建 :before 元素的 li:hover。我猜测这是由于 :before 元素覆盖了 li 的方式导致的,从而阻止了 :hover 被触发。
下面是一张图片更好地解释了正在发生的事情:

enter image description here

以下是我的 CSS:
.columnStat ol li {
    list-style: none;
    margin-right: 3px;
    display: inline-block;
}
ol, ul {
    list-style: none;
}

#page .columnStat ol {
    margin: 0px 8px;
    padding-top: 8px;
}

body {
    line-height: 1;
}
html, body {
    height: 100%;
}
body {
    margin: 10px 10px;
    color: rgb(35, 35, 35);
    font-family: Verdana, Helvetica, Sans-Serif;
    font-size: 0.75em;
}
a {
}
a:link {
    color: rgb(0, 102, 204);
    text-decoration: underline;
}
a:visited {
    color: rgb(0, 102, 204);
    text-decoration: none;
}
.columnStat ol > li > a, .columnStat ol > li > span {
    padding: 6px 7px 6px 20px;
    border-radius: 4px;
    border: 1px solid rgb(190, 190, 190);
    border-image: none;
    color: rgb(89, 89, 89);
    text-decoration: none;
}
.columnStat ol li a:hover{
    background-color:#7c7c7c !important;
    border:1px solid #717171;
    color:#fff;
    cursor:pointer;
    background-image:none;
}
.vbt_true:before, .vbt_false:before {
    display: inline-block;
    content: "";
    width: 15px;
    height: 28px;
    background: transparent url(http://i.stack.imgur.com/0Chc7.png) no-repeat;
    float:left;
    margin-right:-15px;
    margin-top:-4px;
    position:relative;
}
.vbt_false:before {
    background-position: 3px -1px;
}
.vbt_true:before {
    background-position: -14px -1px;
}
.vbt_false:hover:before, .vbt_false.act:before {
    background-position: 3px -31px;
}
.vbt_true:hover:before, .vbt_true.act:before {
    background-position: -14px -31px;
}

并且HTML如下:

<div id="containerAdmin">
    <div id="page">
        <div class="columnStat">
            <ol>
                <li class="vbt_true"><a href="#">Button Text</a>
                </li>
                <li class="vbt_false"><a href="#">Button Text</a>
                </li>
            </ol>
        </div>
    </div>
</div>

以下是一个可用的 fiddle 示例,点击链接即可查看: http://jsfiddle.net/wf_4/B42SH/

示例图片


2
真的吗?我已经在IE 11、Chrome和FF中进行了测试,它们都表现得一样。当你将鼠标悬停在按钮左侧时,矩形会消失,但按钮不会变灰,只有当我将鼠标悬停在右侧(文本上方)时才会发生这种情况。 - wf4
1
li:hover:beforea:hover 是两个不同的元素,行为没有问题,如果你只悬停在 <li> 上,为什么 <a> 应该反应,如果你没有在 CSS 中设置为: li:hover a?http://jsfiddle.net/B42SH/3/ - G-Cyrillus
是的,@GCyrillus发现得很好。我已经将选择器从.columnStat ol li a:hover调整为.columnStat ol li:hover a,这也解决了悬停问题,但是如果没有pointer-events: none;,它会在伪内容所在的按钮上创建一个死区。 - wf4
@GCyrillus 即使我一开始也想回答相同的问题,但正如wf4所说,它不可点击,这使得用户体验很差。 - Mr. Alien
@Mr.Alien,我只是提醒一下li:hover不会触发a:hover :),所以:before应该用在a上而不是li - G-Cyrillus
显示剩余2条评论
1个回答

9
你需要使用pointer-events: none;,这样即使你悬停在:before生成的伪元素上,它也会像悬停在普通按钮上一样。
.vbt_true:hover:before, .vbt_true.act:before {
    background-position: -14px -31px;
    pointer-events: none;
}

演示


来自Mozilla开发者网络

除了表明元素不是鼠标事件的目标外,值none还指示鼠标事件“穿过”该元素,并将目标对准该元素下方的任何内容。


你可能会发现IE浏览器的支持并不令人印象深刻(像往常一样)...

pointer-events property support table

制作:Mozilla 开发者网络


但我们始终可以使用 polyfills


1
太好了,我担心这不可能,但这是一种类型的东西,除非你知道你在寻找什么,否则你永远找不到它。谢谢,回答得很好。 - wf4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接