--- title: メディアクエリの使用 slug: Web/CSS/Media_Queries/Using_media_queries tags: - Advanced - CSS - Guide - ウェブ - ガイド - メディア - メディアクエリ - レスポンシブデザイン translation_of: Web/CSS/Media_Queries/Using_media_queries ---
メディアクエリは、一般的な端末の種類 (プリンタと画面など)や特定の特性 (画面の解像度やブラウザーの{{glossary("viewport", "ビューポート")}}の幅など) に応じてサイトやアプリを変更したいときに便利です。
メディアクエリは以下の用途で使用されます。
media=
属性を付けて特定のメディアを対象とする。メモ: このページの例では説明のために CSS の @media
を使用していますが、基本構文はすべての種類のメディアクエリで共通です。
メディアクエリは、任意のメディアタイプと任意の数のメディア特性の式で構成されます。論理演算子を使用して、複数のクエリを様々な形で組み合わせることができます。メディアクエリは大文字・小文字の区別がありません。
メディアクエリは、 (指定されていれば) メディアタイプが文書を表示している端末に一致しており、かつすべてのメディア特性式が真と計算されれば、真と計算されます。不明なメディアタイプに対するクエリは常に偽です。
メモ: {{HTMLElement("link")}} タグによるメディアクエリ付きのスタイルシートは、クエリが偽を返してもダウンロードされます。にもかかわらず、中身はクエリが真に変わらない限り、適用されません。
メディアタイプは端末の全般的なカテゴリを説明します。 not
又は only
の論理演算子を使用する場合を除いて、メディアタイプは任意であり、 all
タイプが暗黙に含まれています。
all
print
screen
speech
tty
, tv
, projection
, handheld
, braille
, embossed
, and aural
) を定義しましたが、これらはメディアクエリ 4 で非推奨となり、使用するべきではありません。 aural
タイプは似ている speech
で置き換えられました。メディア特性は、特定の{{glossary("user agent", "ユーザーエージェント")}}や、出力端末や、環境などの特性を記述します。メディア特性式は、存在又は値を検査するもので、完全に任意です。それぞれのメディア特性式は、括弧で囲む必要があります。
名前 | 概要 | 備考 |
---|---|---|
{{cssxref("@media/any-hover", "any-hover")}} | 入力メカニズムで、ユーザーが要素上でのホバーを使用することができるものあるか | Media Queries Level 4 で追加。 |
{{cssxref("@media/any-pointer", "any-pointer")}} | 入力メカニズムにポインティングデバイスがあるか、もしそうであればどれだけ正確なものであるか | Media Queries Level 4 で追加。 |
{{cssxref("@media/aspect-ratio", "aspect-ratio")}} | ビューポートの幅対高さのアスペクト比 | |
{{cssxref("@media/color", "color")}} | 出力端末の色コンポーネントあたりの色数、または端末がカラーでなければゼロ | |
{{cssxref("@media/color-gamut", "color-gamut")}} | ユーザーエージェント及び出力端末が対応しているおよその色の範囲 | Media Queries Level 4 で追加。 |
{{cssxref("@media/color-index", "color-index")}} | 出力端末の色参照表の項目数、又は端末がそのような表を使用していないのであればゼロ | |
{{cssxref("@media/device-aspect-ratio", "device-aspect-ratio")}} {{obsolete_inline}} | 出力端末の幅対高さのアスペクト比 | Media Queries Level 4 で非推奨。 |
{{cssxref("@media/device-height", "device-height")}} {{obsolete_inline}} | 出力端末のレンダリング面の高さ | Media Queries Level 4 で非推奨。 |
{{cssxref("@media/device-width", "device-width")}} {{obsolete_inline}} | 出力端末のレンダリング面の幅 | Media Queries Level 4 で非推奨。 |
{{cssxref("@media/display-mode", "display-mode")}} | ウェブアプリのマニフェストの display メンバーで指定されているアプリケーションの表示モード |
Web App Manifest 仕様書で定義 |
{{cssxref("@media/forced-colors", "forced-colors")}} | ユーザーエージェントがカラーパレットを制限しているかどうかを検出する | Media Queries Level 5 で追加。 |
{{cssxref("@media/grid", "grid")}} | 出力端末はグリッドとビットマップ画面のどちらを使用するか | |
{{cssxref("@media/height", "height")}} | ビューポートの高さ | |
{{cssxref("@media/hover", "hover")}} | 主要な入力メカニズムで、ユーザーが要素上でのホバーを使用することができるか | Media Queries Level 4 で追加。 |
{{cssxref("@media/inverted-colors", "inverted-colors")}} | ユーザーエージェントまたはその下の OS が色を反転しているか | Media Queries Level 5 で追加。 |
{{cssxref("@media/light-level", "light-level")}} | 環境の明るさレベル | Media Queries Level 5 で追加。 |
{{cssxref("@media/monochrome", "monochrome")}} | 出力端末のモノクロフレームバッファーにおけるピクセルあたりのビット数、又は端末がモノクロでなければゼロ | |
{{cssxref("@media/orientation", "orientation")}} | ビューポートの向き | |
{{cssxref("@media/overflow-block", "overflow-block")}} | ビューポートをブロック軸方向にあふれたコンテンツを出力端末がどのように扱うか | Media Queries Level 4 で追加。 |
{{cssxref("@media/overflow-inline", "overflow-inline")}} | ビューポートをインライン軸方向にあふれたコンテンツがスクロールできるか | Media Queries Level 4 で追加。 |
{{cssxref("@media/pointer", "pointer")}} | 主要な入力メカニズムがポインティングデバイスであるか、もしそうであればどれだけ正確なものであるか | Media Queries Level 4 で追加。 |
{{cssxref("@media/prefers-color-scheme", "prefers-color-scheme")}} | ユーザーが明るいまたは暗い色遣いを望んでいるかどうかを検出する | Media Queries Level 5 で追加。 |
{{cssxref("@media/prefers-contrast", "prefers-contrast")}} | ユーザーがシステムに隣り合う色のコントラスト量を増加または減少させるよう要求したかどうかを検出する | Media Queries Level 5 で追加。 |
{{cssxref("@media/prefers-reduced-motion", "prefers-reduced-motion")}} | ユーザーがページであまり動きを望まないかどうか | Media Queries Level 5 で追加。 |
{{cssxref("@media/prefers-reduced-transparency", "prefers-reduced-transparency")}} | ユーザーが透明度を下げるよう望んでいるかどうか | Media Queries Level 5 で追加。 |
{{cssxref("@media/resolution", "resolution")}} | 出力端末のピクセル密度 | |
{{cssxref("@media/scan", "scan")}} | 出力端末のスキャン処理方式 | |
{{cssxref("@media/scripting", "scripting")}} | スクリプト (例えば JavaScript) が利用できるかを検出する | Media Queries Level 5 で追加。 |
{{cssxref("@media/update-frequency", "update")}} | どれだけの頻度で出力端末がコンテンツの表示を変更できるか | Media Queries Level 4 で追加。 |
{{cssxref("@media/width", "width")}} | ビューポートの幅 |
論理演算子 not
, and
, only
を使用して、複雑なメディアクエリを構成することができます。複数のメディアクエリをカンマで区切って、単一の規則にまとめることもできます。
and
and
演算子は、複数のメディア特性を一つのメディアクエリにまとめるために使用し、クエリが真になるためには結合されたそれぞれの特性が真を返す必要があります。メディア特性とメディアタイプを組み合わせるためにも使用します。
not
not
演算子は、メディアクエリを否定するために使用し、もしクエリが偽を返せば真を返します。カンマ区切りのクエリのリストの中にある場合、適用された特定のクエリのみを否定します。 not
演算子を使用する場合は、メディアタイプも指定しなければなりません。
メモ: Level 3 では、 not
キーワードは個別のメディア特性式を否定するために使用することはできず、メディアクエリ全体に対してしか使用できません。
only
only
演算子はクエリ全体が一致した場合にスタイルを適用し、古いブラウザーで選択されたスタイルが適用されるのを防ぐために使用します。 only
を使用しない場合、古いブラウザーは screen and (max-width: 500px)
というクエリを単なる screen
として解釈してクエリの注釈を無視し、あらゆる画面にスタイルを適用します。 only
演算子を使用する場合は、メディアタイプも指定しなければなりません。
,
(カンマ)カンマは、複数のメディアクエリを一つのメディアクエリに結合するために使用します。カンマで区切ったリストの中にあるそれぞれのクエリは、他とは別なものとして扱われます。よって、リストの中の何れかのクエリが真になれば、メディアステートメント全体が真を返します。言い換えれば、リストは論理 or
演算子のように動作します。
メディアタイプは、その端末の一般的なカテゴリを記述します。ウェブサイトは一般的に画面を想定してデザインされていますが、プリンターや音声ベースのスクリーンリーダーのような、特殊な端末を対象としたスタイルを作成したい場合もあるでしょう。例えば、この CSS はプリンターを対象としています。
@media print { ... }
複数の端末を対象にすることもできます。例えば、この @media
ルールは2つのメディアクエリーを使用して、画面とプリンターの両方の端末を対象としています。
@media screen, print { ... }
すべてのメディアタイプの一覧は、メディアタイプを参照してください。とても広い用語で端末を記述するため、数はわずかしかありません。もっと具体的な属性で対象にするには、代わりにメディア特性を使用してください。
メディア特性は、{{glossary("user agent", "ユーザーエージェント")}}、出力端末、環境などの特定の特徴を記述します。例えば、画面の広いモニター、マウスを使用したコンピューター、暗い状況で使用される端末などに対して特定のスタイルを適用することができます。この例はユーザーの主な入力手段 (マウスなど) が要素の上で停止できる時にスタイルを適用します。
@media (hover: hover) { ... }
多くのメディア特性は範囲特性であり、 "min-" 又は "max-" の接頭辞をつけて「最小条件」又は「最大条件」の制約を表現します。例えば、この CSS はブラウザーの{{glossary("viewport", "ビューポート")}}の幅が 12,450px 以下である場合のみ、スタイルを適用します。
@media (max-width: 12450px) { ... }
値を指定せずにメディア特性クエリを作成した場合、特性の値がゼロ (または Level 4 では none
) ではない場合に中のスタイルが使用されます。例えば、この CSS はカラー画面を持つ任意の端末に適用されます。
@media (color) { ... }
ブラウザーを実行している端末である特性が適用されない場合、メディア特性に向けた式は常に偽です。例えば、以下のクエリの中のスタイルは、音声のみの端末には画面のアスペクト比がないので、決して使われません。
@media speech and (aspect-ratio: 11/5) { ... }
その他のメディア特性の例については、それぞれの特性のリファレンスページを参照してください。
時々、複数の条件に依存するメディアクエリを作成したくなる場合があるかもしれません。これは、 not
, and
, only
の論理演算子の出番です。その上、複数のメディアクエリをカンマ区切りのリストで結合することができます。これによって、同じスタイルを異なる場面に適用することができます。
以前の例で、すでに and
演算子がメディアタイプとメディア特性をグループ化するために使用されているのを見ました。 and
演算子は、複数のメディア特性を1つのメディアクエリに結合することもできます。一方で not
演算子は、メディアクエリを反転し、基本的に普通の意味とは逆になります。 only
演算子は古いブラウザーでスタイルが適用されるのを防止します。
メモ: 多くの場合、 all
メディアタイプが他のタイプが指定されない場合に既定で使用されます。しかし、 not
又は only
演算子を使用する場合は、メディアタイプを明示的に指定する必要があります。
and
キーワードはメディア特性をメディアタイプ、又は他のメディア特性に結合します。この例は2つのメディア特性を結合して、スタイルを横長で幅が 30em 以上ある端末に制限します。
@media (min-width: 30em) and (orientation: landscape) { ... }
スタイルを画面に限定する場合は、メディア特性に screen
メディアタイプを結合します。
@media screen and (min-width: 30em) and (orientation: landscape) { ... }
カンマ区切りのリストを使うと、ユーザーの端末が様々なメディアタイプ、特性、状態のいずれか一つに一致する場合にスタイルを適用させることができます。例えば、以下の規則はユーザーの端末の高さが 680px 以上又は画面が縦長モードであるときにスタイルが適用されます。
@media (min-height: 680px), screen and (orientation: portrait) { ... }
上記の例について言えば、もしユーザーがページの縦が 800px のプリンターを持っていた場合、最初のクエリが適用されるので media ステートメントは真を返します。同様に、ユーザーが縦長モードでビューポートの高さが 480px のスマートフォンを使っていた場合、2番目のクエリが適用され、 media ステートメントはやはり真を返します。
not
キーワードはメディアクエリ全体の意味を反転します。これは、適用される特定のメディアクエリを単純に反転します。 (従って、メディアクエリのカンマ区切りのリストの中では、それぞれのメディアクエリは適用されません。) not
キーワードは個別の特性クエリに対して使用することができず、クエリ全体のみを反転します。 not
は以下のクエリの最後に評価されます。
@media not all and (monochrome) { ... }
... よって、上記のクエリは次のように評価されます。
@media not (all and (monochrome)) { ... }
... このようにはなりません。
@media (not all) and (monochrome) { ... }
他の例を挙げます。以下のメディアクエリは、
@media not screen and (color), print and (color) { ... }
... 次のように評価されます。
@media (not (screen and (color))), print and (color) { ... }
only
キーワードは、メディア特性がついたメディアクエリに対応していない古いブラウザーで、そのスタイルが適用されるのを防ぎます。最近のブラウザーでは効果がありません。
@media only screen and (color) { ... }
Media Queries Level 4 仕様書では、例えば幅や高さについて、よりすっきりとした "range" 型を持つ特性を使ってメディアクエリを作れるよう構文が拡張されました。 Level 4 はこのようなクエリを書くために範囲コンテキストを追加しています。例えば、幅について max-
の特性を使用する場合は、以下のように書くことができます。
注: Media Queries Level 4 仕様は、最新のブラウザーはそれなりに対応していますが、一部のメディア機能には十分に対応していません。詳細は @media
ブラウザー互換性一覧表を参照してください。
@media (max-width: 30em) { ... }
Media Queries Level 4 では、これを次のように書くことができます。
@media (width <= 30em) { ... }
min-
および max-
を使用すると、次のようにして幅が2つの値の間にあるかどうかを検査することができます。
@media (min-width: 30em) and (max-width: 50em) { ... }
Level 4 の構文に変換すると、次のようになります。
@media (30em <= width <= 50em ) { ... }
また、 Media Queries Level 4 では and, not, or を伴う完全な論理代数を使ったメディアクエリの組み合わせの方法も追加されました。
not
による特性の否定メディア特性を not()
を使用して囲むことで、クエリでその特性を否定します。例えば、 not(hover)
は端末でホバーができない場合に一致します。
@media (not(hover)) { ... }
or
による特性の結合or
を使用して複数の特性の中の一つと一致するか検査することができ、特性のうちの何れかが true であれば true
になります。例えば、次のクエリは端末がモノクロ画面である、またはホバーができるかどうかを検査します。
@media (not (color)) or (hover) { ... }