チュートリアルページのレイアウト崩れをCSSスコープ修正で解決

rails/website

/docs/tutorials ページで発生していたセクションの重なりと不自然な余白の2つのレイアウトバグを、CSSの適用スコープ見直しと不要なクラスの削除で修正しました。

背景

チュートリアルページでは、中間的な画面幅(ナローウィンドウやスプリットスクリーン表示)において「Advanced」セクションが「Beginner」カードの上に重なるバグが発生していました。Beginnerカードのコンテンツがコンテナの高さを超えたため、次のセクションがその上に描画されてしまう状態でした。

この重なりを修正した後には、BeginnersセクションとAdvancedセクション間に不自然に大きな空白が生じるという副作用も確認されました。原因を辿ると、2つの独立した問題が組み合わさっていました。

技術的な変更

問題の根本は、_docs.scss に記述されたグローバルな max-height: 500px_cards.scss のモバイル向けリセットより後に読み込まれ、カードの高さを強制的に制限していた点にあります。

_sass/modules/_docs.scssの変更前:

.card__fullwidth .card {
  max-height: 500px !important;
}

変更後:

.card__fullwidth .card {
  max-height: none !important;

  @media (min-width: 768px) {
    max-height: 500px !important;
  }
}

max-height: 500px の適用をビューポート幅 768px 以上に限定することで、モバイル・ナロー幅では制限を解除し、コンテンツが自然な高さで表示されるようになりました。

不自然な余白の原因は、padfix クラスと common-padding--bottom-small クラスの組み合わせにありました。padfix はCSSの古い回避策として padding-bottom: 80px を付与するクラスで、_cards.scss 内に定義されていました。

_pages/tutorial.htmlの変更:

<!-- 変更前 -->
<div class="docs cards common-padding--bottom-small padfix">

<!-- 変更後 -->
<div class="docs cards">

_sass/modules/_cards.scssの変更:

/* 削除されたブロック */
&.padfix {
  padding-bottom: 80px;
}

@media (min-width: 768px) {
  &.padfix {
    padding-bottom: 0;
  }
}

さらに _cards.scss では max-height: auto !importantmax-height: none !important に修正しています。auto はCSSの max-height プロパティの有効値ではないため、none(制限なし)が正しい記述です。

設計判断

CSSカスケードの問題をグローバル修正ではなくメディアクエリのスコープ限定で解決するアプローチが採用されました。

_docs.scssmax-height: 500px はデスクトップ表示でカードの高さを揃えるために必要な制約です。これを全幅削除するのではなく、適用条件をメディアクエリで絞ることで、デスクトップのデザイン意図を維持したまま、ナロー幅での高さ制限を解除しています。

padfix クラスの削除は、歴史的な回避策をクリーンアップする判断です。本来の問題(max-height によるコンテンツのクリッピング)が解消されたことで、その補正として存在していた padding-bottom: 80px も不要になりました。HTML側のクラス指定とSCSS側の定義の両方を同時に削除することで、将来的な混乱を防いでいます。

まとめ

CSSの読み込み順とカスケードが引き起こすレイアウト崩れを、グローバルスタイルの削除ではなくメディアクエリによるスコープの精緻化で解消した修正です。max-height の適用範囲をビューポート幅で制御するというシンプルな変更が、重なりと余白の両問題を一貫した方針で解決しています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
7a2b3097

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

記事構成 ✓ PASS

Title, Context, Technical Detailの存在と明確さ

リード文(総論)→背景・技術詳細・設計判断(各論)→まとめ(結論)の3部構成が明確に守られており、読者が理解しやすい構成です。

カスタムMarkdown構文 ✓ PASS

シンタックスハイライト・GitHubリンク記法の正確性

ファイル名付きシンタックスハイライト(`言語:ファイルパス`)およびPR番号のリンク記法(`[#661](URL)`)が正しく使用されています。

対象読者への適合性 ✓ PASS

エンジニア向けの適切な技術レベルと表現

CSSのカスケード、スコープ、メディアクエリといった専門用語を前提としており、対象読者であるエンジニアに適した技術レベルで記述されています。

パラグラフ・ライティング ✓ PASS

トピックセンテンス・1段落1トピック・段落長

各セクションが総論→各論の構成になっており、各段落もトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られています。これにより、記事の要点を素早く把握できます。

Diff内容との照合 ✓ PASS

コードブロックとDiff内容の一致

記事内で引用されているSCSSおよびHTMLのコードは、提供されたDiffの内容と完全に一致しており、正確に内容を反映しています。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「CSSカスケード」「ビューポート幅」「メディアクエリ」などの技術用語が文脈に応じて正確に使用されています。特に `max-height: auto` が不正な値であるという指摘は技術的に正確です。

説明の技術的正確性 ✓ PASS

技術的主張の正確性と論理性

CSSの読み込み順序が問題の原因であること、メディアクエリで適用範囲を限定して解決したことなど、変更の背景と内容に関する説明は技術的に正確かつ論理的です。

事実の突合 ✓ PASS

PR情報による主張の裏付け(ハルシネーション検出)

記事内のすべての主張(レイアウト崩れの2つの原因、`padfix`クラスの役割など)は、PRのDescriptionやDiff内のコードによって裏付けられており、ハルシネーションは検出されませんでした。

数値・固有名詞の確認 ✓ PASS

PR番号・コミットID・バージョン等の正確性

PR番号(#661)、ビューポート幅(768px)、CSSのプロパティ値(500px, 80px)などの数値や固有名詞はすべて正確です。

タイトル・説明との一致 ✓ PASS

記事タイトル・説明とPR内容の一致

記事のタイトル「チュートリアルページのレイアウト崩れをCSSスコープ修正で解決」は、PRの「Fix tutorial layout」という内容をより具体的に、かつ正確に表現しています。

外部知識の正確性 ✓ PASS

PRに記載のない外部知識(LTS、サポート状況など)の不使用

記事には、PR情報に記載のないバージョンサポート状況やリリース日程などの外部知識は含まれておらず、提供された情報源に忠実です。

時間表現の正確性 ✓ PASS

時間表現がPR情報と一致しているか

「発生していました」などの過去形の表現が使われており、完了した修正内容を報告するPRの文脈と一致しています。時間表現の歪曲はありません。