訪問済みリンクを自前で管理する方法:a:visitedに頼らない実装テクニック
Webサイトを閲覧していると、「一度クリックしたリンクの色が変わる」ことがあります。これは多くの場合、CSSの a:visited という仕組みによって実現されています。しかし近年のWeb開発では、ブラウザの訪問履歴に依存するこの方法ではなく、サイト側で独自に“訪問済み”を管理する方法が使われることも増えています。
この記事では、a:visitedの基本から、その制限、そして JavaScriptとlocalStorageを使って訪問履歴を自前で管理する方法まで、初心者にも分かりやすく解説します。
a:visitedとは?訪問済みリンクの基本
まず基本から確認してみましょう。
CSSには 訪問済みリンクを指定する擬似クラス が用意されています。
a:visited {
color: purple;
}このCSSを書くと、ユーザーが一度クリックしたリンクの色が変わります。
多くのブラウザでは、デフォルトでも
- 未訪問リンク:青
- 訪問済みリンク:紫
という表示になります。
つまり、特別な設定をしなくても ブラウザが自動で訪問履歴を管理してくれる仕組みがあるのです。
a:visitedが便利な理由
a:visitedのメリットは非常にシンプルです。
1. CSSだけで実装できる
JavaScriptを使う必要がなく、CSSだけで訪問済みを表現できます。
2. ブラウザが履歴を管理してくれる
ユーザーのブラウザ履歴と連動するため、開発者側で履歴管理をする必要がありません。
3. ユーザー体験が向上する
ユーザーは
- 「どのページを見たか」
- 「まだ見ていないページはどこか」
を視覚的に判断できます。
特にブログやニュースサイトでは、この機能が役立ちます。
しかし a:visitedには制限がある
実は a:visited にはいくつかの制限があります。
JavaScriptで取得できない
現在のブラウザでは、セキュリティのため JavaScriptから訪問履歴を取得することができません。
例えば以下のようなことはできません。
if(link.visited){
console.log("訪問済み");
}これは ユーザーの閲覧履歴をサイトが勝手に取得できないようにするためです。
CSSの変更も制限されている
a:visitedでは変更できるCSSが限られています。
変更できる例
color
background-color
border-color
変更できない例
display
transform
font-size
position
つまり 色系のスタイルしか変更できません。
そこで登場する「独自訪問履歴管理」
最近のWebサイトでは、a:visitedの代わりに サイト独自の訪問履歴管理を行うケースがあります。
例えば次のような仕組みです。
- ユーザーがリンクをクリック
- JavaScriptでURLを保存
- 次回アクセス時に「訪問済みクラス」を付ける
この方法なら、CSSの制限を受けません。
localStorageを使った訪問履歴管理
もっとも簡単な方法は localStorage を使う方法です。
localStorageはブラウザにデータを保存できる仕組みです。
CSS
まず訪問済みの見た目を作ります。
a.visited {
opacity: 0.6;
}クリック済みリンクを少し薄く表示する例です。
JavaScript
次にクリック履歴を保存します。
document.addEventListener("DOMContentLoaded", () => { const KEY = "visited_links";
const visited = new Set(JSON.parse(localStorage.getItem(KEY) || "[]")); document.querySelectorAll("a[href]").forEach(a => {
if (visited.has(a.href)) {
a.classList.add("visited");
}
}); document.addEventListener("click", (e) => {
const link = e.target.closest("a"); if (!link) return; visited.add(link.href);
localStorage.setItem(KEY, JSON.stringify([...visited])); link.classList.add("visited");
});});このコードを使うと
- クリックしたリンクを保存
- 再訪時に
.visitedクラスを付与
という処理が実現できます。
この方法のメリット
独自管理の最大のメリットは 自由度の高さです。
CSS制限がない
例えば次のような演出もできます。
a.visited {
transform: scale(0.95);
opacity: 0.5;
}リスト型UIと相性が良い
メール一覧やお知らせ一覧などでよく使われます。
例えば
.mail.visited
.mail.new
のようなクラス構造です。
特定ページだけ管理できる
例えば /news/ ページだけ履歴を残すことも可能です。
if(!link.pathname.startsWith("/news/")) return;localStorage方式の注意点
ただし、この方法には弱点もあります。
端末ごとに履歴が分かれる
localStorageはブラウザ単位なので
- PC
- スマホ
- 別ブラウザ
では履歴が共有されません。
履歴削除で消える
ユーザーが
- キャッシュ削除
- シークレットモード
を使うと履歴は消えます。
ログインサイトの場合
もしログイン機能がある場合は
- データベースに履歴保存
- ユーザーIDと紐づけ
すると
- PC
- スマホ
- タブレット
どこでも同じ履歴を表示できます。
SNSやWebアプリでは、この方法が使われることが多いです。
まとめ
訪問済みリンクの管理には2つの方法があります。
| 方法 | 特徴 |
|---|---|
a:visited | 簡単だが制限あり |
| JavaScript管理 | 自由度が高い |
a:visitedはシンプルですが、
- CSS制限
- JavaScript不可
などの制約があります。
一方で localStorageを使った履歴管理を使えば、
- 独自UI
- リスト管理
- 状態管理
など、より柔軟な設計が可能になります。


