ネガティブマージンによる拡張 + パディングで戻す
問題
padding が設定されたコンテナの内部では、すべての子要素がコンテナの padding を尊重し、端から内側に配置されます。しかし、特定のセクションの背景色や画像、ボーダーをコンテナの端まで広げたい場合があります。テキストコンテンツはページの他の部分と揃えたまま、視覚的にはコンテナからはみ出させたいケースです。AIエージェントはこのような場面で、余分なラッパー div を追加したり、要素をコンテナの外に出したり、100vw ハックを使って水平スクロールバーを発生させたりしがちです。
解決方法
負の水平マージンで要素をコンテナの padding の外側に引き出し、同じ値の正の padding でコンテンツを元の位置に戻します:
.container {
max-width: 600px;
margin: 0 auto;
padding: 0 24px;
}
.full-bleed-section {
margin-left: -24px;
margin-right: -24px;
padding-left: 24px;
padding-right: 24px;
background: hsl(220 80% 96%);
}
負のマージンと正のパディングは必ず同じ値にします。背景は広がりますが、テキストは元の位置のまま保たれます。
ネガティブマージンによる拡張と通常コンテンツの比較
論理プロパティの使用
国際化対応を向上させるために、物理的な left/right の代わりに論理プロパティを使います:
.full-bleed-section {
margin-inline: -24px;
padding-inline: 24px;
background: hsl(220 80% 96%);
}
レスポンシブ対応
コンテナの padding がブレークポイントごとに変わる場合、拡張の値もそれに合わせます:
.container {
padding-inline: 16px;
}
.full-bleed-section {
margin-inline: -16px;
padding-inline: 16px;
}
@media (min-width: 768px) {
.container {
padding-inline: 32px;
}
.full-bleed-section {
margin-inline: -32px;
padding-inline: 32px;
}
}
@media (min-width: 1024px) {
.container {
padding-inline: 48px;
}
.full-bleed-section {
margin-inline: -48px;
padding-inline: 48px;
}
}
レスポンシブ対応の全幅拡張(ビューポート切り替え)
重要なルール
負のマージンは親コンテナの padding を絶対に超えてはいけません。超えるとページの端からはみ出し、水平スクロールバーが発生します。
/* The container has 24px padding */
.container {
padding-inline: 24px;
}
/* GOOD — matches the container padding */
.full-bleed {
margin-inline: -24px;
padding-inline: 24px;
}
/* BAD — exceeds the container padding, causes overflow */
.full-bleed-broken {
margin-inline: -48px;
padding-inline: 48px;
}
AIがよくやるミス
- 全幅表示に
width: 100vwを使う — ページに縦スクロールバーがある場合、100vwはスクロールバーの幅を含むため水平スクロールバーが発生します。ネガティブマージンのテクニックならこの問題を完全に回避できます。 - padding とマージンの値を一致させない —
margin-inline: -32pxを設定してもpadding-inline: 32pxを忘れると、テキストコンテンツが左右にずれてアライメントが崩れます。 - コンテナの padding を超える値を指定する — 負のマージンは親の padding の範囲までしか引き出せません。それ以上の値を指定するとオーバーフローが発生します。
- 親要素に
overflow: hiddenを使う — 拡張した背景がクリップされます。親要素が別の理由でoverflow: hiddenを必要とする場合は、中間のラッパーコンテナを使いましょう。
使用場面
- padding が設定された記事レイアウト内でのハイライトセクションやコールアウトブロック
- 幅が制限されたコンテンツコンテナ内での全幅背景色や画像
- テキストの整列を保ちつつ、視覚的に目立たせたいセクション
- シングルカラムレイアウト内での交互の背景帯