この記事では、Astroブログに実装したUX機能をコード付きで解説します。
ブログのユーザー体験を向上させるため、以下の10機能を実装しました。
| 機能 | 説明 |
|---|---|
| 読み進め位置保存 | 次回訪問時に続きから読める |
| フローティングシェア | モバイルでワンタップシェア |
| コードコピーボタン | コードブロックにコピー機能 |
| キーボードショートカット | Cmd+K で検索にジャンプ |
| トースト通知 | 操作フィードバック表示 |
| 読書プログレスバー | 記事の読み進め度を可視化 |
| 目次スクロールスパイ | 現在読んでいるセクションをハイライト |
| 印刷用スタイル | 記事の印刷最適化 |
| ダークモード対応 | CSS変数によるテーマ切り替え |
| 閲覧数トラッキング | Astro DBによるカウント |
記事を途中まで読んで離脱した場合、次回訪問時に「続きから読みますか?」と提案する機能です。
// ReadingPositionSave.astro (一部抜粋)
const slug = window.location.pathname.split(/).filter(Boolean).pop();
const storageKey = `reading-position-${slug}`;
// スクロール位置を保存
window.addEventListener('scroll, () => {
const percent = (scrollTop / docHeight) * 100;
localStorage.setItem('storageKey, String(percent));
});
ポイント:
localStorage で位置を永続化モバイルでスクロール時に表示されるフローティングボタンです。
スマホでシェアボタン押しにくいんだよね
フローティングボタンなら親指で届く位置に常に表示されます!
対応プラットフォーム:
すべての <pre> タグに自動でコピーボタンを追加します。
// CopyCodeButton.astro
document.querySelectorAll(pre).forEach((block) => {
const button = document.createElement(button);
button.textContent = Copy;
button.addEventListener("click, async () => {
await navigator.clipboard.writeText(block.textContent);
button.textContent = Copied!;
});
block.appendChild(button);
});
パワーユーザー向けのショートカット機能です。
| ショートカット | 動作 |
|---|---|
Cmd/Ctrl + K | 検索にフォーカス |
Escape | 検索からブラー |
/ | 検索にフォーカス |
window.showToast() でどこからでも通知を表示できます。
// 使用例
window.showToast({
message: "コピーしました", type: "success", // success, error, info, warning
duration: 3000, });
これらの機能は PostLayout.astro で統合されており、すべての記事ページで自動的に有効になります。
ReadingProgress.astroFloatingShare.astroCopyCodeButton.astroKeyboardShortcuts.astroToast.astroReadingPositionSave.astroViewCounter.astrolocalStorageを活用した軽量な実装で、サーバー負荷をかけずに読書体験を向上。
フローティングボタンやトースト通知など、ユーザーのアクションに対して適切なフィードバックを返す仕組みを導入。
Astro DBを用いたプライバシー重視の閲覧数カウント機能を実装(次回解説)。
次回は閲覧数トラッキングの実装について詳しく解説します。