メディアクエリ

デザイナーはユーザーに合わせてデザインを調整できます。最もわかりやすい例は、ユーザーのデバイスのフォーム ファクタ(デバイスの幅、デバイスのアスペクト比など)です。デザイナーは、メディアクエリを使用することで、こうしたさまざまなフォーム ファクタに対応できます。

メディアクエリは @media キーワードで開始され(通常は CSS で)、さまざまなユースケースに使用できます。

さまざまなタイプの出力をターゲットにする

ウェブサイトは多くの場合画面に表示されますが、CSS を使用して他の出力用のウェブサイトのスタイルを設定することもできます。 たとえば、ウェブページで画面の見た目を一方向に変えて、印刷時には別のウェブページに表示したい場合があります。 これは、メディアタイプをクエリすることで可能になります。

この例では、背景色はグレーに設定されています。 ただし、ページが印刷されている場合は、背景色を透明にする必要があります。これにより、ユーザーのプリンタのインクを節約できます。

body {
  color: black;
  background-color: grey;
}

@media print {
  body {
    background-color: transparent;
  }
}

スタイルシートで @media at ルールを使用するか、別のスタイルシートを作成して link 要素で media 属性を使用します。

<link rel="stylesheet" href="global.css">
<link rel="stylesheet" href="print.css" media="print">

CSS のメディアタイプを指定しない場合は、自動的に all のメディアタイプ値が設定されます。次の 2 つの CSS ブロックは同じものです。

body {
  color: black;
  background-color: white;
}
@media all {
   body {
     color: black;
     background-color: white;
   }
}

この 2 行の HTML も同じ内容です。

<link rel="stylesheet" href="global.css">
<link rel="stylesheet" href="global.css" media="all">

クエリの条件

メディアタイプに条件を追加できます。これらはメディアクエリと呼ばれます。 CSS は、メディアタイプが一致し、かつ条件も true である場合にのみ適用されます。 これらの条件はメディア機能と呼ばれます。

メディアクエリの構文は次のとおりです。

@media type and (feature)

スタイルが別のスタイルシートに含まれている場合は、link 要素でメディアクエリを使用できます。

<link rel="stylesheet" href="specific.css" media="type and (feature)">

ブラウザ ウィンドウが横表示(ビューポートの幅が高さより広い)かポートレート モード(ビューポートの高さが幅より広い)かに応じて、異なるスタイルを適用するとします。テストに使用できる orientation というメディア機能があります。

@media all and (orientation: landscape) {
   // Styles for landscape mode.
}
@media all and (orientation: portrait) {
   // Styles for portrait mode.
}

または、個別のスタイルシートを使用します。

<link rel="stylesheet" href="landscape.css" media="all and (orientation: landscape)">
<link rel="stylesheet" href="portrait.css" media="all and (orientation: portrait)">

この場合、メディアタイプは all です。これはデフォルト値であるため、必要に応じて省略できます。

@media (orientation: landscape) {
   // Styles for landscape mode.
}
@media (orientation: portrait) {
   // Styles for portrait mode.
}

または、個別のスタイルシートを使用します。

<link rel="stylesheet" href="landscape.css" media="(orientation: landscape)">
<link rel="stylesheet" href="portrait.css" media="(orientation: portrait)">

メディア タイプごとに個別のスタイルシート(print など)を使用しても問題ない場合もありますが、メディアクエリごとに個別のスタイルシートを使用することはおすすめしません。代わりに @media at-rules を使用してください。

ビューポートのサイズに基づいてスタイルを調整する

レスポンシブ デザインにおいて最も有用なメディア機能の一つに、ブラウザのビューポートのサイズに関するものがあります。 ブラウザ ウィンドウが特定の幅よりも広い場合にスタイルを適用するには、min-width を使用します。

@media (min-width: 400px) {
  // Styles for viewports wider than 400 pixels.
}

特定の幅未満でスタイルを適用するには、max-width メディア機能を使用します。

@media (max-width: 400px) {
  // Styles for viewports narrower than 400 pixels.
}

メディアクエリでは、任意の CSS の長さの単位を使用できます。 コンテンツが主に画像をベースにしている場合は、ピクセルを使用するのが理にかなっています。 コンテンツが主にテキストベースの場合は、emch など、テキストサイズに基づく相対単位を使用した方が理にかなっています。

@media (min-width: 25em) {
  // Styles for viewports wider than 25em.
}

メディアクエリを組み合わせて、複数の条件を適用することもできます。 メディアクエリを組み合わせるには、次のように and という単語を使用します。

@media (min-width: 50em) and (max-width: 60em) {
  // Styles for viewports wider than 50em and narrower than 60em.
}

コンテンツに基づいてブレークポイントを選択する

メディア機能の条件が true になるポイントをブレークポイントといいます。 ブレークポイントは、一般的なデバイスのサイズではなく、コンテンツに基づいて選択することをおすすめします。デバイスのサイズはテクノロジーのリリース サイクルのたびに変更される可能性があるためです。

この例の 50em は、テキスト行が異常に長くなってしまう点です。 そのため、インターフェースを読みやすくするためにブレークポイントが作成されます。column-count プロパティを使用すると、テキストはその時点から 2 つの列に分割されます。

@media (min-width: 50em) {
  article {
    column-count: 2;
  }
}

組み合わせ

ビューポートの幅だけではなく、高さに基づいてメディアクエリを使用できます。 これは、「スクロールせずに見える範囲」のインターフェース コンテンツを最適化するのに便利です。上の例で、読者が幅広で短いブラウザ ウィンドウを使用している場合、読者は 1 列下へスクロールしてから 2 列の先頭までスクロールする必要があります。ビューポートの幅と高さが十分にある場合にのみ列を適用する方が安全です。

すべての条件が true の場合にのみスタイルが適用されるように、メディアクエリを組み合わせることができます。 この例で列のスタイルを適用するには、ビューポートの幅が 50em 以上、高さが 60em 以上である必要があります。 これらのブレークポイントはコンテンツの量に基づいて選択されています。

@media (min-width: 50em) and (min-height: 60em) {
  article {
    column-count: 2;
  }
}

以下の例は、メディアクエリを使用してユーザーのデバイスのフォーム ファクタにデザインを適応させる方法を示していますが、これは可能性のほんの一部にすぎません。メディアクエリでは、幅と高さだけでなく、ユーザー補助機能やテーマカラーに関するユーザー設定にアクセスできます。メディアクエリを使用してレイアウトを調整することは、レスポンシブ デザインの出発点になります。レスポンシブ デザインは、これらの機能などを基に構築されています。

理解度チェック

レスポンシブ メディアクエリに関する知識をテストします。

メディアクエリは画面サイズ専用ですか?

true
もう一度考えてみましょう。印刷物、暗い場所と明るい色のシステム環境設定など、さまざまなメディアクエリ。
false
🎉

ウェブ コンテンツが消費または表示される場所は画面だけですか?

true
もう一度考えてみましょう。ウェブサイトは紙に印刷されたり、検索エンジン スパイダーでクロールされたり、スクリーン リーダー技術で読み上げたり、さらにはアシスタントを介してボットがユーザーに読み上げたりすることもあります。
false
🎉

デフォルトのメディアタイプは次のうちどれですか。

screen
もう一度考えてみましょう。screen はデフォルトのタイプではありません。
none
もう一度考えてみましょう。none は有効なメディアタイプではありません。
all
🎉
some
もう一度考えてみましょう。some は有効なメディアタイプではありません。
landscape
もう一度考えてみましょう。landscape は有効なメディアタイプではありません。

ブラウザがモバイルでデザインを拡大縮小できないようにするには、何を使用しますか。

width: 100%
もう一度考えてみましょう。
font-size: 200%
もう一度考えてみましょう。
<meta name="viewport" content="width=device-width, initial-scale=1">
🎉
メディアクエリ
もう一度考えてみましょう。
HTML5
もう一度考えてみましょう。

ブラウザ ウィンドウが 720px を上回る場合に適用されるメディアクエリ。

@media (width: 720px)
もう一度考えてみましょう。このメディアクエリは、ブラウザ ウィンドウが 720px と等しい場合にのみ行われます。
@media (max-width: 720px)
もう一度考えてみましょう。このメディアクエリは、ブラウザ ウィンドウが 720px を下回っている場合を対象としています。
@media (min-width: 720px)
🎉? これはブラウザ ウィンドウが 720px 以上になるため、読めます。
@media (clamp-width: 720px)
もう一度考えてみましょう。clamp-width は有効なメディアクエリ機能条件ではありません。