隐私与 :visited 选择器

最初,CSS :visited选择器存在隐私和安全风险。通过少量JavaScript,网站可以发现用户的浏览历史并找出用户访问过的网站。这可以通过window.getComputedStyle等方法和其他技术实现。这个过程速度很快,使网站不仅能够确定用户在网络上的足迹,还能猜测用户的许多身份信息。

为了缓解此隐私问题,浏览器限制了可以从已访问链接获取的信息量。

善意的谎言

为了保护用户隐私,浏览器在某些情况下会对Web应用程序撒谎

  • window.getComputedStyle方法和类似函数,例如element.querySelector,总是返回表示用户从未访问过页面上任何链接的值。
  • 当使用兄弟选择器(如:visited + span)时,相邻元素(本例中的span)的样式将表现为链接未被访问过。
  • 在极少数情况下,如果您使用嵌套链接元素且匹配的元素与正在测试其历史记录中是否存在链接的元素不同,则该元素将表现为链接未被访问过。

您可以对已访问链接进行样式设置,但可使用的样式种类有限。只有以下样式可以应用于已访问链接:

此外,即使对于上述样式,未访问链接和已访问链接之间的透明度差异也不会被应用。此限制阻止了在各种<color>函数中使用alpha参数或使用transparent关键字来区分这两种状态。

以下是样式与上述限制一起使用的示例:

css
:link {
  outline: 1px dotted blue;
  background-color: white;
  /* The default value of `background-color` is `transparent`. You need to
     specify a different value, otherwise changes on `:visited` won't apply. */
}

:visited {
  outline-color: orange; /* Visited links have an orange outline */
  background-color: green; /* Visited links have a green background */
  color: yellow; /* Visited links have yellow colored text */
}

对Web开发人员的影响

在开发网站时,您可能需要考虑以下事项:

  • 根据链接的访问状态更改background-image值将不起作用,因为只有颜色可以用于设置已访问链接的样式。
  • 通过:visited选择器设置样式时,原本透明的颜色将不会应用。

另见