Web Lukes
💻

😤『なんでタグクリックできないの!?』から始まったブログUI大改革の奇跡

公開日: 2025/1/31更新日: 2025/1/31

😤『なんでタグクリックできないの!?』から始まったブログUI大改革の奇跡

こんにちは!今日は血の気が引くようなユーザビリティの問題を1時間で一気に解決した話をシェアさせてください。

🔥 発端:ユーザビリティの地獄絵図

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

  • タグがクリックできない 😱(なんの意味があるの...)
  • 外部リンクが同じタブで開く 😤(戻るの面倒すぎ)
  • パンくずナビがない 😭(どこにいるかわからん)
  • 戻るボタンでスクロール位置がリセット 💢(読んでたとこどこ?)
  • 文字化けが散見 🤮(絵文字が変になってる)

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

🎯 実装した改善施策

1. タグをクリック可能なリンクに変更

問題: 記事のタグが表示されているだけでクリックできない

解決策: spanをaタグに変更してホバー効果も追加

TSX
// 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. パンくずナビゲーション追加

問題: ユーザーがサイト内のどこにいるかわからない

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

TSX
<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のカスタムコンポーネントで外部リンク判定

TSX
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を使った位置記憶システム

TSX
// スクロール位置の記憶
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エンコーディングで文字列を置換

TSX
// Before
🏷�E�E{tag} // 文字化け
記事一覧に戻めE // 文字化け
コピ�Eに失敗しました // 文字化け
// After
🏷️ {tag}
記事一覧に戻る
コピーに失敗しました

📊 改善結果

🎉 ユーザビリティの劇的向上

  • タグナビゲーション: 1クリックで関連記事に移動可能
  • サイト内移動: パンくずでどこにいるか一目瞭然
  • 外部リンク体験: 別タブで開いて元ページを失わない
  • スクロール記憶: 戻るボタンで読んでいた箇所に瞬間復帰
  • 視覚的品質: 文字化けゼロのクリーンな表示

⚡ 開発効率の向上

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

💡 今回学んだユーザビリティのポイント

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

タグが表示されていたら、ユーザーは「クリックできるもの」だと思います。でも実装側は「表示するだけ」で満足してしまうことが多いんです。

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

一つひとつは小さな機能でも、組み合わさると劇的にユーザー体験が向上します。

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

aria-labelやtitle属性で、すべてのユーザーが使いやすいサイトを心がけました。

🚀 次のステップ

今回の改善で基本的なナビゲーション体験は大幅に向上しました。次は:

  • 検索機能の追加
  • お気に入り機能
  • コメント機能
  • 読了時間表示

などを検討しています。

🎯 あなたへのメッセージ

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

ユーザーの立場に立って「クリックしたくなるもの」「迷わず使えるもの」を作ることで、きっと素晴らしいサイトになるはずです。

一緒にユーザーファーストなサイトを作っていきましょう! 🎉


この記事があなたのWeb開発の参考になれば嬉しいです。一緒に頑張りましょう! ✨

🎁おすすめツール・サービス

FX自動売買VPSなら50%OFF

キャンペーンで月1,790円〜。MT4/MT5プリインストール済み、自動復旧機能付き。14日間無料お試し。

シンクラウドデスクトップ for FX
ゴトー日EAを探しているならソースコード付

4年で資金4.7倍のバックテスト実績。ソースコード付きで自由にカスタマイズ可能。

ゴトー日EA Ultimate版(3,980円)

※上記リンクにはプロモーション(広告)が含まれています

🔮
MEMBERSHIP

量子相場謀略|ホソノP

ブログでは書けない本音のトレード戦略とEA開発の裏側を公開。 データに基づいた検証で、再現性のある手法だけをお届けします。

✓EAソースコード公開
✓バックテスト生データ共有
✓リアルタイム相場分析
✓メンバー限定記事
メンバーシップに参加する※ noteアカウントで簡単登録

📚あわせて読みたい

💻

😭『なんで記事が反映されへんの!?』3時間の格闘から生まれたデプロイシステム完全改良記

「記事書いたのにサイトに出てこない...」そんな地獄から這い上がった、血と汗と涙のデプロイシステム改良プロジェクト。import地獄からfetch天国への道のり、全部見せます。

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

モダンブログサイトの技術アーキテクチャ全容解説 - Remix + Cloudflare + MDX

高速・低コスト・高機能を実現するブログサイトの技術スタック全容を解説。技術選定の理由から実装詳細、コスト分析まで。

プログラミング・開発2025/1/30
💻

「また動いてない!💢」CSS ビルド・デプロイ時のスタイル適用問題を血と汗で解決した記録 😤 - Vite + Remix + Cloudflare

Vite ビルドシステムでのCSS生成問題とCloudflare Pages デプロイ時のスタイル適用エラーの原因と解決策。ファイルハッシュ不整合からクリーンビルドまで。

プログラミング・開発2025/1/30
💻

🎨 コードブロックを美しく!Prism.js シンタックスハイライト完全実装ガイド

Remix + Vite環境でPrism.jsを使ってコードブロックに美しいシンタックスハイライトを実装する方法。VS Codeテーマ風のカラーリングで開発者体験を向上!

プログラミング・開発2025/1/30
💻

😱 Remixサイトが真っ白に!デプロイ地獄から這い上がった3日間の記録

「ローカルでは動くのに本番で500エラー」あるある体験談。初心者の私がRemix + Cloudflare Pagesで地獄を見て、最終的に解決するまでの涙と汗の物語。

プログラミング・開発2025/1/30
💻

😤『cBot・MQL4・MQL5・Python、どれから始めればいいの!?』習得時間を徹底比較【実体験ベース】

自動売買を始めたいけど、cBot(C#/Python)・MQL4(MT4)・MQL5(MT5)・Python、どれを学ぶべき?プログラミング未経験者〜経験者別に習得時間の目安と効率的な学習順序を実体験ベースで解説。

プログラミング・開発2026/1/13