:visited 伪类仅允许修改 color、background-color、border-color 等颜色类属性,且值必须为纯色具体值;font-size、transform 等影响布局或可探测访问历史的属性被浏览器主动拦截,不参与 CSSOM 计算。

为什么 :visited 里改 font-size、transform 会静默失效
浏览器主动丢弃这些声明,不是解析失败,也不是兼容性问题,而是隐私保护的硬性拦截。只要属性不在白名单里,CSS 引擎连计算都不做,直接跳过。
这类属性能被用来实施“history sniffing”:比如给不同链接设不同 font-size,再用 getComputedStyle() 读取高度差异;或用 background-image 加载不同 URL 的图片,通过 load 事件时间差反推是否访问过。现代 Chrome、Firefox、Safari 全部禁用。
-
font-size、line-height、padding、margin、width、height—— 影响布局,全禁 -
transform、opacity(非 0/1)、filter、animation—— 可能造成视觉可测差异,全禁 -
display、visibility、position—— 改变元素存在性或层叠上下文,全禁
:visited 实际能改哪些属性,且必须怎么写
能用的只有颜色类属性,但连写法都有严格限制——稍有偏差就白写。
-
color✅ 只接受具体值:#666、rgb(102, 102, 102);currentColor、rgba()(含透明度)、hsl()❌ -
background-color✅ 纯色有效;background、background-image、渐变 ❌ -
border-color✅ 允许;border-top-color这类子属性在部分浏览器中不稳定,建议用简写border: 1px solid #ccc -
transition⚠️ 只允许transition: color .2s;transition: all或transition: background-color .2s整个声明被忽略
为什么开发者工具里看到样式被划掉,却以为是自己写错了
DevTools 中 a:visited { font-size: 14px; } 显示为 strikethrough 灰线,不是因为选择器不匹配或优先级低,而是浏览器明确拒绝应用该规则。它甚至不会进入 CSSOM 计算流程。
立即学习“前端免费学习笔记(深入)”;
- 本地用
file://协议打开 HTML 文件时,部分浏览器直接禁用:visited,所有规则都不生效 - SPA 路由未触发
pushState或页面未真正加载完成,浏览器不将其计入历史,:visited永远不匹配 -
a:visited span这类后代选择器无效——:visited不传播,也不能影响子元素
想加图标、变粗体、换背景图,该怎么做
放弃 :visited 本身。它的能力边界就是文字颜色,再多一步都得换方案。
- 前端用
localStorage记录点击过的href,渲染时加class="is-visited",再写完整 CSS - 服务端根据用户登录态和浏览日志,在模板中直出
data-visited="true"或class="visited" - 对关键操作链接(如“下载”),绑定
click后立即添加 class,不等跳转完成
最易被忽略的一点是:浏览器不仅不让改样式,还封死了所有 JS 探测路径——el.matches(':visited') 永远返回 false,getComputedStyle(el).color 返回的永远是未访问时的值。


















