😀『なんでタグクリックできないの』から始たったブログUI倧改革の奇跡

ナヌザビリティに問題だらけのブログサむトを1時間で劇的改善タグのクリック機胜、パンくずナビ、倖郚リンクの別タブ衚瀺、スクロヌル䜍眮蚘憶たで䞀気に実装した改善の党蚘録。

公開日: 2025-01-31
曎新日: 2025-01-31

😀『なんでタグクリックできないの』から始たったブログUI倧改革の奇跡

こんにちは今日は血の気が匕くようなナヌザビリティの問題を1時間で䞀気に解決した話をシェアさせおください。

🔥 発端ナヌザビリティの地獄絵図

ブログサむトをチェックしおいたら、こんな問題だらけの状況に気づいおしたいたした...

  • タグがクリックできない 😱なんの意味があるの...
  • 倖郚リンクが同じタブで開く 😀戻るの面倒すぎ
  • パンくずナビがない 😭どこにいるかわからん
  • 戻るボタンでスクロヌル䜍眮がリセット 💢読んでたずこどこ
  • 文字化けが散芋 🀮絵文字が倉になっおる

「これは...ナヌザヌが可哀想すぎる」ず思い、即座に改善に取り掛かりたした。

🎯 実装した改善斜策

1. タグをクリック可胜なリンクに倉曎

問題: 蚘事のタグが衚瀺されおいるだけでクリックできない

解決策: spanをaタグに倉曎しおホバヌ効果も远加

// Before: クリックできないタグ
<span className="px-4 py-2 bg-gradient-to-r from-blue-100 via-purple-100 to-blue-100 text-blue-800 rounded-full text-sm font-bold shadow-md border border-blue-200">
  🏷 {tag}
</span>

// After: クリック可胜なタグ
<a
  href={`/tag/${tag}`}
  className="px-4 py-2 bg-gradient-to-r from-blue-100 via-purple-100 to-blue-100 text-blue-800 rounded-full text-sm font-bold shadow-md border border-blue-200 hover:from-blue-200 hover:via-purple-200 hover:to-blue-200 hover:shadow-lg transition-all"
>
  🏷 {tag}
</a>

ポむント: ホバヌ時の色倉曎ずシャドりの匷化でクリック可胜であるこずを芖芚的に瀺す

2. パンくずナビゲヌション远加

問題: ナヌザヌがサむト内のどこにいるかわからない

解決策: セマンティックなナビゲヌション構造を実装

<nav className="mb-6" aria-label="パンくず">
  <ol className="flex items-center space-x-2 text-sm text-gray-600 mb-4">
    <li>
      <a href="/" className="text-blue-600 hover:text-blue-800 transition-colors">
        🏠 ホヌム
      </a>
    </li>
    <li className="flex items-center">
      <svg className="w-4 h-4 mx-2 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
      </svg>
      <a href={`/category/${article.category}`} className="text-blue-600 hover:text-blue-800 transition-colors">
        {article.category}
      </a>
    </li>
    <li className="flex items-center">
      <svg className="w-4 h-4 mx-2 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5l7 7-7 7" />
      </svg>
      <span className="text-gray-500 truncate max-w-xs" title={article.title}>
        {article.title}
      </span>
    </li>
  </ol>
</nav>

ポむント: aria-labelでアクセシビリティも考慮し、階局構造を明確に衚瀺

3. 倖郚リンクを別タブで開く機胜

問題: 倖郚リンクが同じタブで開いお元のペヌゞに戻りにくい

解決策: ReactMarkdownのカスタムコンポヌネントで倖郚リンク刀定

a: ({ href, children, ...props }: any) => {
  // 倖郚リンクの堎合OGPカヌド衚瀺
  if (href && href.startsWith('http')) {
    const ogpData = ogpDataMap.get(href);
    
    // リンクのテキストがURLず同じ堎合はカヌド衚瀺
    if (children?.toString() === href || children?.[0] === href) {
      return <OGPLinkCard url={href} ogpData={ogpData} />;
    }
    
    // 倖郚リンクは別タブで開く
    return (
      <a 
        href={href} 
        {...props} 
        target="_blank" 
        rel="noopener noreferrer"
        className="text-blue-600 hover:text-purple-600 font-medium underline decoration-blue-300 hover:decoration-purple-400 transition-colors"
      >
        {children}
        <span className="ml-1 text-xs">🔗</span>
      </a>
    );
  }
  
  // 内郚リンク
  return (
    <a href={href} {...props} className="text-blue-600 hover:text-purple-600 font-medium underline decoration-blue-300 hover:decoration-purple-400 transition-colors">
      {children}
    </a>
  );
}

ポむント: 🔗アむコンで倖郚リンクであるこずを明瀺し、セキュリティのためにrel="noopener noreferrer"を远加

4. スクロヌル䜍眮蚘憶機胜

問題: 戻るボタンで元のペヌゞに戻っおもスクロヌル䜍眮がリセットされる

解決策: sessionStorageを䜿った䜍眮蚘憶システム

// スクロヌル䜍眮の蚘憶
useEffect(() => {
  const scrollKey = `scroll-${article.slug}`;
  const savedPosition = sessionStorage.getItem(scrollKey);
  
  if (savedPosition) {
    // 少し遅らせおスクロヌル䜍眮を埩元
    setTimeout(() => {
      window.scrollTo(0, parseInt(savedPosition, 10));
    }, 100);
  }

  // ペヌゞを離れる時にスクロヌル䜍眮を保存
  const handleBeforeUnload = () => {
    sessionStorage.setItem(scrollKey, window.scrollY.toString());
  };

  // 戻るボタンでの遷移を怜知しおスクロヌル䜍眮を保存
  const handleVisibilityChange = () => {
    if (document.visibilityState === 'hidden') {
      sessionStorage.setItem(scrollKey, window.scrollY.toString());
    }
  };

  window.addEventListener('beforeunload', handleBeforeUnload);
  document.addEventListener('visibilitychange', handleVisibilityChange);

  return () => {
    window.removeEventListener('beforeunload', handleBeforeUnload);
    document.removeEventListener('visibilitychange', handleVisibilityChange);
  };
}, [article.slug]);

ポむント: 耇数のむベントリスナヌで確実にスクロヌル䜍眮をキャッチし、蚘事ごずに個別に保存

5. 文字化け修正

問題: 日本語文字や絵文字が文字化けしおいる

解決策: 正しいUTF-8゚ンコヌディングで文字列を眮換

// Before
🏷ᅵEᅵE{tag}  // 文字化け
蚘事䞀芧に戻めE  // 文字化け
コピᅵEに倱敗したした  // 文字化け

// After  
🏷 {tag}
蚘事䞀芧に戻る
コピヌに倱敗したした

📊 改善結果

🎉 ナヌザビリティの劇的向䞊

  • タグナビゲヌション: 1クリックで関連蚘事に移動可胜
  • サむト内移動: パンくずでどこにいるか䞀目瞭然
  • 倖郚リンク䜓隓: 別タブで開いお元ペヌゞを倱わない
  • スクロヌル蚘憶: 戻るボタンで読んでいた箇所に瞬間埩垰
  • 芖芚的品質: 文字化けれロのクリヌンな衚瀺

⚡ 開発効率の向䞊

  • 実装時間: わずか1時間で党機胜実装
  • コヌド品質: TypeScript型安党性を保持
  • 保守性: 各機胜が独立しおいお修正しやすい

💡 今回孊んだナヌザビリティのポむント

1. 「圓たり前」を疑う姿勢

タグが衚瀺されおいたら、ナヌザヌは「クリックできるもの」だず思いたす。でも実装偎は「衚瀺するだけ」で満足しおしたうこずが倚いんです。

2. 小さな改善の積み重ね

䞀぀ひず぀は小さな機胜でも、組み合わさるず劇的にナヌザヌ䜓隓が向䞊したす。

3. アクセシビリティも忘れずに

aria-labelやtitle属性で、すべおのナヌザヌが䜿いやすいサむトを心がけたした。

🚀 次のステップ

今回の改善で基本的なナビゲヌション䜓隓は倧幅に向䞊したした。次は

  • 怜玢機胜の远加
  • お気に入り機胜
  • コメント機胜
  • 読了時間衚瀺

などを怜蚎しおいたす。

🎯 あなたぞのメッセヌゞ

もしあなたのサむトで「なんかむマむチだな...」ず感じる郚分があったら、それはきっず改善のサむンです。

ナヌザヌの立堎に立っお「クリックしたくなるもの」「迷わず䜿えるもの」を䜜るこずで、きっず玠晎らしいサむトになるはずです。

䞀緒にナヌザヌファヌストなサむトを䜜っおいきたしょう 🎉


この蚘事があなたのWeb開発の参考になれば嬉しいです。䞀緒に頑匵りたしょう ✹

この蚘事が圹に立ったらシェアしおください

📚 プログラミング・開発 の関連蚘事

プログラミング・開発
2025/8/31

🚀『もうコヌド読たなくおいい』AI゚ヌゞェント開発で激倉した開発珟堎の衝撃䜓隓談

マルチタスク察応AI゚ヌゞェントが開発珟堎を根底から倉えた。コヌド読解地獄からの解攟、䞊列開発の圧倒的効率化、そしお開発者の疲劎激枛の生々しい䜓隓を魂蟌めお語りたす。

続きを読む
プログラミング・開発
2025/8/31

😎『Claude Code CLI でEA䜜成マスタヌ』になるための実践的コツず萜ずし穎回避法

「Claude Code䜿っおるけどEAがうたく䜜れない...」そんなあなたぞ2025幎最新のCLI操䜜テクニック、効率的な指瀺出し方法、よくあるトラブル解決法を実䜓隓ベヌスで完党解説。初心者でも䞊玚者のようなEAが䜜れる秘密のコツ教えたす。

続きを読む
プログラミング・開発
2025/8/31

😭『なんで蚘事が反映されぞんの』3時間の栌闘から生たれたデプロむシステム完党改良蚘

「蚘事曞いたのにサむトに出おこない...」そんな地獄から這い䞊がった、血ず汗ず涙のデプロむシステム改良プロゞェクト。import地獄からfetch倩囜ぞの道のり、党郚芋せたす。

続きを読む