如果你需要深层浏览器支持,不要用逗号分隔 :focus-within

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费积分!

我非常喜欢 :focus-within。 它是一个非常有用的选择器,允许您在任何子元素处于焦点时选择父元素。

假设您希望在悬停 <div> 时显示一些额外内容…

div:hover .extra-stuff {
  /* reveal it */
}

这不太适合键盘操作。 但如果 .extra-stuff 中的某些内容可以被制表键(意味着可以聚焦),那么您可以这样写,使其更易于访问

div:hover .extra-stuff,
div:focus-within .extra-stuff {
  /* reveal it */
}

这很好,但它会导致一个棘手的问题。

如果浏览器不理解选择器中的任何部分,它就会忽略整个选择器。 因此,如果您正在处理不支持 :focus-within 的浏览器,它将忽略上面的 CSS 示例,这意味着您也失去了 :hover 状态。

相反

div:hover .extra-stuff {
  /* reveal it */
}
div:focus-within .extra-stuff {
  /* reveal it */
}

这更安全。 但它很重复。 如果你有一个像 Sass 这样的预处理器…

@mixin reveal {
  .extra-stuff {
     transform: translateY(0);
  }
}
div:hover {
  @include reveal;
}
div:focus-within {
  @include reveal;
}

查看 Pen
不用逗号分隔的 :focus-within 混入
by Chris Coyier (@chriscoyier)
on CodePen.

我认为这是原生 CSS 混合体的很好的用例。