CSS Containmentの仕組みを理解してレンダリングパフォーマンスをアップする2 検証
UI開発者 佐竹contain
プロパティにstyle
やsize
を指定した場合に、どうレンダリングされるかをご紹介します。
CSS Containmentの概要については「CSS Containmentの仕組みを理解してレンダリングパフォーマンスをアップする1 概要」をご確認ください。
タイトルを「レンダリングパフォーマンスをアップする」としていますが、今回ご紹介するstyle
とsize
はパフォーマンスを向上するものというよりは、包含ブロックの内外でスタイルの計算やサイズの計算を分けることを目的としています。
styleの検証
contain: style;
の設定の有無によるcounter()
のカウントの違いからStyleの封じ込めを検証します。
containプロパティの設定がない場合
contain
プロパティの設定がないブロックを2つ用意します。- ブロックをまたいでそれぞれのブロック内の要素をカウントするようにCSS
counter()
を指定します。 - クリックするたびに、1つ目のブロックに要素を追加するボタンを用意します。
See the Pen styleの検証(containプロパティの設定がない場合) by ミツエーリンクス (@mitsue-links) on CodePen.
- 初期表示
- 1つ目のブロック内の要素のカウントに続き、2つ目のブロック内の要素がカウントされます。
- ボタンをクリックして、1つ目のブロックに要素を追加
- 2つ目のブロック内の要素のカウントが変わります。
1つ目のブロックと2つ目のブロックでスタイルの計算が分かれていないことがわかります。
containプロパティにstyleを指定した場合1
1つ目のブロック要素にcontain: style;
を指定して、包含ブロックとします。
See the Pen styleの検証(containプロパティにstyleを指定した場合1) by ミツエーリンクス (@mitsue-links) on CodePen.
- 初期表示
- 包含ブロック内、包含ブロック外のそれぞれで独立して要素がカウントされます。
- ボタンをクリックして、1つ目のブロックに要素を追加
- 2つ目の包含ブロック外では要素のカウントが初期表示の状態から変わりません。
1つ目のブロックと2つ目のブロックでスタイルの計算が分かれている(封じ込められている)ことがわかります。 包含ブロック内のスタイルの変更が包含ブロック外のスタイルに影響していません。
containプロパティにstyleを指定した場合2
1つ目の包含ブロックと2つ目のブロック(包含ブロック外)を入れ替えて確認します。
See the Pen styleの検証(containプロパティにstyleを指定した場合2) by ミツエーリンクス (@mitsue-links) on CodePen.
- 初期表示
- 包含ブロック外、包含ブロック内のそれぞれで独立して要素がカウントされます。
- ボタンをクリックして、1つ目のブロックに要素を追加
- 2つ目の包含ブロック内では要素のカウントが初期表示の状態から変わりません。
包含ブロック外のスタイルの変更が包含ブロック内のスタイルに影響していません。
sizeの検証
contain: size;
の設定の有無によるブロック要素のサイズの違いからSizeの封じ込めを検証します。
containプロパティの設定がない場合
contain
プロパティの設定がないブロックを用意します。ブロック要素にCSSのwidth
height
プロパティを使うようなサイズの指定はしません。- クリックするたびに、ブロックに要素を追加するボタンを用意します。
See the Pen sizeの検証(containプロパティの設定がない場合) by ミツエーリンクス (@mitsue-links) on CodePen.
- 初期表示
- ブロック要素のサイズはブロック内の要素のサイズになります。
- ボタンをクリックして、ブロックに要素を追加
- ブロック要素のサイズはブロック内に追加された要素のサイズにあわせて変わります。
ブロック要素のサイズがブロック内の要素のサイズから計算されていることがわかります。
containプロパティにsizeを指定した場合1
ブロック要素にcontain: size;
を指定して、包含ブロックとします。包含ブロック要素にCSSのwidth
height
プロパティを使うようなサイズの指定はしません。
See the Pen sizeの検証(containプロパティにsizeを指定した場合1) by ミツエーリンクス (@mitsue-links) on CodePen.
- 初期表示
- 包含ブロック要素はサイズが0になります※。
- 包含ブロック内の要素は、包含ブロック要素を基準とした相対配置になります。
- ボタンをクリックして、ブロックに要素を追加
- 包含ブロック要素のサイズは初期表示と変わりません。
※ 包含ブロック要素にmargin、border、paddingのサイズ指定がある場合は、その指定したmargin、border、paddingのサイズは0にはならずにそのまま残ります。
包含ブロック要素のサイズがブロック内の要素のサイズから計算されていないことがわかります。
containプロパティにsizeを指定した場合2
包含ブロック要素にCSSのwidth
height
プロパティを使ってサイズを指定します。
See the Pen sizeの検証(containプロパティにsizeを指定した場合2) by ミツエーリンクス (@mitsue-links) on CodePen.
- 初期表示
- 包含ブロック要素はCSSの
width
height
プロパティを使って指定したとおりのサイズになります。 - 包含ブロック内の要素は、包含ブロック要素を基準とした相対配置になります。
- 包含ブロック要素はCSSの
- ボタンをクリックして、ブロックに要素を追加
- 包含ブロック要素のサイズは初期表示と変わりません。
ブロック要素のサイズ計算が行われないということが、必ずしもブロック要素のサイズが0になるということではなく、指定したとおりのサイズになることがわかります。
まとめ
style
やsize
は包含ブロックの内外でスタイルの計算やサイズの計算を分けることで、計算の影響範囲を限定できます。
そのため例えば地図や動画など、サードパーティの埋め込みコンテンツを独立して管理したい場合にも利用を検討したいです。
次回以降のBlogでcontain
プロパティにlayout
やpaint
を指定した場合やcontent-visibility
プロパティを設定した場合のCSS Containmentの検証をご紹介します。