【问题标题】::hover doesn't work if hovered on :before pseudo generated content:hover 如果悬停在 :before 伪生成内容上则不起作用
【发布时间】:2014-04-22 15:41:17
【问题描述】:

我正在使用 css :before:hover 的组合在按钮中添加图像。

我遇到的问题是,当我将鼠标悬停在:before 元素上时,它会正确触发图像位置更改,但不会触发创建:before 元素的li:hover。 我猜这是因为:before 元素位于li 之上的方式导致:hover 无法被触发。

这里有一张图片可以更好地解释正在发生的事情:

这是我的 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/

【问题讨论】:

  • 它适用于我 - 背景颜色变为灰色。当你尝试你的小提琴时,你看到了什么不同的东西吗?
  • 真的吗?我已经在 IE 11、Chrome 和 FF 中对此进行了测试,它们的行为都相同。当您将鼠标悬停在按钮的左侧时,矩形会消失,但按钮不会变灰,只有当我将鼠标悬停在右侧(文本上方)时才会发生这种情况
  • 哦,对不起,我以为你指的是整个按钮。我的错。
  • li:hover:beforea:hover 是2个不同的元素,行为没有错,如果你只悬停&lt;li&gt;,如果你没有在CSS中将它设置为&lt;a&gt;,为什么要做出反应:@ 987654339@jsfiddle.net/B42SH/3
  • 是的@GCyrillus 很好发现。我已经将选择器从.columnStat ol li a:hover 调整到.columnStat ol li:hover a,这也解决了悬停问题,但没有pointer-events: none;,它会在伪内容所在的按钮上创建一个死点。

标签: html css pseudo-element css-content


【解决方案1】:

您需要使用pointer-events: none;,这样即使您悬停 :before 生成的伪内容,它的行为也会像您悬停在普通按钮上一样。

.vbt_true:hover:before, .vbt_true.act:before {
    background-position: -14px -31px;
    pointer-events: none;
}

Demo


来自Mozilla Developer Network

除了表明该元素不是鼠标的目标 事件,值none 指示鼠标事件“通过” 元素并以该元素“下方”的任何内容为目标。


您可能会发现对 IE 的支持并不那么令人印象深刻(和往常一样)...

致谢:Mozilla 开发者网络


但我们总是有 polyfills 可用

【讨论】:

  • 那是完美的,我担心这是不可能的,但除非你知道你在寻找什么,否则你永远找不到它。谢谢你,很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2012-09-03
  • 2016-07-08
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多