导航高亮必须用javascript实现,因css的:active仅响应鼠标按下、:current尚未被浏览器支持;应通过data-path属性匹配location.pathname并去除末尾斜杠,spa需监听路由变化,ssr需服务端预设高亮。

导航高亮必须靠JavaScript判断当前URL
纯CSS的 :active 只响应鼠标按下瞬间,松开就失效,根本不能标记“当前页面”;:current 是还在草案里的伪类,目前没有任何浏览器支持。想让导航项在当前页面保持高亮,必须用JS读取 window.location.pathname 或 document.URL,再匹配对应链接并加类名。
给导航链接加 data-path 属性最稳妥
直接比对 href 容易出错——比如带查询参数、末尾斜杠不一致、协议不同(http vs https)。更可靠的做法是统一用 data-path 标记路由基准路径:
<a href="/about/" data-path="/about">关于</a> <a href="/blog/?page=2" data-path="/blog">博客</a>
JS里只比对 data-path 值和当前路径的 pathname 部分(用 location.pathname.replace(/\/+$/, '') 去掉末尾斜杠)。
注意单页应用(SPA)的路由监听时机
Vue Router、React Router 这类前端路由不会触发页面刷新,所以不能只在页面加载时执行一次匹配。得监听路由变化:
- Vue:在
router.afterEach钩子中更新高亮 - React Router v6:用
useLocationHook +useEffect监听location.pathname - 原生 History API:监听
popstate事件,但要注意pushState后需手动触发一次匹配
服务端渲染(SSR)时别漏掉初始高亮
如果页面由后端吐出HTML(如Nuxt、Next.js SSR模式),光靠客户端JS会有一帧闪动——导航项先无样式,等JS执行完才高亮。必须在服务端就根据请求路径,给对应 <a></a> 标签提前加上 aria-current="page" 或自定义类名(如 is-active),再让客户端JS接管后续切换逻辑。
这个点最容易被忽略:不是“JS能搞定就行”,而是“首屏是否可见”直接决定用户体验是否割裂
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











