This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
The :visited CSS pseudo-class applies once the link has been visited by the user. For privacy reasons, the styles that can be modified using this selector are very limited. The :visited pseudo-class applies only to <a> and <area> elements that have an href attribute.
p {
font-weight: bold;
}
a:visited {
color: forestgreen;
text-decoration-color: hotpink;
}
<p>Pages that you might have visited:</p>
<ul>
<li>
<a href="https://developer.mozilla.org">MDN Web Docs</a>
</li>
<li>
<a href="https://www.youtube.com/">YouTube</a>
</li>
</ul>
<p>Pages unlikely to be in your history:</p>
<ul>
<li>
<a href="https://developer.mozilla.org/missing-1">Random MDN page</a>
</li>
<li>
<a href="https://example.com/missing-1">Random Example page</a>
</li>
</ul>
Styles defined by the :visited and unvisited :link pseudo-classes can be overridden by any subsequent user-action pseudo-classes (:hover or :active) that have at least equal specificity. To style links appropriately, put the :visited rule after the :link rule but before the :hover and :active rules, as defined by the LVHA-order: :link — :visited — :hover — :active. The :visited pseudo-class and :link pseudo-class are mutually exclusive.
For privacy reasons, browsers strictly limit which styles you can apply using this pseudo-class, and how they can be used:
color, background-color, border-color, border-bottom-color, border-left-color, border-right-color, border-top-color, column-rule-color, outline-color, text-decoration-color, and text-emphasis-color.fill and stroke.:visited state will be used instead. In Firefox when the alpha component is 0, the style set in :visited will be ignored entirely.window.getComputedStyle method will lie and always return the value of the non-:visited color.<link> element is never matched by :visited.querySelector() and querySelectorAll() — will always return an "empty" result even if there are visited links in a document. For the aforementioned methods, this will be null or an empty NodeList, respectively.Note: For more information on these limitations and the reasons behind them, see Privacy and the :visited selector.
:visited {
/* ... */
}
Properties that would otherwise have no color or be transparent cannot be modified with :visited. Of the properties that can be set with this pseudo-class, your browser probably has a default value for color and column-rule-color only. Thus, if you want to modify the other properties, you'll need to give them a base value outside the :visited selector.
<a href="#test-visited-link">Have you visited this link yet?</a><br /> <a href="">You've already visited this link.</a>
a {
/* Specify non-transparent defaults to certain properties,
allowing them to be styled with the :visited state */
background-color: white;
border: 1px solid white;
}
a:visited {
background-color: yellow;
border-color: hotpink;
color: hotpink;
}
| Specification |
|---|
| HTML> # selector-visited> |
| Selectors Level 4> # visited-pseudo> |
| Desktop | Mobile | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on IOS | Samsung Internet | WebView Android | WebView on iOS | |
:visited |
1 | 12 | 1 | 3.5 | 1 | 18 | 4 | 10.1 | 1 | 1.0 | 4.4 | 1 |
not_match_link |
1 | 12 | 87 | 15 | 15 | 18 | 87 | 14 | 15 | 1.0 | 4.4 | 15 |
privacy_measures |
6 | 12 | 4 | 15 | 5 | 18 | 4 | 14 | 4.2 | 1.0 | 37 | 4.2 |
:link, :active, :hover
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/:visited