ボックス

contain

contain は、箱の中身を外から切り離して(封じ込めて)、中の変化がページのほかの部分に影響しないことをブラウザに約束します。ブラウザはその範囲だけ計算し直せばよくなるので、描画が速くなります。

構文

none | strict | content | [ [ size | inline-size ] || layout || style || paint ]

プレビュー

Open https://example.com/a/very/long/path to see more. The quick brown fox jumps over the lazy dog. 素早い茶色の狐がのろまな犬を飛び越える。きのうは雨でしたが、けさはよく晴れています。
プリセット
右下の角をドラッグするとサイズを変えられます

コード

.box {
  overflow: visible;
  height: auto;
  contain: paint;
}

コントロール

containpaint
contain
大きさ(size・inline-size)
大きさ(size・inline-size)
ほかの種類
layout中の配置を切り離す
styleカウンターを閉じ込める
paintはみ出しを切る
Open https://example.com/a/very/long/path to see more. The quick brown fox jumps over the lazy dog. 素早い茶色の狐がのろまな犬を飛び越える。きのうは雨でしたが、けさはよく晴れています。

解説

値の書き方

  • none:封じ込めません。初期値です。
  • size:大きさを、中身が無いものとして決めます。高さを決めていない箱は、中身があっても縮みます。
  • inline-size:size と同じことを、行の向き(横書きなら幅)だけにします。size とは一緒に書けません。
  • layout:中の配置を切り離します。中の float やマージンが外に出なくなり、中の position: absolute と position: fixed の要素は、この箱を基準に置かれます。
  • style:counter-increment などのカウンターと引用符の数え方が、箱の外に影響しないようにします。
  • paint:中身を、padding の外側の線(overflow の切り取りの線)で切ります。overflow: clip と同じように、はみ出した部分が見えなくなります。
  • strict:size layout style paint と同じです。
  • content:layout style paint と同じです。大きさ以外をまとめて封じ込めます。

プレビューの見方

このページのプレビューは、補助の宣言で overflow: visible と height: auto にして、はみ出した中身が見え、箱の高さが中身に合うようにしています。1 行目の長い URL が箱の右にはみ出しています。paint にするとはみ出した URL が切られ、size にすると箱の高さが縮んで文章が下にはみ出します。strict では両方が起きて、縮んだ箱の中身はほとんど見えなくなります。

inline-size は、このプレビューでは変わりません。箱の幅が 240px と決まっているからです。幅が中身で決まる箱(display: inline-block や float の要素など)では、中身が無いものとして幅が縮みます。

よく使う場面

  • ページの中で独立したウィジェットや、長いリストのそれぞれの項目に contain: content を書いて、中の変化で計算し直す範囲を狭めます。
  • コンテナクエリの container-type は、内部で size や inline-size の封じ込めを使います。中身で幅が決まらないようにして、中身から幅を問い合わせても堂々巡りにならないようにするためです。

気をつけること

  • layout と paint は、重なりの基準(スタッキングコンテキスト)も作ります。中の z-index は、箱の外の要素とは比べられなくなります。
  • layout の箱はベースラインを持たないものとして扱われ、行の中でベースラインに揃えたときの位置が変わります。
  • size と paint は、表の行や display: inline の要素には効きません。size は表のセルと表そのものにも効きませんが、paint はセルには効きます。
  • 主要なブラウザすべてで使えます。style は Firefox が 103、Safari が 27 から対応しています。

コメント