浏览器禁用:visited对非颜色属性的控制是为防止历史嗅探攻击,仅允许color、background-color(纯色)、border-color等极少数无泄漏风险属性生效,其他如background-image、transform、opacity等均被静默忽略。

:link 和 :visited 伪类没被淘汰,但它们的使用场景被大幅压缩——不是设计师不用了,是浏览器限制让它们干不了活。
为什么写了 :visited 却看不到 background 或 icon 变化
现代浏览器(Chrome、Firefox、Safari)主动禁用 :visited 对非颜色属性的控制,这是硬性安全策略,不是 bug。你写 a:visited { background-image: url(check.svg); },DevTools 里会直接显示为 strikethrough 灰线;写 transform: scale(0.95) 或 opacity: 0.8,整条规则静默丢弃。
- 只允许修改极少数“无泄漏风险”的属性:
color、background-color(部分浏览器已弱化支持)、border-color、outline-color、text-decoration-color -
color还不能带透明度(rgba()或hsla()会被忽略,只能用#666这类纯色) - 任何搭配
transition、animation、filter的尝试,都会导致整条规则失效
:link 为什么越来越像摆设
:link 本身没被限制,但它和 :visited 是互斥状态,且只对带有效 href 的 <a></a> 生效。现实中大量链接是 JS 驱动的(href="javascript:void(0)"、href="#"、或由 router-link 动态注入),这些根本不会触发 :link 或 :visited。
- 单页应用(SPA)中,
pushState不更新浏览器历史,:visited状态不会自动刷新 - 很多团队直接用
a[href]替代a:link,语义更明确,且不依赖访问状态逻辑 - 基础颜色样式往往直接写在
a上,:link只剩一层冗余包裹
LVHA 顺序错一点,整个状态链就断掉
伪类必须按 :link → :visited → :hover → :active 顺序声明,这是浏览器解析逻辑的硬性要求,不是优先级问题。顺序一乱,:visited 样式可能压根不参与匹配。
- 错误示例:
a:hover { color: red; } a:visited { color: purple; }→:visited极大概率失效 - 即使顺序对了,
:visited设了color,但前面a元素有!important,也会覆盖它(因为:visited本身没加!important) - 移动端真机上,
:active瞬间触发后立刻消失,:visited的颜色变化常被系统点击高亮遮盖,视觉反馈几乎不可见
真正难的不是写出符合 LVHA 的 CSS,而是接受一个事实:浏览器把 :visited 当成一个只配改文字颜色的“哑状态”,所有想靠它做图标、背景、动画、显隐切换的设计意图,从一开始就不该交给它来承担。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











