必须用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 嵌套里怎么避免过度选择器层级
导航栏结构常是 或带 role="link" + tabindex="0" 的元素
:focus 样式不能被 outline: none 粗暴清除;可用 outline: 2px solid #007bff 配合 outline-offset: 2px 优化视觉.nav {
&__link {
color: #333;
@at-root .nav-link.is-active {
color: #007bff;
font-weight: 600;
}
}
}
为什么不用 :target 搞导航高亮
有人试过用 URL 锚点 +
实际项目里最易被忽略的,是点击态和焦点态的样式共存逻辑。比如用户用键盘 tab 到某个导航项,再按回车,这时既要 :target 实现无 JS 高亮,比如 #home 对应
:target 匹配的是页面内 id,不是导航项自身,你得把每个 的 href 指向一个真实存在的 id,而多数导航跳转是路由或页面刷新:target 重算(History API 不影响锚点状态).nav-link:target 完全不生效——因为根本没匹配到:focus,又要 .is-active,两个 class 得同时存在且不互相覆盖。Sass 里别写成互斥的 &:focus { ... } 和 &.is-active { ... },而要合并处理。.nav-link {
&:focus,
&.is-active {
outline: 2px solid #007bff;
}
}
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











