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

如何用CSS/SCSS实现悬停侧边栏li元素显示router-outlet

问题:悬停侧边栏li元素时显示router-outlet

场景与需求

现有如下HTML结构:

<nb-sidebar class="menu-sidebar">
  <nb-menu class="sidebar-menu">
     <ul class="menu-items">
        <li class="menu-item ng-tns-c140-0 ng-star-inserted" >
          <a class="ng-tns-c140-0 ng-star-inserted active" ng-reflect-router-link="/pages/dashboard"   title="Dashboard" href="/pages/dashboard">
        </li>
     </ul>
  </nb-menu>
</nb-sidebar>

<div class="content">
  <router-outlet>
    <div class="text">Message</div>
  </router-outlet>
</div>

需求:默认隐藏<router-outlet>,当鼠标悬停在侧边栏的<li>元素上时,显示该元素。

用户尝试的无效代码

用户编写了以下CSS但未达到预期效果:

router-outlet {
  display: none;
}

nb-sidebar li:hover + .content router-outlet {
     display: block;
}

问题原因

这段代码失效的核心是选择器逻辑错误:

  • +是相邻兄弟选择器,仅能匹配紧接在目标元素之后的同级元素。
  • 此处<li>的父级是<ul>、<nb-menu>,最终父容器是<nb-sidebar>,而.content是<nb-sidebar>的同级元素,并非<li>的同级元素。因此nb-sidebar li:hover + .content这个选择器无法匹配到任何元素,自然无法触发样式变化。

纯CSS解决方案

要实现需求,可借助CSS的:has()选择器——它能检测父容器内是否存在符合条件的子元素,进而控制父容器的兄弟元素样式:

/* 默认隐藏router-outlet */
router-outlet {
  display: none;
}

/* 当nb-sidebar内部有li被悬停时,显示同级.content中的router-outlet */
nb-sidebar:has(li:hover) + .content router-outlet {
  display: block;
}

兼容性说明

:has()选择器目前已被绝大多数现代浏览器支持(包括Chrome、Edge、Firefox 121+、Safari 15.4+),若需兼容更旧的浏览器,纯CSS方案无法实现,此时需结合JavaScript监听hover事件来添加/移除类,但这不符合“仅用CSS/SCSS”的要求,因此优先推荐上述方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:31:33