12k
All articles

Astroプロジェクトにテーマを追加する

AstroのスターターテンプレートやCSSカスタムプロパティ、テーマ切り替え、FOUC防止スクリプトを使ったダーク・ライトモードの実装方法を紹介する。

OpenReplay Team
OpenReplay Team
Astroプロジェクトにテーマを追加する

Astroプロジェクトを構築する際、2つの異なるテーマのニーズがあります。構造とデザインを提供する事前構築されたAstroスターターテンプレートから始めるか、ダークモードとライトモードの切り替えのようなランタイムUIテーマを実装するかです。このガイドでは、Astroテーマのインストールから高度なカスタマイズ技術まで、両方のアプローチをカバーします。

重要なポイント

  • 公式カタログの事前構築されたテンプレートを使用して、CLIでAstroテーマを素早くインストール
  • CSSカスタムプロパティと最小限のJavaScriptを使用してランタイムテーマ切り替えを実装
  • ユーザー設定をチェックするインラインスクリプトでスタイル未適用コンテンツのちらつきを防止
  • WCAGコントラスト比やARIAラベルを含むアクセシビリティのベストプラクティスに従う

Astroスターターテンプレートのインストール

Astroプロジェクトにテーマを追加する最も迅速な方法は、Astro Themes Catalogから事前構築されたテンプレートを使用することです。これらのAstroテーマは、ブログレイアウトからドキュメントサイトまで多岐にわたり、それぞれ異なる機能とデザインアプローチを提供しています。

Astro CLIの使用

Astroにテーマを追加する推奨方法は、CLIを通じて行うことです。

npm create astro@latest -- --template theme-name
# または特定のGitHubテンプレートの場合:
npm create astro@latest -- --template username/repo-name

このコマンドは、テーマの構造、コンポーネント、および設定を含む完全なプロジェクトをスキャフォールディングします。人気のあるオプションには以下が含まれます。

  • Astroダークモードサポートが組み込まれたブログテーマ
  • サイドバーナビゲーション付きのドキュメントテンプレート
  • プロジェクトギャラリー付きのポートフォリオテーマ
  • コンバージョンに最適化されたランディングページテンプレート

フォークとカスタマイズ

Astroテーマのカスタマイズをより細かく制御するには、テーマリポジトリを直接フォークします。

git clone https://github.com/your-fork/theme-name.git
cd theme-name
npm install
npm run dev

このアプローチにより、特にテーマの更新と並行してカスタム変更を維持する必要がある場合、更新と変更の追跡が容易になります。

テーマ構造の理解

ほとんどのAstroスターターテンプレートは、一貫した構造に従っています。

src/
├── components/     # 再利用可能なUIコンポーネント
├── layouts/        # ページテンプレート
├── pages/          # ルートファイル
├── styles/         # グローバルおよびコンポーネントスタイル
└── config.ts       # テーマ設定

カスタマイズの主要ファイルには以下が含まれます。

  • astro.config.mjs - コアAstro設定とインテグレーション
  • src/styles/global.css - グローバルスタイルとCSSカスタムプロパティ
  • src/layouts/BaseLayout.astro - メインレイアウトラッパー

ランタイムUIテーマの実装

スターターテンプレートを超えて、Astro UIテーマは多くの場合、ダーク/ライトモードの切り替えを追加することを意味します。以下は、CSSカスタムプロパティを使用した堅牢な実装です。

テーマ変数の設定

まず、CSSカスタムプロパティを使用してカラースキームを定義します。

/* src/styles/global.css */
:root {
  color-scheme: light dark;
  
  /* ライトモードの色 */
  --color-bg: #ffffff;
  --color-text: #1a1a1a;
  --color-primary: #0066cc;
}

[data-theme="dark"] {
  --color-bg: #1a1a1a;
  --color-text: #e8e8e8;
  --color-primary: #4da3ff;
}

color-schemeプロパティは、ブラウザが各テーマに対してフォームコントロールとスクロールバーを正しくレンダリングするのに役立ちます。

スタイル未適用コンテンツのちらつき防止

FOUCを防ぐために、ドキュメントのheadにこのインラインスクリプトを追加します。

<!-- src/layouts/BaseLayout.astro -->
<script is:inline>
  const theme = localStorage.getItem('theme') || 
    (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
  document.documentElement.setAttribute('data-theme', theme);
</script>

テーマトグルの作成

Astroライトモードとダークモードの切り替えのためのトグルコンポーネントを構築します。

<!-- src/components/ThemeToggle.astro -->
<button id="theme-toggle" aria-label="Toggle theme">
  <span class="sun">☀️</span>
  <span class="moon">🌙</span>
</button>

<script>
  const toggle = document.getElementById('theme-toggle');
  
  toggle?.addEventListener('click', () => {
    const current = document.documentElement.getAttribute('data-theme');
    const next = current === 'dark' ? 'light' : 'dark';
    
    document.documentElement.setAttribute('data-theme', next);
    localStorage.setItem('theme', next);
  });
</script>

ビュートランジション間でのテーマ保持

AstroのView Transitionsを使用する場合、以下でテーマ状態を保持します。

document.addEventListener('astro:after-swap', () => {
  const theme = localStorage.getItem('theme') || 'light';
  document.documentElement.setAttribute('data-theme', theme);
});

テーマ実装のベストプラクティス

アクセシビリティ

  • WCAG AAコントラスト比を確保する(通常テキストで4.5:1、大きなテキストで3:1)
  • テーマトグルに適切なARIAラベルを含める
  • 初期テーマ選択でprefers-color-schemeを尊重する

パフォーマンス

  • JavaScriptスタイル操作の代わりにCSSカスタムプロパティを使用する
  • テーマ切り替えJavaScriptを1KB未満に最小化する
  • 必要に応じて、簡略化されたトグルロジックのためにastro-themesパッケージを活用する

保守性

  • 元のテーマソースとは別のファイルにテーマカスタマイズを保持する
  • カラートークンとデザインの決定を文書化する
  • セマンティックな変数名を使用する(--blue-500ではなく--color-primary)

まとめ

Astroスターターテンプレートから始める場合でも、カスタムAstro UIテーマを実装する場合でも、このフレームワークは両方のニーズに対して柔軟なアプローチを提供します。事前構築されたテーマは、プロフェッショナルなデザインで迅速な開発を提供し、CSSカスタムプロパティと最小限のJavaScriptを使用したランタイムテーマは、スムーズなユーザーエクスペリエンスを保証します。保守可能でユーザーフレンドリーなAstroプロジェクトを構築するために、アクセシビリティ、パフォーマンス、テーマソースとカスタマイズの明確な分離に焦点を当ててください。

よくある質問

Astroカタログの複数のテーマを1つのプロジェクトで使用できますか?

技術的には可能ですが、複数のテーマを組み合わせるには、かなりの手作業が必要です。各テーマには独自の構造と依存関係があります。代わりに、1つのベーステーマを選択してカスタマイズするか、他のテーマから必要な特定のコンポーネントを抽出してください。

カスタマイズを維持しながら、フォークしたAstroテーマを更新するにはどうすればよいですか?

カスタマイズ用に別のブランチを作成し、元のリポジトリからメインブランチに定期的に更新をプルします。その後、メインをカスタムブランチにマージし、必要に応じて競合を解決します。これにより、最新の状態を保ちながら、変更を分離しておくことができます。

Astroでダークモードを実装する際のパフォーマンスへの影響は何ですか?

CSSカスタムプロパティと最小限のJavaScriptで正しく実装された場合、影響はごくわずかです。テーマトグルスクリプトは1KB未満であるべきで、CSS変数にはランタイムコストがありません。レイアウトスラッシングを引き起こす可能性のあるJavaScriptベースのスタイル操作は避けてください。

DevTools for the frontend

Gain Debugging Superpowers

Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.