:visited仅允许设置color、background-color(纯色)、border-color等有限颜色属性,是浏览器为防止通过样式探测用户访问历史而刻意限制,并非功能缺失。

为什么:visited只能改color、background-color这些属性
这不是浏览器“没做全”,而是刻意封死——防止网站用样式差异探测用户访问历史。攻击者曾通过getComputedStyle()读取color或background-color的计算值,再结合大量链接排列,反推出你是否访问过某银行、医疗或社交平台页面。现代 Chrome、Firefox、Safari 全部禁用这类探测,所以只放开极少数不影响布局和渲染状态的颜色类属性。
:visited能用的属性有哪些(且必须是纯色)
可用属性非常有限,而且每个都有隐含约束:
-
color:唯一最可靠,支持所有合法颜色值(#333、rgb(100,100,100)、var(--visited-color)也行,但变量本身不能在:visited里定义) -
background-color:仅支持纯色,rgba()中的alpha通道会被忽略(background-color: rgba(0,0,0,0.1)等效于background-color: black),渐变、图片背景一律无效 -
border-color(含border-top-color等细分方向):只能设颜色,border-width或border-style写进去也白搭 -
outline-color、column-rule-color、text-decoration-color:同理,只认颜色值 -
fill和stroke:仅对内联 SVG 中带href的<a></a>生效,且必须是直接子元素
写了background-color却没反应?先查这三件事
不是代码错,是环境或协议卡住了:
- 链接
href是#、javascript:void(0)或空值 —— 浏览器根本不把它当可记录的历史 URL - 页面用
file://协议打开(双击本地 HTML 文件)—— 大多数浏览器默认禁用:visited - 你在无痕/隐私模式下测试 —— 历史不保存,
:visited永远为空
另外,SPA 跳转若只靠history.pushState()没触发完整页面加载,浏览器也不会更新访问状态。
想加图标、动画、背景图?别硬刚:visited
所有非颜色类需求,:visited都无解:
- 加✅图标?
::after内容无法依赖访问状态动态切换 - hover时缩放已访问链接?
transform在:visited里静默丢弃 - 区分“今天访问”和“上周访问”?
:visited不提供时间维度
真要实现,得换一套状态管理:用localStorage存已点击的href,加载时遍历document.querySelectorAll('a[href]')匹配并加class="visited-js",再用普通 CSS 控制任意样式。注意单页应用里要主动监听click和popstate事件同步状态。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











