:visited」の落とし穴と代替方法:プライバシーを守りつつ訪問済みリンクを管理


:visited は CSS の擬似クラスの一つで、ユーザーが過去に訪問したハイパーリンクにスタイルを適用するために使用されます。例えば、訪問済みのリンクをグレー色にしたり、下線を消したりすることができます。

:visited は、プライバシー上の理由から、適用できるスタイルが制限されています。具体的には、以下のプロパティのみ変更できます。

  • outline-color
  • text-decoration
  • border-color
  • background-color
  • color

構文

:visited は、ハイパーリンクを表す <a> 要素に対してのみ使用できます。構文は以下の通りです。

a:visited {
  /* スタイル定義 */
}

以下の例では、訪問済みのリンクの文字色を青色に、下線を消しています。

a:visited {
  color: blue;
  text-decoration: none;
}

注意点

:visited を使用する場合、以下の点に注意する必要があります。

  • ユーザーが閲覧履歴を消去した場合、:visited で設定したスタイルが適用されなくなります。
  • ブラウザによって、デフォルトのスタイルが異なります。
  • プライバシー上の理由から、適用できるスタイルが制限されています。

:visited は、ユーザーの閲覧履歴を取得する手段として悪用される可能性があります。そのため、倫理的な観点から使用を控えるべきだという意見もあります。



訪問済みのリンクをグレー色にする

a:visited {
  color: gray;
}

訪問済みのリンクの下線を消す

a:visited {
  text-decoration: none;
}

訪問済みのリンクに背景色を追加する

a:visited {
  background-color: #eee;
}

訪問済みのリンクの境界線を青色にする

a:visited {
  border-color: blue;
}
a:visited {
  color: blue;
  text-decoration: none;
  background-color: #eee;
}

以下のコードは、訪問済みのリンクに様々なスタイルを適用する例です。

/* 訪問済みのリンクを太字にする */
a:visited {
  font-weight: bold;
}

/* 訪問済みのリンクにマージンを追加する */
a:visited {
  margin: 5px;
}

/* 訪問済みのリンクにパディングを追加する */
a:visited {
  padding: 5px;
}

/* 訪問済みのリンクに影を追加する */
a:visited {
  box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.2);
}


そこで、ここでは :visited の代替方法として、以下の3つの方法をご紹介します。

JavaScript を使用する

JavaScript を使用すれば、ブラウザの履歴に頼らずに、訪問済みのリンクを判定することができます。具体的には、以下の方法があります。

  • History API を使用する: History API を使用して、ブラウザの履歴情報を取得します。
  • sessionStorage を使用する: sessionStorage に、訪問したリンクのURLを保存しておきます。
  • localStorage を使用する: localStorage に、訪問したリンクのURLを保存しておきます。

これらの方法を組み合わせることで、より柔軟な訪問済み判定が可能になります。

例:localStorage を使用する

// 訪問済み判定
function isVisited(url) {
  const visitedLinks = JSON.parse(localStorage.getItem('visitedLinks') || '[]');
  return visitedLinks.includes(url);
}

// リンクのクリックイベントハンドラ
document.addEventListener('click', function(event) {
  const target = event.target;
  if (target.tagName.toLowerCase() === 'a' && !isVisited(target.href)) {
    // 訪問済みのリンクではない場合
    target.style.color = 'gray'; // 訪問済みのリンクにスタイルを適用
    visitedLinks.push(target.href);
    localStorage.setItem('visitedLinks', JSON.stringify(visitedLinks));
  }
});

Cookie を使用する

Cookie を使用すれば、ブラウザの履歴に頼らずに、訪問済みのリンクを判定することができます。ただし、Cookie はユーザーの同意を得ずに使用することはできないため、注意が必要です。

例:Cookie を使用する

// 訪問済み判定
function isVisited(url) {
  const visitedLinks = document.cookie.split(';').map(pair => pair.split('=')[0].trim()).filter(name => name === 'visitedLinks');
  if (visitedLinks.length > 0) {
    const visitedLinksData = JSON.parse(visitedLinks[0]);
    return visitedLinksData.includes(url);
  }
  return false;
}

// リンクのクリックイベントハンドラ
document.addEventListener('click', function(event) {
  const target = event.target;
  if (target.tagName.toLowerCase() === 'a' && !isVisited(target.href)) {
    // 訪問済みのリンクではない場合
    target.style.color = 'gray'; // 訪問済みのリンクにスタイルを適用
    let visitedLinks = [];
    if (isVisited(target.href)) {
      visitedLinks = JSON.parse(document.cookie.split(';').map(pair => pair.split('=')[0].trim()).filter(name => name === 'visitedLinks')[0]);
    }
    visitedLinks.push(target.href);
    document.cookie = `visitedLinks=${JSON.stringify(visitedLinks)};max-age=31536000;path=/`;
  }
});

CSS の :hover 擬似クラスと組み合わせる

CSS の :hover 擬似クラスと組み合わせることで、ユーザーがマウスカーソルを合わせたリンクを一時的にハイライトすることができます。これは、訪問済み判定の代替手段として使用することができます。

例::hover 擬似クラスを使用する

a:hover {
  color: gray; /* マウスカーソルを合わせたリンクにスタイルを適用 */
}

上記の方法はいずれも、:visited の完全な代替手段ではありません。それぞれの方法のメリットとデメリットを理解した上で、目的に合った方法を選択してください。

  • プライバシー上の観点から、ユーザーの閲覧履歴を取得するような方法は避けるべきです。
  • :visited の代替方法として、CSS フレームワークやライブラリを使用する方法もあります。