レスポンシブ デザインは、メディアクエリなしでは実現できません。メディアクエリが登場するまでは、ユーザーがウェブサイトにアクセスする際に使用しているデバイスの種類を把握する方法はありませんでした。デザイナーは仮定を立てる必要がありました。これらの想定は、固定幅のデザインまたはリキッド レイアウトにエンコードされていました。
メディアクエリの導入により、状況は一変しました。デザイナーは初めて、ユーザーのニーズに寄り添うことができました。デザイナーは、ユーザーのデバイスに合わせてレイアウトを調整できます。
メディアクエリは、省略可能なメディアタイプと必須のメディア機能で構成されます。メディアの種類は、この数年で大きな変化はありません。指定できる値は次の 4 つのみです。
@media all
@media screen
@media print
@media speech
一方、メディア機能は大幅に拡大しています。デザイナーは、画面サイズだけでなく、デザインをより多くのものに適合させることで、ユーザーのニーズをより深く満たすことができるようになりました。
ビューポートの寸法
ウェブ上で最もよく使用されているメディアクエリは、ビューポートの幅を扱うものです。ただし、ここでも選択肢が表示されます。max-width メディア機能を使用して特定の幅以下のスタイルを適用することも、min-width メディア機能を使用して特定の幅以上のスタイルを適用することもできます。
main {
display: grid;
grid-template-columns: 2fr 1fr;
}
@media (max-width: 45em) {
main {
display: block;
}
}
@media (min-width: 45em) {
main {
display: grid;
grid-template-columns: 2fr 1fr;
}
}
個人的には min-width を使用するのが好きです。レイアウト スタイルは加法的に適用します。前のルールを元に戻すのではなく、各ブレークポイントで新しいレイアウト ルールを導入します。
この加算的なアプローチは高さにも適用できます。min-height を使用すると、ビューポートの高さが大きくなるにつれて、より多くのルールを導入できます。たとえば、十分な垂直方向のスペースがある場合に、ブラウザ ウィンドウの上部に固定したいヘッダー要素があるとします。
@media (min-height: 30em) {
header {
position: fixed;
}
}
ただし、必要に応じて max-height メディア機能を使用できます。ここでは、ヘッダーはデフォルトで固定されますが、垂直方向のスペースが十分にない場合は固定が解除されます。
header {
position: fixed;
}
@media (max-height: 30em) {
header {
position: static;
}
}
min- と max- の接頭辞の選択は、width と height にのみ適用されるわけではありません。aspect-ratio メディア機能でも同じ選択肢が提供されます。幅と高さの比率を正確に適用したい場合は、プレフィックスなしのバージョンも用意されています。
@media (min-aspect-ratio: 16/9) {
// The ratio of width to height is at least 16 by 9.
}
@media (max-aspect-ratio: 16/9) {
// The ratio of width to height is less than 16 by 9.
}
@media (aspect-ratio: 16/9) {
// The ratio of width to height is exactly 16 by 9.
}
アスペクト比ごとに異なるスタイルを提供すると、すぐに手に負えなくなる可能性があります。このようなきめ細かい制御が必要ない場合は、orientation メディア機能の方がニーズに適している可能性があります。有効な値は portrait または landscape です。
@media (orientation: portrait) {
// The width is less than the height.
}
@media (orientation: landscape) {
// The width is greater than the height.
}
「縦向き」と「横向き」という用語はモバイル デバイスの向きを指す場合によく使用されますが、orientation メディア機能はデバイス固有のものではありません。一般的なノートパソコンの全画面ブラウザ ウィンドウの orientation 値は landscape になります。
ディスプレイ
ディスプレイによってピクセル密度が異なり、dpi(1 インチあたりのドット数)で測定されます。resolution メディア機能を使用すると、さまざまなピクセル密度に合わせてスタイルを調整できます。aspect-ratio と同様に、resolution には最小、最大、完全一致の 3 種類があります。
@media (min-resolution: 300dpi) {
// The display has a pixel density of at least 300 dots per inch.
}
@media (max-resolution: 300dpi) {
// The display has a pixel density less than 300 dots per inch.
}
@media (resolution: 300dpi) {
// The display has a pixel density of exactly 300 dots per inch.
}
resolution メディアクエリを使用する必要がない場合もあります。通常、ピクセル密度が問題になるのは画像のみです。レスポンシブ画像は、HTML でピクセル密度を直接処理する方法です。
一方、CSS ではアニメーションとトランジションを定義します。update メディア機能を使用すると、さまざまなリフレッシュ レートに対応するようにアニメーションとトランジションを調整できます。このメディア機能は、none、slow、fast の 3 つの値のいずれかをレポートします。
update の値が none の場合、リフレッシュ レートはありません。たとえば、印刷されたページは更新できません。
update の値が slow の場合、ディスプレイをすばやく更新できません。電子インク ディスプレイは、リフレッシュ レートが遅い画面の一例です。
update の値が fast の場合、アニメーションとトランジションを処理するのに十分な速さでディスプレイが更新されることを意味します。
@media (update: fast) {
a {
transition-duration: 0.4s;
transition-property: transform;
}
a:hover {
transform: scale(150%);
}
}
ディスプレイのすべての側面がハードウェア機能に関連しているわけではありません。テーマ設定に関するモジュールでは、ウェブアプリ マニフェスト ファイルでプロパティを定義する方法について説明しました。これらのプロパティの 1 つは display と呼ばれ、fullscreen、standalone、minimum-ui、browser のいずれかの値を指定できます。対応する display-mode メディア機能を使用すると、これらのさまざまなオプションに合わせてスタイルを調整できます。
たとえば、ウェブアプリ マニフェストで display の値として standalone を指定したとします。ユーザーがサイトをホーム画面に追加すると、ブラウザ インターフェースなしでサイトが起動します。そうしたユーザーには戻るボタンを表示することをおすすめします。
button.back {
display: none;
}
@media (display-mode: standalone) {
button.back {
display: inline;
}
}
色
デバイスのカラー機能をクエリするためのメディア機能は多数あります。グレースケールのみを出力するディスプレイのスタイルを調整する場合は、値なしで monochrome メディア機能を使用できます。
@media (monochrome) {
body {
color: black;
background-color: white;
}
}
対応する color メディア機能があります。
@media (color) {
body {
color: maroon;
background-color: linen;
}
}
カラー画面の場合は、メディア機能 color-gamut、color-index、dynamic-range を使用してクエリを記述できます。これらはすべて、画面の色機能に関する具体的な詳細をレポートします。
この例では、ディスプレイの最大輝度、色深度、コントラスト比の組み合わせをレポートする dynamic-range メディア機能に応じて、色の値が更新されます。有効な値は standard または high です。dynamic-range 値が high の高精細度スクリーンには、新しい CSS color() 関数を使用して別の色空間が与えられます。
.neon-red {
color: hsl(355 100% 95%);
}
@media (dynamic-range: high) {
.neon-red {
color: color(display-p3 1 0 0);
}
}
インタラクション
メディア機能では、サイトの操作に使用される入力メカニズムの種類(hover、any-hover、pointer、any-pointer)を報告することもできます。詳しくは、インタラクションに関するモジュールをご覧ください。
ユーザー設定のクエリ
CSS を使用すると、ユーザーと協力して、ユーザーがコンテンツにアクセスしやすいようにすることができます。このレッスンでは、ユーザーのデバイスのサイズと機能に基づいてさまざまな CSS を適用する方法を学びました。ユーザーの設定に基づいて異なる CSS を適用することもできます。
ダークモードとライトモード
ライトモードとダークモードのどちらを使用するかというユーザーの設定に対応できます。多くのユーザーがこれをシステム設定として設定しています。
UI 要素の配色を設定する
ブラウザでは、スクロールバーやフォーム要素などのデフォルトの色が用意されています。color-scheme: light を使用するユーザーにはライトモードを、color-scheme: dark を使用するユーザーにはダークモードを使用するかどうかを指定できます。color-scheme: light dark を使用して、ページが両方をサポートしていることを指定することもできます。:root 要素または html 要素で設定してページ全体のスキームを設定することも、特定の要素でオーバーライドすることもできます。
また、color-scheme の meta タグを設定して、スタイルが読み込まれる前にページのスキームを設定することもできます。ページ内の要素に color-scheme: normal を設定すると、このメタタグで設定した color-scheme 値が使用されます。
<meta name="color-scheme" content="dark light">
prefers-color-scheme メディア機能
また、prefers-color-scheme のメディアクエリを使用して、ユーザーが選択したカラーテーマに応じてカスタム スタイルを定義することもできます。
light-dark
ユーザーにライトモードとダークモードの両方を提供する場合、メディアクエリ内で各色を設定するのは冗長になる可能性があります。light-dark() を使用すると、両方を 1 つのプロパティで指定できます。
これを有効にするには、要素またはその祖先のいずれかに color-scheme: light dark を設定する必要があります。まず、ライトモードで使用する色を設定し、次にダークモードで使用する色を設定します。
h1{
color: light-dark( var(--text-light), var(--text-dark));
}
システム設定でライトモードがリクエストされている場合、見出しは黒になります。ダークモードが選択されている場合は、見出しは白になります。
コントラストの設定
ユーザーは、コントラストが高いコンテンツや低いコンテンツを読みやすいと感じることがあります。そのため、ユーザーがシステムを設定して、テーマを自分にとって最適なものにオーバーライドすることがあります。サイトがユーザーの好みに合わせて適切に機能するようにすることが、サイト運営者の役割です。
カスケード モジュールで説明したように、!important ローカル ユーザー スタイルは、ウェブページが提供する作成者スタイルをオーバーライドできます。これにより、ユーザーは自分に合ったスタイルを使用できます。
色の強制
Windows には、ユーザーが選択してウェブサイトのテーマをオーバーライドできる「コントラスト テーマ」が用意されています。多くの場合、高コントラストのテーマで、ライトモードまたはダークモードがあります。CSS では、これは強制カラーと呼ばれます。ほとんどの場合、このモードでもサイトは期待どおりに動作します。ボタン、リンク、入力などのコンテンツには、テーマの色が使用されます。
要素を標準以外の方法で使用している場合など、スタイルを調整する必要があることがあります。@media (forced-colors: active) メディアクエリを使用すると、ユーザーが強制カラーを有効にしたときにスタイルを適用できます。
サイトのスタイルがコンテンツ自体を理解するうえで不可欠な場合もあります。たとえば、カラーキー付きのグラフやカラー選択ツールなどです。要素に forced-color-adjust: none; を設定すると、強制配色モードを無効にできます。特定の要素でのみオプトアウトし、強制配色モードでコンテンツにアクセスできることを確認してください。
高コントラスト
コントラストの向上をリクエストするようにシステムを設定することもできます。prefers-contrast: more メディアクエリを使用して、レスポンスでスタイルを調整できます。
モーションを抑制
prefers-reduced-motion メディアクエリを使用すると、モーションの削減を希望するユーザーの好みに対応できます。これは、てんかん、前庭運動障害、片頭痛の感受性を持つ人々のトリガーとなる可能性のある大きな動きを避ける代替アニメーションを提供するために使用されることがよくあります。詳しくは、アニメーションを使用する際の考慮事項をご覧ください。
スクリプト
ユーザーが JavaScript を無効にしてサイトにアクセスする可能性もあります。その場合でも、scripting メディアクエリを使用してコンテンツにアクセスできるように CSS を調整できます。
@media (scripting: none) {
/* Styles when JavaScript is disabled*/
}
@media (scripting: initial-only) {
/* Styles when JavaScript is available only for an initial render, for example with a printed page or server side rendering */
}
@media (scripting: enabled) {
/* Styles when Javascript is enabled */
}
理解度を確認する
メディア機能に関する知識をテストする
メディア クエリで @media (width: 1024px) のような特定の幅のデバイスをチェックできますか?
1023px より大きい幅と 1025px より小さい幅を同時に確認する必要があります。min-width と max-width が利用可能です。メディアクエリで、@media (aspect-ratio: 4/3) のように特定の aspect-ratio のデバイスをチェックできますか?
aspect-ratio に存在します。有効なカラー メディアクエリはどれですか?
@media (color)@media (monochrome)@media (color-gamut: srgb)@media (min-color-index: 15000)@media (dynamic-range: high)次のうち、有効なユーザー設定メディアクエリはどれですか?
@media (prefers-color-scheme: dark)@media (prefers-colors: high-definition)@media (prefers-reduced-motion: reduce)@media (prefers-contrast: more)@media (prefers-site-speed: fast)color-scheme の有効な値は何ですか?
lightdarknightcontrast要素を強制カラーから除外するにはどうすればよいですか?
forced-colors: activeforced-colors: inactiveforced-colors-adjust: noneforced-colors-adjust: normal