Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【CSS Modules】horizontal-viewport-segmentsメディア機能の使い方

horizontal-viewport-segmentsメディア機能の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

horizontal-viewport-segmentsプロパティは、Webページの表示領域であるビューポートが水平方向にいくつのセグメント(区画)に分割されているかを保持するプロパティです。このプロパティは、特に折りたたみ式デバイスやデュアルスクリーンデバイスなど、物理的に画面が複数に分かれているデバイスのレイアウトに対応するために使用されるCSSのメディア特性の一つです。

このプロパティが示す値は、水平方向のセグメントの数を表す整数値です。例えば、ビューポートが水平に2つの画面に分かれているデバイスであれば、値は2となります。通常の単一画面デバイスでは、値は1です。開発者はこのhorizontal-viewport-segmentsプロパティをCSSの@mediaルール内で利用することで、デバイスの画面分割状況に応じた異なるスタイルを適用できるようになります。

これにより、複数のセグメントにわたってコンテンツを適切に配置したり、各セグメントに最適化されたレイアウトを提供したりすることが可能になります。例えば、2つのセグメントがある場合は、一方のセグメントにナビゲーションを、もう一方にメインコンテンツを表示するなど、柔軟なUI設計を実現できます。デバイスの物理的な特性に合わせたきめ細やかなレスポンシブデザインを実装する上で、非常に重要な役割を果たします。

公式リファレンス: horizontal-viewport-segments

構文(syntax)

1@media (horizontal-viewport-segments: 2) {
2  /* スタイルを記述 */
3}

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

horizontal-viewport-segmentsで画面分割レイアウトを制御する

1/*
2 * horizontal-viewport-segments:
3 * ビューポートが水平方向に分割されている場合に、そのセグメント数をクエリするメディア特性です。
4 * 主に折りたたみ式デバイスやマルチスクリーン環境で、コンテンツのレイアウトを調整するために使用されます。
5 */
6
7/*
8 * 通常の(単一セグメントの)ビューポートでの基本的なスタイル。
9 * ここではコンテンツを中央に配置するシンプルなレイアウトを定義します。
10 */
11body {
12  font-family: sans-serif;
13  margin: 0;
14  padding: 20px;
15  background-color: #f4f4f4;
16  color: #333;
17}
18
19.main-content {
20  max-width: 960px;
21  margin: 0 auto;
22  padding: 20px;
23  background-color: #ffffff;
24  border-radius: 8px;
25  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
26}
27
28h1 {
29  color: #007bff;
30  margin-top: 0;
31}
32
33/*
34 * ビューポートが水平方向に2つのセグメントに分割されている場合に適用されるスタイル。
35 * 例: 完全に展開された折りたたみ式デバイスで、画面が左右に分割されている状態。
36 * このメディアクエリが一致した場合、`.main-content`がグリッドレイアウトになり、
37 * その子要素が2つのセグメントにまたがるように配置されます。
38 */
39@media (horizontal-viewport-segments: 2) {
40  body {
41    padding: 0; /* 複数のセグメントを画面いっぱいに表示するため、bodyの余白をリセット */
42    background-color: #e9ecef;
43  }
44
45  .main-content {
46    max-width: none; /* 画面幅に合わせてコンテンツの最大幅を解除 */
47    margin: 0;
48    padding: 16px;
49    border-radius: 0; /* デバイスの端に合わせるため角丸を解除 */
50    box-shadow: none;
51    display: grid; /* グリッドレイアウトで2つのセグメントを表現 */
52    grid-template-columns: 1fr 1fr; /* 2つのカラム(セグメント)を等しい幅で作成 */
53    gap: 16px; /* セグメント間の間隔 */
54    min-height: 100vh; /* 画面の高さ全体を占めるように */
55    box-sizing: border-box; /* paddingとborderを要素の幅に含める */
56  }
57
58  /*
59   * `.main-content` の直下の子要素がそれぞれのセグメントに配置されることを想定し、
60   * 最初のセグメントに視覚的な区切り線を追加する例です。
61   */
62  .main-content > *:first-child {
63    border-right: 1px solid #dee2e6; /* セグメント間の区切り線 */
64    padding-right: 8px; /* 区切り線とコンテンツの間隔 */
65  }
66
67  .main-content > *:last-child {
68    padding-left: 8px; /* 区切り線とコンテンツの間隔 */
69  }
70}

horizontal-viewport-segmentsは、CSSのメディア特性の一つで、ウェブページを表示するビューポート(画面領域)が水平方向にいくつのセグメントに分割されているかを判定するために使用されます。主に折りたたみ式デバイスや複数のスクリーンを持つ環境において、デバイスの表示状態に応じてコンテンツのレイアウトを最適化する際に役立ちます。この特性に引数や戻り値はありません。

サンプルコードでは、まず通常の(単一セグメントの)ビューポートにおける基本的なページのスタイルを定義しています。ここでは、コンテンツを中央に配置し、背景色や文字色などの一般的な装飾を設定しています。

次に、@media (horizontal-viewport-segments: 2)というメディアクエリを用いて、ビューポートが水平方向に2つのセグメントに分割されている場合に適用されるスタイルを設定しています。これは、例えば折りたたみ式スマートフォンを完全に開いた状態や、左右に並んだ複数のディスプレイ環境などを想定しています。この条件が満たされた場合、bodyの余白をリセットして画面いっぱいに表示し、.main-content要素は最大幅の制限を解除し、display: gridを使ってコンテンツを2つの等しい幅のカラム(セグメント)に配置するよう変更されます。さらに、それぞれのセグメント間に視覚的な区切り線を追加するスタイルも定義されており、コンテンツが複数の画面領域にまたがって自然に表示されるように調整しています。

horizontal-viewport-segmentsは、折りたたみ式デバイスなどの多画面環境で、画面が水平方向にいくつ分割されているかを判定するメディア特性です。比較的新しい機能のため、すべてのブラウザやデバイスで動作するとは限りません。利用前には対応状況を確認し、未対応環境向けの代替表示も考慮してください。エミュレータでは再現しきれない挙動があるため、必ず実際のデバイスで表示を確認することが重要です。この特性がサポートされない場合や、想定外のセグメント数のデバイスでの表示に備え、基本的な単一セグメント用のスタイルが適切に表示されるよう、フォールバック戦略を考慮することが大切です。各セグメントにどのようなコンテンツを配置するか、ユーザー体験を損ねないよう慎重に設計しましょう。

デュアルスクリーン用CSSスタイルを適用する

1/*
2 * ビューポートが2つの水平セグメントに分割されている場合に適用されるスタイル。
3 * これは主に、折りたたみ式デバイスのデュアルスクリーンモードなどで利用されます。
4 */
5@media (horizontal-viewport-segments: 2) {
6  /*
7   * .viewport-segment-info クラスを持つ要素のスタイルを変更します。
8   * 背景色と文字色を調整し、デュアルスクリーンモードであることを視覚的に示します。
9   */
10  .viewport-segment-info {
11    background-color: #e0f7fa; /* 明るい水色 */
12    color: #00796b; /* 濃い青緑色 */
13    padding: 20px;
14    border: 2px dashed #00796b;
15    text-align: center;
16    font-family: sans-serif;
17  }
18
19  /*
20   * さらに、このモードでのテキストの表示を調整できます。
21   */
22  .viewport-segment-info p {
23    font-size: 1.2em;
24    margin-top: 10px;
25    font-weight: bold;
26  }
27}
28
29/*
30 * 通常のビューポート (水平セグメントが1つの場合など) に適用される基本スタイル。
31 * このスタイルは、上記のメディアクエリが適用されない場合に表示されます。
32 */
33.viewport-segment-info {
34  background-color: #f8f8f8; /* 薄い灰色 */
35  color: #333; /* 標準的な濃い灰色 */
36  padding: 15px;
37  border: 1px solid #ccc;
38  text-align: left;
39  font-family: sans-serif;
40}
41
42.viewport-segment-info p {
43  font-size: 1em;
44  margin-top: 5px;
45  font-weight: normal;
46}

horizontal-viewport-segmentsは、ウェブページが表示されるビューポート(表示領域)が、いくつの水平な区画(セグメント)に分割されているかを検出するためのCSSメディア特性です。この特性は、主に折りたたみ式デバイスのデュアルスクリーンモードや、複数の画面を持つデバイスなど、特殊な表示環境でウェブサイトのレイアウトやスタイルを最適化するために利用されます。

サンプルコードでは、@media (horizontal-viewport-segments: 2) というメディアクエリによって、ビューポートが2つの水平セグメントに分割されている場合に特定のスタイルが適用されるように設定されています。例えば、折りたたみ式デバイスがデュアルスクリーンモードで開かれているような状況で、.viewport-segment-infoクラスを持つ要素の背景色や文字色などが、通常の表示とは異なるデザインに変更されます。これにより、デュアルスクリーン環境に最適化された視覚的な情報を提供し、ユーザー体験を向上させることができます。

一方、メディアクエリの外側に記述されているスタイルは、horizontal-viewport-segments: 2の条件に合致しない、通常の1つの画面として表示されるビューポートなどに適用される基本デザインです。このhorizontal-viewport-segmentsという特性自体は引数を直接取らず、戻り値もありません。代わりに、メディアクエリ内で値(例: 2)を指定することで、その値が現在のビューポートの水平セグメント数と一致するかどうかを評価し、条件が真の場合にのみ対応するCSSスタイルを適用するという挙動を示します。この機能を使うことで、多様なデバイス環境に適応した柔軟なユーザーインターフェースの実装が可能になります。

「horizontal-viewport-segments」は、折りたたみ式デバイスのように画面が物理的に複数に分割される特殊なビューポートに対応するためのCSSメディア特性です。サンプルコードのように「2」を指定することで、水平に2分割された環境にのみスタイルを適用できます。

注意点として、この機能は比較的新しく、すべてのブラウザやデバイスでサポートされているわけではありません。そのため、実装前に必ずブラウザの互換性を確認してください。また、対象外の環境でも適切に表示されるよう、メディアクエリの外に通常のデフォルトスタイルを定義する「フォールバック」を忘れないでください。

開発時には、エミュレータだけでなく、可能な限り実際のデュアルスクリーンデバイスや折りたたみ式デバイスでの動作確認を行うことが、安全で正しい利用のために非常に重要です。

関連コンテンツ

関連IT用語

関連プログラミング言語