レスポンシブデザインとは、PC、タブレット、スマートフォンなどの様々なサイズの画面表示に対して、フレキシブルにレイアウトを最適化して表示する手法のことをいいます。
PCとモバイル機器とで、ブラウザの基本仕様が異なっていた時代は、PC用のWebサイトと、モバイル用のWebサイトは、別々にコーディングを行なっていました(ケータイ専用のHTMLも存在していました)。その当時は、PC用のHTMLから情報を削ってケータイ用を作るといった2度手間が必要で、どちらか一方の更新が遅れて混乱するといった問題もありましたが、現在では、HTML(すなわち掲載する情報内容)は1つ(One Source)で、そのビジュアルのみを CSS の切り替えによって各デバイスに最適化するということが可能になりました。
レスポンシブデザインの技術を使うと、ブラウザのウインドウ幅によって表示スタイルが変わります。現在では、この仕様が標準的なものなので、Webサイトの開発においては、ウインドウ幅を広げたり、縮めたりしながら、最適なスタイルが実現されているかを確認するようにしてください。
多くのモバイル機器のブラウザは、実際の表示領域幅ではなく、幅が960pxあるものとしてWebページを表示させます。これは、従来のパソコン用のWebページを、そのままのイメージで縮小表示するための仕様です。
しかし、これでは見づらいので、特にスマホなどの小さな画面では、はじめから適正な文字サイズで表示されるよう、表示幅や拡大率などを設定する必要があります。
スマートフォン、タブレット等での表示幅・拡大率等の設定は、HTMLファイルの<head>内に<meta>タグを使って、以下のように記述します。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
この記述は、スマートフォン、タブレット等での表示幅・拡大率等を適正にするための「定番の書き方」とご理解ください。device-width とは「当該機器の画面のピクセル数」を意味するもので、上記のように記載しておけば、375 とか 480 といった具体的な数字を書く必要はありません。
一般に、HTML側の meta タグで viewport指定を行うとともに、CSS側のメディアクエリを使って実現します。
<meta name="viewport" content="width=device-width, initial-scale=1.0">
デバイスのタイプと特性に応じて、CSSファイルを分けて読ませる、あるいはCSSファイルの中でスタイルを書き分けることが必要です。これには、メディアクエリーという機能を使います。主に以下の3つの方法があります。
参考: CSS/MediaQueries
<link rel="stylesheet" href="読み込むファイルのパス" media="メディアタイプの指定 and (メディア特性の指定)">
<link rel="stylesheet" href="mobile.css" media="screen and (max-width: 640px)">
@import url( '読み込むファイル' ) メディアタイプの指定 and (メディア特性の指定);
@import url('mobile.css') screen and (max-width: 640px);/* CSS の文字コード */
@charset "UTF-8";
/* 共通CSS */
@import url('base.css') screen;
/* Mobileサイズのみに適用 */
@import url('mobile.css') screen and (max-width: 768px);
/* PCサイズのみに適用 */
@import url('pc.css') screen and (min-width: 769px);
/* 当該サイト固有のテーマ(追加のCSS)*/
@import url('theme.css') screen;
/* プリンタ出力用のCSS */
@import url("print.css") print;
@media メディアタイプの指定 and (メディア特性の指定) {
/* 当該デバイス用のスタイル記述 */
}h1 {
:
font-size : 2rem;
}
@media screen and (max-width: 640px) {
h1 {
font-size : 1.2rem;
}
}
CSSでは読み込み順にスタイルが適用されていきます。先に読み込まれたスタイルは、後から読み込まれたスタイルによって上書きされるので(つまり後着優先なので)、デバイスに依存しない共通スタイル情報を先行して、デバイスごとの変更部分を後から設定する・・という順番で記述します。
複数のファイルに書き分けた場合は、後半で読み込んだスタイルが、前半で読み込んだスタイルを上書きします。デバイスごとにCSSを完全に区別して読み込む場合は、それぞれに必要なスタイルをすべて記載する必要がありますが、追加読み込みしていく場合は、変更点のみ記載すればOKです。
一般に、以下のような順序で読み込むようにすると、スタイルの上書きが必要最小限になるので効率的です。
例えば、モバイル用のスタイルを基本として、PCの画面サイズまで広がったら「メニュー(nav ul)を横並び」に、「コンテナ(#container)の幅を60%」に変更する・・といった場合は、以下のように @media を用いて変更部分のみ記載すればOKです。
/* Mobile サイズ(基本) */
nav ul {
:
flex-direction: column;
}
main {
:
width: 100%;
}
/* PC サイズ */
@media only screen and (min-width: 640px) {
nav ul {
flex-direction: raw;
}
main {
width: 60%;
}
}
デザインを切り替える画面幅のポイントについては、標準的なスマホ、タブレット、PCの画面幅を参考にして決めることになります。最新の情報
時代とともにデバイスのサイズは変わるので、px単位だと、その都度修正が必要になります。文字幅の単位である em を使うのも賢明な手法です。
@media only screen and (max-width: 36em) {・・・・・・}
縦長か横長かでデザインを分ける場合は、以下のように区別します。
@media only screen and (orientation:landscape) {
/* 横向き用のスタイル */
}
@media only screen and (orientation:portrait) {
/* 縦向き用のスタイル */
}
以下に2つの事例を紹介します。見た目と挙動は同じですが、CSSの構成方法に違いがあります。
ひとつのCSSファイル(style.css)をモバイルファーストで記述しています。PC用のスタイルをソースの後半で @media を使って追加上書きしています。
さらに jQuery の slideToggle() を用いたバージョン
さらに サブメニュー表示を追加したバージョン
CSSファイルを分割読み込みする事例です。HTMLで読み込むのは main.css で、main.css が @import を使ってモバイル用とPC用を読み分けています。
さらに jQuery の slideToggle() を用いたバージョン
メディアクエリーを使わずに Flexbox のみでスマホに対応させることも可能です。以下、サンプルのリンクです。ソースコードについては、ブラウザで「ページのソースを見る」から辿ってご覧下さい。