`<wa-scroller>` のホスト要素に `overflow: hidden` を追加してChromeの横スクロールバグを修正

shoelace-style/webawesome

<wa-scroller> コンポーネントのホスト要素に overflow: hidden が欠落していたことで、Chromeのみでページ全体に意図しない横スクロールが発生していました。1行のCSS追加でこのエッジケースを解消しています。

背景

#2157 にて、コンポーネントドキュメントページをChromeで幅約470px以下に縮小すると横スクロールが発生するという問題が報告されました。SafariやFirefoxでは再現せず、Chromeのみで発生するレイアウトバグでした。

問題の原因究明は見かけの症状に惑わされやすいものでした。横スクロールが発生するページはドキュメントページであり、そこにはトーストのサンプルも含まれていたため、一見するとドキュメントのレイアウト問題やトーストコンポーネントのバグに見えました。しかし調査の結果、<wa-scroller> を非表示にすると問題が解消することが判明し、真の原因が特定されました。

根本原因は、<wa-scroller> のホスト要素(:host)に overflow: hidden が設定されていなかったことです。テーブルなどの幅広いコンテンツを内包した場合、Chromeの特定のレイアウト計算においてホスト要素がはみ出したコンテンツを抑制できず、ページ全体の横スクロールを引き起こしていました。

技術的な変更

scroller.styles.ts のホスト要素セレクター(:host)に overflow: hidden を1行追加することで修正されています。

変更前:

:host {
  display: block;
  position: relative;
  max-width: 100%;
  isolation: isolate;
}

変更後:

:host {
  display: block;
  position: relative;
  max-width: 100%;
  overflow: hidden;
  isolation: isolate;
}

:host には既に max-width: 100% が指定されており、コンテナの幅を親要素内に収める意図は元から存在していました。しかし max-width だけではChromiumのレイアウトエンジンがブロック整形コンテキスト(BFC)を正しく確立しないケースがあり、内部コンテンツのオーバーフローがページ全体に漏れ出していました。overflow: hidden を追加することで新しいBFCが強制的に生成され、内部コンテンツのはみ出しがホスト要素の境界で確実に抑制されます。

設計判断

overflow: hidden をスクローラー内部のコンテナではなくホスト要素(:host)に適用するという判断が採られています。

<wa-scroller> はスクロール可能な領域を提供するコンポーネントであり、内部では別途スクロール用のオーバーフロー設定が行われています。ホスト要素への overflow: hidden 適用は、スクロール機能そのものを損なうことなく、コンポーネント外部への視覚的なはみ出しのみを防ぐ役割を担います。これはWeb Componentsにおけるカプセル化の原則に沿った対処であり、ホストがコンテンツの境界を責任を持って管理するというアプローチです。

まとめ

この修正は、症状(横スクロール)→誤った仮説(トーストバグ、ドキュメントバグ)→真因(スクローラーのBFC未確立)という診断プロセスを経て辿り着いた1行の変更です。overflow: hidden によるBFCの強制生成は、CSSレイアウトにおける古典的かつ確実な手法であり、ブラウザ間の挙動の差異を吸収するためにコンポーネントのホスト要素に適用することで、使用側への影響を最小化しています。

記事メタデータ

Generated by:
Claude Sonnet 4.6 for DiffDaily
LLM Trace:
616a8891

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

品質レビュー結果

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

Review Criteria:

記事構成 ✓ PASS

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

「リード文→背景→技術的な変更→設計判断→まとめ」の構成が明確で、ガイドラインの「総論→各論→結論」を完全に満たしています。

カスタムMarkdown構文 ✓ PASS

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

ファイル名付きシンタックスハイライト(`typescript:path/to/file`)とGitHubのIssue/PRリンク記法が正しく使用されています。

対象読者への適合性 ✓ PASS

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

BFCやWeb Componentsのホスト要素といった専門用語を適切に使用しており、専門知識を持つエンジニアという対象読者に適合しています。

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

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

各セクションが総論から始まり、各段落がトピックセンテンスで始まるなど、パラグラフ・ライティングの原則が守られており、非常に読みやすい構造です。

Diff内容との照合 ✓ PASS

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

`overflow: hidden;` の追加という変更点が、提供されたDiff情報と完全に一致しており、コード引用は正確です。

技術用語の正確性 ✓ PASS

技術用語の正確な使用

「ブロック整形コンテキスト(BFC)」「ホスト要素」「カプセル化」などの技術用語が、文脈に沿って正確に使用されています。

説明の技術的正確性 ✓ PASS

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

`overflow: hidden` がBFCを生成し、コンテンツのはみ出しを抑制するという説明は技術的に正確で、変更の理由を論理的に解説できています。

事実の突合 ✓ PASS

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

記事の主張はすべてPRのDescriptionやDiff情報で裏付けられています。BFCや設計判断に関する解説はコードから導かれる妥当なもので、ハルシネーションは見られません。

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

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

PR番号(#2158)とIssue番号(#2157)が正確に記載されています。

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

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

記事のタイトルは、PRの技術的な内容を的確に要約しており、PRの内容と完全に一致しています。

外部知識の正確性 ✓ PASS

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

記事にはPR情報に基づかない外部知識(バージョンサポート状況、リリース日程など)の捏造は含まれていません。

時間表現の正確性 ✓ PASS

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

記事内の時間表現はPR情報と矛盾しておらず、事実関係を正確に伝えています。