You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在子元素含active类时为li元素添加hover伪元素效果?

问题解决:悬停li且内部Link含active类时显示li的::after伪元素

问题场景

想要实现:鼠标悬停在<li>元素上,且其内部的Link组件(渲染为<a>标签)带有active类时,显示该<li>的::after伪元素。

原CSS选择器:

.sidebar__content-link.active li:hover::after {
  display: block;
  content: attr(data-after);
}

单独使用li:hover::after时有效,但组合条件后失效。对应React渲染的HTML结构:

<li data-after={element}>
  <Link
    href={`/${element}`}
    className={`sidebar__content-link ${isSidebarOpen ? 'active' : ''}`}
  >
    {element}
  </Link>
</li>

问题原因

你写的CSS选择器层级顺序完全搞反了。.sidebar__content-link.active是<li>的子元素,而CSS选择器从左到右表示的是后代从属关系,原选择器会去寻找.sidebar__content-link.active内部的<li>,但实际结构是<li>包含.sidebar__content-link.active,所以根本匹配不到目标元素。

正确写法

方案1:使用:has()选择器(现代浏览器支持)

直接通过父元素<li>检查内部是否存在带active类的子元素,同时结合悬停状态:

li:hover:has(.sidebar__content-link.active)::after {
  display: block;
  content: attr(data-after);
}

方案2:同步父元素的active类(兼容旧浏览器)

如果需要兼容不支持:has()的浏览器(如旧版Firefox),可以在React中给<li>也同步加上active类,简化选择器:

<li data-after={element} className={isSidebarOpen ? 'active' : ''}>
  <Link
    href={`/${element}`}
    className={`sidebar__content-link ${isSidebarOpen ? 'active' : ''}`}
  >
    {element}
  </Link>
</li>

对应的CSS选择器:

li.active:hover::after {
  display: block;
  content: attr(data-after);
}

内容的提问来源于stack exchange,提问作者esraa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:55:22