CSS - contain

トップ > CSSリファレンス > contain

概要

属性名 contain
none | strict | content | [ size || layout || style || paint ]
初期値none
継承継承しない
サポートhttps://caniuse.com/css-containment

説明

ページ全体のレンダリング性能を高めたり、コンテンツの中身が他のコンテンツへの影響することを抑止するための「CSS封じ込め」を行います。

説明
noneCSS封じ込めを行いません。
strict厳密なCSS封じ込めを行います。contain: size layout paint と同義です。
content通常のCSS封じ込めを行います。contain: layout paint と同義です。
size要素の大きさが子要素に依存しないことを示します。要素の大きさを計算する際に子要素の大きさを計算しません。
layoutレイアウトの封じ込めを行います。このコンテンツの子要素は他のコンテンツのレイアウトに影響を及ぼさない、また、外部のコンテンツのレイアウトはこのコンテンツの子要素のレイアウトに影響を及ぼさないことを宣言します。
styleスタイルの封じ込めを行います。コンテンツの内外で counter-increment で計算されるカウンター値や、quotes で指定される引用符の関係が影響を及ぼさなくなります。
paint描画の封じ込めを行います。コンテンツの中身がコンテンツ外にはみ出さないことを宣言します。

使用例

CSS
contain: none;		/* デフォルト */
contain: strict;	/* contain: size layout paint; と同義 */
contain: content;	/* contain: layout paint; と同義 */
contain: size;		/* サイズの封じ込め */
contain: layout;	/* レイアウトの封じ込め */
contain: style;		/* スタイルの封じ込め */
contain: paint;		/* ペイントの封じ込め */
contain: size paint;	/* 複数指定 */
サイズの封じ込め

下記の例では、コンテンツ(article)の大きさは画像などの子要素の大きさに従い変化します。つまり、子要素の大きさを計算しないと親要素の大きさを決定することができません。

CSS
article {
  min-height: 6rem;
  border: 1px solid #999;
}
HTML
<article>
  <h2>Article #1</h2>
  <img src="img/sample.png" alt="Sample Image">
</article>
表示

Article #1

Yuki

contain: size を指定すると、親要素の大きさを計算する際に子要素の大きさを計算しなくなります。親要素や他要路の描画が早くなりますが、子要素を親要素中の格納するのは製作者の責任となります。contain: paint と組み合わせてもよいでしょう。

CSS
article {
  min-height: 6rem;
  border: 1px solid #999;
  contain: size;
}
表示

Article #1

Yuki
レイアウトの封じ込め

下記の例では Article#1 の画像に float: left を指定しているために、画像が Article#2 の領域まではみ出してしまっています。

CSS
article { border: 1px solid #999; }
img { float: left; }
HTML
<article>
  <h2>Article#1</h2>
  <img src="img/sample.png" alt="Sample Image">
  <p>This is article #1...</p>
</article>
<article>
  <h2>Article#2</h2>
  <p>This is article #2...</p>
</article> 
表示

Article#1

Yuki

This is article #1...

Article#2

This is article #2...

contain: layout を指定することによりコンテンツ内部の要素が他のコンテンツにレイアウト的な影響を及ぼすことを防ぐことができます。

CSS
article {
  border: 1px solid #999;
  contain: layout;
}
表示

Article#1

Yuki

This is article #1...

Article#2

This is article #2...

スタイルの閉じ込め

下記の例では Article の中の h2 によって章番号がインクリメントされ、Chapter 2 が3章になってしまっています。

CSS
body { counter-reset: chapter; }
article { border: 1px solid black; margin-left: 1rem; }
h2 { counter-increment: chapter; counter-reset: section; }
h2:before { content: counter(chapter) ". "; }
HTML
<h2>Chapter 1</h2>
<article>
  <h2>Article#1</h2>
</article>
<h2>Chapter 2</h2>
表示

Chapter 1

Article#1

Chapter 2

contain: style を指定することで、Chapter 2 の章番号が 3 になってしまうのを防ぎます。

CSS
article {
  border: 1px solid black;
  margin-left: 1rem;
  contain: style;
}
表示

Chapter 1

Article#1

Chapter 2

描画の封じ込め

下記の例では高さ 50px のコンテンツの中に高さ80px の画像を表示しているために画像がはみ出してしまっています。

CSS
div.box {
  height: 50px;
  border: 1px solid #ccc;
}
HTML
<div class="box">
 <img src="img/sample.png" alt="Sample Image" height=80>
</div>
表示
Sample Image

contain: paint を指定することで子要素がコンテンツをはみ出してしまうのを防ぐことができます。

CSS
div.box {
  height: 50px;
  border: 1px solid #ccc;
  contain: paint;
}
表示
Sample Image

リンク


Copyright (C) 2023 杜甫々
初版:2023年2月19日、最終更新:2023年2月19日
http://www.tohoho-web.com/css/prop/contain.htm