Next.jsにおけるレスポンシブ実装とちらつき対策

目次

はじめに

Next.jsでレスポンシブ対応を実装する際、SSRやSSGの特性により初期レンダリング時にちらつきが発生することがあります。今回は、その問題の解決方法と実装のベストプラクティスについて解説します。

レスポンシブ実装の2つのアプローチ

レスポンシブ実装アプローチ CSS Media Query スタイル定義のみの変更 メリット: ・DOMツリー構造不変 ・SSR/SSG時から適用 ・実装がシンプル useMediaQuery コンポーネントの切り替え ユースケース: ・複雑なレイアウト変更 ・条件付きレンダリング ・動的コンテンツ切替

1. CSS Media Queryによる実装

最もシンプルで効率的なアプローチは、CSS Media Queryを使用することです。

@media screen and (min-width: 1024px) {
  /* PC向けスタイル */
  .container {
    padding: 20px;
  }
}

@media screen and (max-width: 1023px) {
  /* スマートフォン向けスタイル */
  .container {
    padding: 10px;
  }
}

このアプローチのメリット:

  • DOMツリーの構造変更を伴わないため、パフォーマンスが良い
  • SSR/SSG時にもスタイルが適用される
  • 実装がシンプル

2. useMediaQueryによるコンポーネント切り替え

より複雑なレイアウトの切り替えが必要な場合は、useMediaQueryを使用します。

interface Props {
  sp: React.ReactElement;
  pc: React.ReactElement;
  initial?: "sp" | "pc" | "none";
}

function Switcher({ pc, sp, initial = "sp" }: Props): React.ReactElement {
  const displaySP = useMediaQuery("(max-width: 1023px)");
  const displayPC = useMediaQuery("(min-width: 1024px)");
  
  if (displaySP) return sp;
  if (displayPC) return pc;
  if (initial === "sp") return sp;
  if (initial === "pc") return pc;
  return <></>;
}

ちらつき防止の実装ポイント

1. 初期表示の制御

SSR/SSG時のちらつきを防ぐために、以下の点に注意が必要です:

  • initialプロパティで初期表示するコンテンツを制御
  • SEO考慮が必要な場合は適切な初期値を設定
  • ちらつきを完全に防ぎたい場合はinitial="none"を使用
レンダリングフローとちらつき対策 SSR/SSG時の 初期レンダリング ハイドレーション クライアント レンダリング ちらつき対策: 1. initial プロパティで初期表示を制御 2. SEO考慮が必要な場合は適切な初期値を設定

2. コンポーネントの使い分け

// 使用例
return (
  <Switcher
    sp={<MobileComponent />}
    pc={<DesktopComponent />}
    initial="none"
  />
);

実装時の注意点

  1. できるだけCSS Media Queryを優先する
    • スタイルの変更のみの場合はCSS Media Queryを使用
    • コンポーネントの切り替えが必要な場合のみuseMediaQueryを使用
  2. SEOへの配慮
    • 重要なコンテンツは初期レンダリング時に表示されるよう設定
    • 非表示要素のSEOへの影響を考慮
  3. パフォーマンスの最適化
    • 不要なコンポーネントの描画を避ける
    • レンダリングのちらつきを最小限に抑える
Switcherコンポーネントの動作 初期状態 initial=”sp”|”pc”|”none” SP表示 displaySP = true PC表示 displayPC = true 条件判定順序: 1. displaySP → SPコンポーネント 2. displayPC → PCコンポーネント 3. initial値による出し分け

まとめ

Next.jsでのレスポンシブ実装では、以下の点を意識することで、効率的で快適なユーザー体験を提供できます:

  • 単純なスタイル変更はCSS Media Queryを使用
  • コンポーネントの切り替えが必要な場合はuseMediaQueryを使用
  • 初期表示を適切に制御してちらつきを防止
  • SEOとパフォーマンスのバランスを考慮した実装

これらの実装方法を適切に組み合わせることで、快適なレスポンシブサイトを構築することができます。

この記事を書いた人

目次