メディアクエリ
メディアクエリを使うと、一つのHTML文書を、スマートフォンやタブレット、パソコンなどのデバイス特性(種類、ディスプレイの解像度、ディスプレイの向きなど)に応じて適切な方法で表現することができます。
メディアクエリはCSS3で導入されたもので、CSS2.1における@media規則を拡張したものです。そこで、まずCSS2.1における@media規則について説明し、その後でメディアクエリについて説明することにします。
@media規則
@media規則を使うと、パソコンの画面や印刷などの出力対象ごとにスタイルを指定することができます。例えば、
@media print { | |
body { font-size: 10pt; color: black; } | |
h1,h2 { font-size: 12pt; } | |
} |
は、プリンタに出力する場合のスタイルを指定します。ここで、「print」がプリンタという出力対象をあらわしています。このような出力対象をあらわすキーワードをメディアタイプ(media type)といいます。メディアタイプには、つぎのものがあります。
メディアタイプ | 対象 |
---|---|
all | 全てのメディア |
braille | 点字ディスプレイ |
embossed | 点字プリンタ |
handheld | 携帯端末などの小さな画面の装置 |
プリンタや印刷プレビュー | |
projection | プロジェクター |
screen | コンピュータディスプレイ |
speech | 合成音声を生成するためのソフトウェア |
tty | テレタイプなどの文字幅が固定された出力装置 |
tv | テレビなどの低解像度の出力装置 |
CSS 2.1 の仕様では、それぞれのプロパティがどのメディアを対象とするかを、個々のメディアタイプではなくて、メディアタイプをグループ化したメディアグループ(media group)に対して規定しています。
複数のメディアタイプに同じスタイルを指定したい場合は、メディアタイプをカンマ(,)で区切って並べて記述します。たとえば、
@media print,handheld { body { color: black; } } |
とすれば、プリンタと携帯端末の両方に対してスタイルを適用します。
HTML5 で、link要素でCSSのスタイルシートを読み込む場合や、style要素でCSSを記述する場合は、media 属性によってスタイルの対象となるメディアタイプを指定することもできます。たとえば、
<link rel="stylesheet" media="print" href="print.css"> |
とすれば、print.cssに記述されているスタイルは、プリンタに出力する場合に適用されます。
@import規則で使用して、特定の条件を満たすデバイスに対して外部スタイルシートを読み込むこともできます。たとえば、
@import url(style.css) screen; |
とすれば、style.cssに記述されているスタイルは、コンピュータでディスプレイに出力される場合に適用されます。
メディアクエリ
CSS3 では、メディアタイプの考え方を拡張したメディアクエリ(media queries)が導入されました。メディアクエリでは、メディアタイプに付け加えて、出力デバイスの詳細な情報を表すメディア特性を用いることができ、これによりデバイスの種類や大きさ、向きなどに応じて適切なスタイルを設定することができます。
メディアクエリの書式
まず、メディアクエリの使用例を示します。
@media screen and (max-width: 640px) { body { font-size: 14px; } } |
ここで、screenの部分はメディアタイプで、「出力対象がコンピュータディスプレイである」ということをあらわしています。(max-width: 640px)は、「デバイスの表示領域の幅が640px以下である」という論理式です。max-widthの部分をメディア特性(media features)といいます。今の場合、メディアクエリは、この2つをand(論理積、かつ)で結んだもので、次のような意味の論理式となっています:
「出力対象がコンピュータディスプレイで、かつデバイスの表示領域の幅が640px 以下である」
この@media規則は、{ }の中のスタイルを、メディアクエリの論理値が真(true)の場合は適用し、偽(false)の場合は適用しません。
一般に、メディアクエリでは、メディアタイプにandで複数の論理式を結合することができます。つまり、メディアクエリの一般的な書式は次のようになります。
メディアタイプ and ( 論理式1) and (論理式2) …
メディアクエリの値は、メディアタイプがデバイスの種類にマッチし、かつ全ての論理式の値がtrueのときtrue となり、そうでないときfalse となります。ここで、論理式の前後の丸括弧は必須です。丸括弧をつけないとエラーとなります。また、メディアクエリの記述においては、大文字と小文字を区別しません。
更に、複数のメディアクエリをカンマ(,)で区切って並べて記述することができます。この場合、その中の1つ以上の論理値がtrue であれば、関連づけられたスタイルシートが適用されます。つまり、カンマはorの意味となります。たとえば、
@media screen and (max-width: 640px), projection (max-width: 640px) { | |
body { font-size: 14px; } | |
} |
は、出力対象がコンピュータディスプレイでかつ表示領域の幅が640px 以下であるか、もしくは出力対象がプロジェクターでかつ表示領域の幅が640px 以下である場合に、{ } の中のスタイルを適用します。
メディア特性
メディアクエリでは、メディアタイプに加えてメディア特性によって定義される論理式をつけ加えて、出力対象のデバイスに関するより細やかな条件を課すことができます。
メディアクエリの論理式で利用できるメディア特性として次のものがあります。
メディア特性 | 説明 | 値 | min-/max- |
---|---|---|---|
width | 表示域の幅 | 長さ | ○ |
height | 表示域の高さ | 長さ | ○ |
device-width | 出力装置の画面全体の幅 | 長さ | ○ |
device-height | 出力装置の画面全体の高さ | 長さ | ○ |
orientation | ポートレイト/ランドスケープ | portrait | landscape | × |
aspect-ratio | アスペクト比 | 分数(例:16/9) | ○ |
device-aspect-ratio | 出力装置の画面全体のアスペクト比 | 分数(例:16/9) | ○ |
color | カラーコンポーネントのビット数 | 整数 | ○ |
color-index | カラールックアップテーブルの色数 | 整数 | ○ |
monochrome | モノクロのビット数 | 整数 | ○ |
resolution | デバイスの解像度 | 実数+dpi | 実数+dpcm | ○ |
scan | テレビの走査方式 | progressive | interlace | × |
grid | グリッド方式の出力装置 | 整数 | × |
多くのメディア特性には、その前に"min-"もしくは"max-"というプレフィックスをつけることができます(上の表で"min-/max-"の欄が○印であるもの)。"min-"がついた場合は「以上」、"max-" がついた場合は「以下」という意味になります。"min-"もしくは"max-"がついた場合は、メディア特性の後にコロン(:)で区切って値を指定する必要があります。値を指定しないでメディア特性を指定した場合、論理値の値は、特性値の値が0でないデバイスではtrue、0であるデバイスではfalseとなります。たとえば、
@media screen and (color) { … } |
とすれば、(color)はRGBの各チャンネルのビット数が1以上であるという意味になり、論理値は全てのカラー表示可能な出力装置に対してtrue、モノクロ表示の出力装置に対してfalseとなります。つまり、全てのカラー表示可能なデバイスに対してスタイルを適用するという意味になります。これは、次の@media規則と同じ意味となります。
特性を指定した場合、論理値の値は、特性値の値が0でないデバイスではtrue、0であるデバイスではfalseとなります。たとえば、@media screen and (min-color: 1) { … } |
ここで、RGBの各チャンネルのビット数が3以上であるデバイスにスタイルを適用するには、次のようにします。
@media screen and (min-color: 3) { … } |
onlyキーワード
onlyキーワードは、メディアクエリの先頭に用いることができ、メディアクエリに対応していない古いWebブラウザに当該スタイルを適用させないために用います。たとえば、
@media only screen and (color) { … } |
とすれば、メディアクエリに対応していないWeb ブラウザに対しては{ }の中のスタイルを適用せず、対応しているWebブラウザに対しては、出力対象がカラー表示可能なコンピュータディスプレイにの場合に{ }の中のスタイルを適用します。
notキーワード
not キーワードは、メディアクエリの先頭に用いることができ、notの後のメディアクエリの論理否定(NOT)をあらわします。たとえば、
@media not screen and (color) { … } |
とすれば、出力対象がカラー表示可能なコンピュータディスプレイでない場合に{ }の中のスタイルを適用します。
メディアクエリを使用できる場所
メディアクエリは、CSS2.1でのメディア指定と同じように次の場所で使用することができます。
@media規則
CSSの@media規則で使用して、特定の条件を満たすデバイスに対して当該スタイルを適用させることができます。
@media screen and (max-width: 640px) { … } |
@import規則
CSS の@import規則で使用して、特定の条件を満たすデバイスに対して外部スタイルシートを読み込むことができます。
@import url(style.css) screen and (max-width: 640px); |
link要素のmedia属性
HTML のlink 要素に対するmedia属性で使用して、特定の条件を満たすデバイスに対して外部スタイルシートを読み込むことができます。
<link rel="stylesheet" media="screen and (max-width: 640px)" href="style.css"> |
複数のデバイスでスタイルを切り替えるには
スマートフォンやタブレット端末、パソコンなど、画面サイズの異なるデバイスで異なるスタイルシートを適用する場合、スタイルシートを切り替えるブレイクポイント(break point)を設定して、それぞれの条件に合ったスタイルを記述します。これにより、一つのHTMLファイルを各端末装置に最適化して表示することができます。このようなWebデザインの手法を、レスポンシブWebデザイン(responsive web design)といいます。
例えば、iphoneとipad、パソコンでスタイルを切り替えて表示できるWebページを作る場合を考えてみます。まず、iphone5、iphone6、iphone6 Plus、ipad、ipad Retinaのデバイス解像度、ピクセル数は次の表のようになります。
機種 | デバイス解像度 | デバイスピクセル比 | ピクセル数 |
---|---|---|---|
iphone5 | 640px × 1136px | 2 | 320px × 568px |
iphone6 | 750px × 1334px | 2 | 375px × 667px |
iphone6 Plus | 1242px × 2208px | 3 | 414px × 736px |
ipad | 768px × 1024px | 1 | 768px × 1024px |
ipad Retina | 1536px × 2048px | 2 | 768px × 1024px |
ここで、デバイスピクセル比(device pixel ratio)とは、デバイスのピクセルとCSSでのピクセルの比率のことです。たとえば、iphone5では、デバイス解像度は640px × 1136pxですが、デバイスピクセル比が2であるため、CSSでのピクセル数は320px ×568pxとなります。また、iphoneでは縦向きで表示していて横向きにすると、倍率が拡大されて縦向きと同じピクセル数で表示されます。そこで、iphoneでの縦向きと横向きの幅は同じとして、次のように表示領域の幅のブレークポイントを設定します。
対象とするデバイス | ブレークポイント |
---|---|
iphone | 320px |
ipad縦向き | 640px |
パソコン、ipad横向き | 960px |
@media規則を使って、これらのブレークポイントでスタイルを切り替えるには、次のようにします。
/* 共通設定(0以上) */ | |
... | |
@media screen and (min-width: 320px) and (max-width: 639px) { /* iphone用 */ | |
... | |
} | |
@media screen and (min-width: 640px) and (max-width: 959px) { /* ipad縦向き用 */ | |
... | |
} | |
@media screen and (min-width: 960px) { /* PC、ipad横向き用 */ | |
... | |
} |
ここで、メディアクエリの値がfalseである場合は、Webブラウザは{ }の中の規則を読み込みません。このため、上のように記述した場合、iphoneでは最初の@media規則のみが、ipad縦向きでは2番目の@media規則のみが、PCとipad横向きでは3番目の@media規則のみが読み込まれます。
link要素で外部スタイルシートを切り替える場合は、次のようにします。
<link rel="stylesheet" media="screen" href="default.css"> | |
<link rel="stylesheet" media="screen and (min-width: 320px) and (max-width: 639px)" href="iphone.css"> | |
<link rel="stylesheet" media="screen and (min-width: 640px) and (max-width: 959px)" href="ipad.css"> | |
<link rel="stylesheet" media="screen and (min-width: 960px)" href="pc.css"> |
ここで、deafult.cssはデバイスに依らない共通設定を行う外部スタイルシート、iphone.css、ipad.css、pc.cssは各々iphone用、ipad用、パソコン用の設定を行うための外部スタイルシートです。