必须用JavaScript添加is-active类并配合Sass样式实现导航高亮,:active和:target均不可靠;需兼顾键盘操作与无障碍,统一处理:focus与.is-active状态。

导航栏点击后如何保持高亮状态
靠 CSS 本身无法感知“点击”,:active 只在鼠标按下瞬间生效,松开就消失。真要维持点击后的高亮,必须靠 JavaScript 控制 class,再用 Sass 去写对应的样式嵌套规则。
- 给当前激活的导航项加一个
is-active类(别用active,太容易和 Bootstrap 冲突) - Sass 里用嵌套写:
.nav-item { &.is-active { background: #007bff; color: white; } } - 注意:如果用
router-link(Vue)或NavLink(React Router),它们自带activeClassName或className函数,别重复手写逻辑
Sass 嵌套里怎么避免过度选择器层级
导航栏结构常是 <nav><ul><li><a></a></li></ul></nav>,Sass 一层层嵌套容易写出 nav ul li a.is-active 这种 4 层选择器——既难维护,又可能被其他样式意外覆盖。
- 推荐扁平化命名,比如
.nav-link和.nav-link.is-active,直接作用于<a></a>元素 - 用
@at-root跳出嵌套:.nav { &__link { color: #333; @at-root .nav-link.is-active { color: #007bff; font-weight: 600; } } } - 层级超过 3 层时,浏览器渲染开销会上升,尤其在低端 Android 设备上可见卡顿
点击响应需要考虑键盘和屏幕阅读器
只监听 click 事件会漏掉空格键、回车键触发,也对无障碍不友好。CSS 层面虽不能解决交互逻辑,但样式必须配合语义化 HTML 才能生效。
- 导航项必须是
<a href="..."></a>或带role="link"+tabindex="0"的元素 -
:focus样式不能被outline: none粗暴清除;可用outline: 2px solid #007bff配合outline-offset: 2px优化视觉 - Sass 中可统一处理:
.nav-link { &:focus, &.is-active { outline: 2px solid #007bff; } }
为什么不用 :target 搞导航高亮
有人试过用 URL 锚点 + :target 实现无 JS 高亮,比如 #home 对应 <div id="home">。这方法在导航栏上基本不可行。<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>
<ul>
<li>
<code>:target 匹配的是页面内 id,不是导航项自身,你得把每个 <a></a> 的 href 指向一个真实存在的 id,而多数导航跳转是路由或页面刷新
:target 重算(History API 不影响锚点状态).nav-link:target 完全不生效——因为根本没匹配到:focus,又要 .is-active,两个 class 得同时存在且不互相覆盖。Sass 里别写成互斥的 &:focus { ... } 和 &.is-active { ... },而要合并处理。


















