【デザイン基礎|実務向け】contain-intrinsic-heightで解決する「レイアウトシフト」と「レンダリングコスト」の最適化

Webサイトのパフォーマンス計測において、最も頭を悩ませる指標の一つがCLS(Cumulative Layout Shift)です。特に、非同期で読み込まれるコンテンツや無限スクロールの実装において、要素が後から表示された瞬間にレイアウトがガタつく現象は、ユーザー体験を著しく損ねます。今回は、この課題を根本から解決するCSSプロパティ「contain-intrinsic-height」について、実務的な視点で解説します。

なぜheight: autoでは不十分なのか

これまで、未読み込みの要素の高さ(プレースホルダー)を確保するために、私たちは「height: 0」や「min-height」を駆使してきました。しかし、コンテンツの中身が動的に変わる場合、あらかじめ高さを固定するのは現実的ではありません。ここで登場するのが「content-visibility: auto」と「contain-intrinsic-height」の組み合わせです。

contain-intrinsic-heightの役割と本質

「content-visibility: auto」を適用すると、画面外にある要素のレンダリングがスキップされます。これ自体は素晴らしい機能ですが、ブラウザは「その要素の高さが0である」と判断してしまい、スクロールバーが激しく上下する問題が発生します。

ここで「contain-intrinsic-height」の出番です。これは、レンダリングがスキップされている状態の要素に対して、「仮想的な高さ」をブラウザに伝達するプロパティです。これにより、ブラウザは要素が読み込まれる前から適切な高さを計算し、スクロールバーの位置を固定したままスムーズな表示を実現できます。

実務での具体的な活用パターン

実務における最適な指定方法は、単なる固定値ではなく「概算値」を渡すことです。例えば、カード型レイアウトのリストを実装する場合、以下のように記述します。

.card-item {
content-visibility: auto;
contain-intrinsic-height: 300px;
}

ここで重要なのは、実際の要素の平均的な高さに近い数値を設定することです。もしコンテンツの高さにばらつきがある場合、大きすぎる値や小さすぎる値を指定すると、かえってスクロールの挙動が不自然になります。私はよく、開発者ツールでコンテンツが完全にロードされた状態の平均高さを計測し、その数値をベースに設定値を決めています。

シニアデザイナーとしてのアドバイス

このプロパティを導入する際の注意点は、「万能薬ではない」ということです。すべてのコンポーネントに安易に適用すると、逆に計算コストが増大し、低スペック端末で逆効果になるケースもあります。

まずは、メインコンテンツのリストや、ページ下部にある重いセクションなど、「表示回数が多く、かつレイアウトへの影響が大きい箇所」に限定して導入することをお勧めします。技術はあくまでユーザーのためにあるものです。CLSを改善し、ユーザーが快適に読み進められる心地よいUIを、このプロパティで実現していきましょう。

コメント

タイトルとURLをコピーしました