是否有与 :hover 相反的 CSS 伪 class?

Is there an opposite CSS pseudo-class to :hover?

CSS中是否有伪class来指定

:not(:hover)

或者这是指定未被悬停的项目的唯一方法吗?

我浏览了几个 CSS3 参考资料,但我没有看到 CSS 伪 class 来指定 :hover.

的对立面
a {
  /*styles*/
} 

正常(非悬停link)

a:hover {
  /*styles*/
} 

悬停link

是,使用:not(:hover)

.child:not(:hover){
  opacity: 0.3;
}

.child {
  display: inline-block;
  background: #000;
  border: 1px solid #fff;
  width: 50px;
  height: 50px;
  transition: 0.4s;
}

.child:not(:hover) {
  opacity: 0.3;
}
<div class="parent">
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

另一个例子;我想你想:“当一个元素悬停时,使所有其他元素变暗”

如果我的假设是正确的,并且假设您所有的选择器都在同一父级中:

.parent:hover .child{
  opacity: 0.2;      // Dim all other elements
}
.child:hover{
  opacity: 1;        // Not the hovered one
}

.child {
  display: inline-block;
  background: #000;
  border: 1px solid #fff;
  width: 50px;
  height: 50px;
  transition: 0.4s;
}

.parent:hover .child {
  opacity: 0.3;
}

.parent .child:hover {
  opacity: 1;
}
<div class="parent">
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
</div>

否则...只需使用默认逻辑:

.child{
  opacity: 0.2;
}
.child:hover{
  opacity: 1;
}

没有这样的伪class。不需要,只要使用 :not(:hover) 即可。 :not() pseudo-class 的全部要点是允许作者编写否定,而不必为每个现有的(和未来的)动态 pseudo-class 指定单独的否定,其中元素只能匹配或不匹配伪class.

例如,只有一些元素可以是 :enabled:disabled — 大多数元素都不是 因为语义根本不适用 — 但是元素只能由定点设备指定 (:hover),或不指定 (:not(:hover))。提供已经可以使用 :not() 直接实现的否定会极大地破坏它的实用性(尽管它仍然可以用来否定任何其他简单的选择器——或者 entire complex selectors 在路上)。

关于这种伪class 计算成本更低的论点是非常站不住脚的。这种伪 class 最天真的实现是文字 :not(:hover) 检查,这也好不到哪里去。任何更复杂或优化的实现,你要求供应商实现一个伪 class,它与 :not(:hover) 一样快,甚至更快,考虑到另一个用例,这已经很不常见了您可以轻松访问的选项,例如级联和 :not(:hover)(当级联不是一个选项时)。它根本没有证明花时间和精力来规范、实施和测试至少一种其他现有方法的替代方法是 100% 功能等效的(并且适用于 至少 80 % 的情景)。还有这样一个伪class的命名问题——你还没有给它起名字,我也想不出一个好的名字。 :not-hover 仅缩短了两个字节,并且键入的工作量也仅略微减少。如果有的话,它可能比 :not(:hover).

更令人困惑

如果您担心特异性,请注意 the :not() pseudo-class itself is not counted for specificity; only its most specific argument is:not(:hover):hover 同样具体。所以特异性也不是问题。

如果您担心浏览器支持,如果引入这样的伪 class,可能会与 :not() 一起引入,或者在更高级别的选择器中引入,因为它没有' 出现在 CSS2 中(其中 :hover 于 17 多年前首次引入,并在一年前首次在 IE4 中实现)。在以后的级别中引入它是没有意义的,因为作者将被迫继续使用 :not(:hover),直到浏览器开始实施这个新的伪 class,并且他们没有理由切换。

请注意,这与以下讨论事件与状态的问题不同(最初是关于 :focus 而不是 :hover,但适用相同的原则):Does CSS have a :blur selector (pseudo-class)?

如果你只想在悬停在其他东西上时显示一些东西,你可以使用

selector:not(:hover)

像这样:

section{
   font-size:3em;
}

div:not(:hover) + section{
 display:none;
}
<div>Hover on me</div>

<section>Peek A Boo!</section>

在使用 :not() 时,有几个 不寻常的效果 和结果需要牢记:

  • :not(:not(...)),:not(p::before)不可能
  • :not(*) 显然永远不会被应用
  • :not(.foo) 将匹配任何非 .foo 的内容,包括 <HTML><body>
  • 等标签
  • 增加规则的特异性,例如:#foo:not(#bar) 将匹配与更简单的 #foo 相同的元素,但具有更高的特异性。

and:not 的运算:

  • 不是 <div> 且不是 <span> 元素的元素: body :not(div):not(span){}

or:not 的操作,目前还没有得到很好的支持。

  • 不是 .crazy.fancy 的元素:body :not(.crazy, .fancy){}

来源MDN