Chapter02 レスポンシブWebデザイン

レスポンシブWEBデザインとは様々なデバイスに対応する、
WEBデザイン構築手法。

にイーサン・マルコッテ氏が考案したWEBサイト構築手法で、
1つのHTMLファイルでスマートフォンやタブレットなど、
様々なデバイスに最適化することが出来る。

レスポンシブWEBデザイン
レスポンシブWEBデザインのメリットとデメリット
メリット デメリット
  • 更新する際は1つのHTMLファイルのみでよい
  • URLが一つに統一できる
  • 様々なデバイスにも対応しやすい
  • デバイスごとに異なる内容を表示するのが困難
  • どのデバイスでも最適な表示になるように慎重な設計が必要
  • スマートフォンやタブレットでPCサイトの表示ができない

レスポンシブWEBデザインに必要な知識

レスポンシブWEBデザインは、以下の技術を組み合わせて構築されている

  • ビューポート
    スマホやタブレットの画面表示領域の設定
  • リキッドレイアウト
    ブラウザのサイズに合わせて可変するレイアウト手法
  • フルードイメージ
    画像が親要素の幅を超えないようにする手法
  • メディアクエリ
    ブラウザのサイズや状態によってスタイルを切り替えるCSS3の機能

画面の表示領域 スマホは、デフォルトだと、
980pxの横幅をピッタリに表示する。

一般的なスマートフォンは、デフォルトの状態だと
横幅980pxのWebページを、 横幅ぴったりに縮小して表示する。
表示領域を変更するには、 viewportメタタグを用いる。

980px
デフォルト

iPhone6
デフォルトでは980px

device-width
画面に合わせる

iPhone6
viewportメタタグの例
<meta name="viewport" content="width=device-width, initial-scale=1">

上記の <meta> タグをHTMLファイルの <head></head>内に配置すると、
Webページを縮小せず、デバイスの幅に合わせて表示するようになる。

viewportメタタグの構文
<meta name="viewport" contnet="プロパティ=値">

*.プロパティ="値" は、半角カンマで区切ることで複数指定出来る

viewportメタタグの主なプロパティ
プロパティ
width 表示領域の幅 数値 ピクセル数(200 〜 10000 の範囲、初期値は980)
device-width 端末画面の幅に合わせる
height 表示領域の高さ 数値 ピクセル数(233 〜 10000 の範囲、初期値は自動)
device-height 端末画面の高さに合わせる
initial-scale 初期のズーム倍率 数値 倍率minimum-scalemaximum-scale の範囲)
minimum-scale 最小倍率 数値 倍率(0 〜 10 の範囲、初期値は 0.25)
maximum-scale 最大倍率 数値 倍率(0 〜 10 の範囲、初期値は 1.6)
user-scalable ズームの操作 yes 許可する(初期値)
no 許可しない

viewportメタタグを使ってみよう

  1. 「chapter02」 › 「viewport」フォルダ内の「index.html」をテキストエディタで開く
  2. head要素内に、viewportメタタグを記述
chapter02/viewport/index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Viewportの練習</title>
</head>
  1. 上書き保存
  2. ブラウザで「chapter02」 › 「viewport」フォルダ内の「index.html」にアクセス
  3. デベロッパーツールを表示し、デバイスををスマートフォン(iPhoneなど)に切り替える
  4. 等倍で表示されているか確認
ブラウザでの表示例

RERUN

リキッドレイアウト スマホサイトの横幅は、
「%」で指定する。

ウインドウの幅に可変するレイアウトを作成する場合は、
横幅を %にする。(親要素の横幅に対する割合)

リキッドレイアウト

px → % の計算式

÷
× 100 = 幅に設定する値(%)

リキッドレイアウトを試してみよう

  1. 「chapter02」 › 「liquid-layout」フォルダ内の「index.html」をブラウザで開き
    固定幅であることを確認
  2. 「chapter02」 › 「liquid-layout」 › 「css」フォルダ内の「common.css」をテキストエディタで開き、
    リキッドレイアウトに変更
chapter02/liquid-layout/css/common.css
/* レイアウト */
#wrapper {
  overflow: hidden;
  margin: 0 auto;
  max-width: 960px; /* ボックスの最大幅 */
  width: 95%; /* 左右に余白を空けるため */
}

#main {
  float: left;
  width: 71.875%;
  background-color: #fff;
}

#sidebar {
  float: right;
  width: 25%;
  background-color: #fff;
}
  1. 上書き保存
  2. ブラウザで「chapter02」 › 「liquid-layout」フォルダ内の「index.html」にアクセス
  3. デベロッパーツールを表示し、レスポンシブに切り替える
  4. ウインドウ幅に応じて、レイアウトが可変するかを確認
ブラウザでの表示例

RERUN


フルードイメージ 画像の幅がウインドウを
超えないようにする。

画像は、画像自身に幅と高さが存在する。
従って、画像の幅よりウインドウが細くなっても、
画像の大きさは変わらず横スワイプで表示される。
画像の幅がウインドウを超えないように、最大値を設定する。

フルードイメージ
フルードイメージの設定
img {
  max-width: 100%; /* 幅の最大値を 親要素の幅に合わせる */
  height: auto; /* 縦横比を維持するため */
}

フルードイメージを試してみよう

  1. 「chapter02」 › 「fluid-image」フォルダ内の「index.html」をブラウザで開き
    写真がウインドウを超えることを確認
  2. 「chapter02」 › 「fluid-image」 › 「css」フォルダ内の「common.css」をテキストエディタで開き、
    フルードイメージのCSSを追記
chapter02/fluid-image/css/common.css
img {
  max-width: 100%;
  height: auto;
}
  1. 上書き保存
  2. ブラウザで「chapter02」 › 「fluid-image」フォルダ内の「index.html」にアクセス
  3. ウインドウの幅を変更し、画像がはみ出ないかを確認。
ブラウザでの表示例

RERUN


メディアクエリ ブラウザの状態に合わせて、
スタイルを変更する。

メディアクエリはブラウザやデバイスの幅や状態によって、
CSSを切り分けるCSS3の機能。

メディアクエリの記述方法

メディアクエリは、ブラウザやデバイスの状態が特定の条件に一致した時に、
以下のいずれかの方法でCSSを切り分けることが出来る。

link要素を使って、CSSファイルごと切り替える方法

link要素でCSSファイルをリンクする際に、 media属性を使ってメディアクエリを指定し、
リンクするCSSを切り替えることが出来る

link要素を使って、CSSファイルごと切り替える方法
link要素のmedia属性によるCSSファイルの切り替え例
<!-- 画面サイズが 767px 以下の時に適用されるスタイル -->
<link rel="stylesheet" href="smartphone.css" media="screen and (max-width: 767px)">
<!-- 画面サイズが 768px 以上、1023px 以下の時に適用されるスタイル -->
<link rel="stylesheet" href="tablet.css" media="screen and (min-width: 768px) and (max-width: 1023px)">
<!-- 画面サイズが 1024px 以上時に適用されるスタイル -->
<link rel="stylesheet" href="pc.css" media="screen and (min-width: 1024px)">

上記の <link> タグをHTMLファイルの <head></head>内に配置すると、
media属性の条件に応じてCSSファイルを切り替えできる。

link要素のmedia属性の構文
<link rel="stylesheet" href="..." media="出力媒体 and (メディア特性: 値)">

CSSファイルの中で @mediaキーワードによる切り替え方法

CSSファイルの中で、@mediaキーワードを使って、
メディアクエリを指定し、スタイルを切り替えることが出来る

@mediaキーワードによるCSSの切り分け
CSSファイルの中で @mediaキーワードによる切り替をえる例
/* デフォルトのスタイル(画面の幅が 768px 未満の時のスタイル) */
.item {
  width: 100%;
}

/* 画面サイズが 768px 以上の時に適用されるスタイル */
@media screen and (min-width: 768px) {
  .item {
    width: 25%;
    float: left;
  }
}

/* 画面サイズが 1024px 以上の時に適用されるスタイル */
@media screen and (min-width: 1024px) {
  .item {
    width: 20%;
  }
}
@mediaキーワードの構文
@media 出力媒体 and (メディア特性: ) {
  /* ここに セレクタ {プロパティ: 値;}  を記述 */
}

@importで別のCSSファイルを読み込む方法

CSSファイルの中に、@importキーワードで別のCSSファイルを読み込む際に
メディアクエリを指定する事ができる。

@importキーワードによるCSSの読み込み
@importキーワードによるCSSファイルの読み込みを切り替える例
/*  画面サイズが 767px 以下の時に適用されるスタイル */
@import url("smartphone.css") screen and (max-width: 767px);
/* 画面サイズが 768px 以上 1023px 以下の時に適用されるスタイル */
@import url("tablet.css") screen and (min-width: 768px) and (max-width: 1023px);
/* 画面サイズが 1024px 以上の時に適用されるスタイル */
@import url("pc.css") screen and (min-width: 1024px);
@importの構文
@import url("...") 出力媒体 and (メディア特性: 値);

出力媒体とメディア特性

主な出力媒体
意味
all 全ての機器
screen パソコン画面(スマホやタブレットも含む)
print プリンタ
prijection プロジェクタ
tv テレビ
handheld 携帯用機器 (画面が小さく回線も遅い機器)
tty 文字幅が固定の端末
speech スピーチ・シンセサイザー (音声読み上げソフトなど)
braille 点字ディスプレイ
emossed 点字プリンタ
主なメディア特性と値
メディア特性 説明
width 表示領域の幅 (スクロールバーを含む) 実数 + 単位
min-width 表示領域の最小の幅 (これ以上に適用) 実数 + 単位
max-width 表示領域の最大の幅 (これ以下に適用) 実数 + 単位
height 表示領域の高さ (スクロールバーを含む) 実数 + 単位
min-height 表示領域の最小の高さ (これ以上に適用) 実数 + 単位
max-height 表示領域の最大の高さ (これ以下に適用) 実数 + 単位
orientation 縦長 (portrait) / 横長 (landscape) portrait / landscape
resolution 解像度 実数 + dpi / 実数 + dpcm
min-resolution 最小の解像度(これ以上に適用) 実数 + dpi / 実数 + dpcm
max-resolution 最大の解像度(これ以下に適用) 実数 + dpi / 実数 + dpcm

特性と値を複数指定する場合は、「and」で区切る。


メディアクエリを試してみよう

  1. 「chapter02」 › 「media-queries」 › 「css」フォルダ内の「common.css」をテキストエディタで開く
  2. メディアクエリで、ウインドウの幅によってbody要素の背景色を変更する
chapter02/media-queries/css/common.css
/* ウインドウが 768px 以上の時 */
@media screen and (min-width: 768px) {
  body {
    background-color: #607d8b;
    color: #eceff1;
  }
}

/* ウインドウが 1024px 以上の時 */
@media screen and (min-width: 1024px) {
  body {
    background-color: #263238;
  }
}
  1. 上書き保存
  2. ブラウザで「chapter02」 › 「media-queries」フォルダ内の「index.html」にアクセス
  3. ウインドウ幅に応じて背景色が変更されるかを確認
ブラウザでの表示例

RERUN

IE8以下への対応
IE8以下はメディアクエリが非対応となる。
JavaScriptによる対策が必要で、一般的に、 respond.jsというJavaScriptファイルをダウンロードし、ロールカルフォルダ内に保存し、<script>タグで読み込み利用する。
読み込みサンプル(「js」フォルダ内に保存した場合)
<!--[if lt IE 9]>
  <script src="js/respond.js"></script>
<![endif]-->

ブレークポイントデザインを切り替える基準の設定

ブレークポイントは、メディアクエリによってCSSを切り分ける基準となる横幅。
対応するデバイスや将来性を考えて決定する必要がある。
以下はブレークポイントの例。

ブレークポイント

画像の切り替えデバイスに合わせて、
読み込む画像を切り替える。

各デバイスで異なる画像を表示する場合は、HTML5.1で追加された、
picture 要素を用いると便利。

picture要素とsource要素

picture要素は、ブラウザやデバイスの状態に応じて最適な画像を選択する要素で、
HTML 5.1で正式に導入された新要素。(IE以外ではほとんどサポート【対応ブラウザ】)
画像は、picture要素内に、必要な数だけ source要素を用いて指定する。
なお、 picture要素内の最後には、img要素が必須で、
source要素がマッチしない場合や、picture要素に対応していないブラウザに使われる。

picture要素とsource要素のサンプル
<picture>
  <source srcset="images/small.jpg" media="(max-width: 767px)">
  <source srcset="images/medium.jpg" media="(max-width: 1023px)">
  <img src="images/large.jpg" alt="サンプルです">
</picture>
picture要素の概要
カテゴリ フロー・コンテンツ、フレージング・コンテンツ、エンベデッド・コンテンツ
コンテンツ・モデル 0個以上の source要素と、その後に1つの img要素
親要素 エンベデッド・コンテンツを受け入れる全ての要素
属性 グローバル属性のみ
source要素の概要
カテゴリ なし
コンテンツ・モデル なし (空要素)
親要素 audio要素、video要素、picture要素
属性 グローバル属性に加えて以下の属性が使える
  • srcset (必須)
    画像がひとつの場合は画像のファイルパス。(例:srcset="images/picture.jpg"複数指定する場合は、画像のファイルパスと解像度や幅の記述の組み合わせ(例:srcset="images/picture.jpg, images/picture@2x.jpg 2x"を、半角カンマ区切りで指定。(解像度や幅の記述がない場合は 1x とみなされる)
  • media
    ソースが選択されるメディアクエリを指定する (例:media="(min-width: 768px)"
  • sizes
    表示する幅を指定する。幅のみの指定 (例:sizes="100vw"、もしくはメディアクエリと幅の組み合わせで指定する(例:sizes="(max-width: 767px) 100vw"。複数指定する場合は半角カンマで区切る
  • type
    MIMEを指定する。 (例:type="image/webp"ブラウザがサポートしていない形式の場合はスキップされる。

サンプル

ブラウザやデバイス幅で画像を切り替える
<picture>
  <!-- 画面幅が 767px以下の時に表示される画像 -->
  <source srcset="images/small.jpg" media="(max-width: 767px)">

  <!-- 画面幅が 1023px以下の時に表示される画像 -->
  <source srcset="images/medium.jpg" media="(max-width: 1023px)">

  <!-- 画面幅が 1024px以上の時と、IEで表示される画像 -->
  <img src="images/large.jpg" alt="サンプルです">
</picture>
ブラウザやデバイス幅で画像を切り替える + ディスプレイの解像度で画像を切り替える
<picture>
  <!-- 画面幅が 767px以下の時に表示される画像 -->
  <source srcset="images/small.jpg, images/small@2x.jpg 2x" media="(max-width: 767px)">

  <!-- 画面幅が 1023px以下の時に表示される画像 -->
  <source srcset="images/medium.jpg, images/medium@2x.jpg 2x" media="(max-width: 1023px)">

  <!-- 画面幅が 1024px以上の時と、IEで表示される画像 -->
  <img src="images/large.jpg" srcset="images/large.jpg, images/large@2x.jpg 2x" alt="サンプルです">
</picture>
source要素の注意点
source要素は、条件にマッチする画像を記述した順番に探す。
従って、 media属性で、max-width(最大幅)を使う場合は、幅が小さいもの順に、min-width(最小幅)を使う場合は、幅が大きいもの順に指定する必要がある。
例えば、下記の様に min-width(最小幅)を使って、幅が小さいものから順番に書いた場合、ウインドウが 768px より小さい時は、どの条件にもマッチしないため、img要素が選ばれ、ウインドウの幅が 768px 以上になると、medium.jpgが選択される。しかし、ウインドウの幅が 1024px 以上になっても、最初に記述したmedium.jpgの条件にマッチしているため、medium.jpgが選択される。
<picture>
  <source srcset="images/medium.jpg" media="(min-width: 768px)">
  <source srcset="images/large.jpg" media="(min-width: 1024px)">
  <img src="images/small.jpg" alt="サンプルです">
</picture>

picture要素とsource要素を試してみよう

  1. 「chapter02」 › 「picture」 フォルダ内の「index.html」をテキストエディタで開く
  2. picture要素とsource要素を追記
chapter02/picture/index.html
<picture>
  <!--  ウインドウの幅が 767px 以下だったら 米 -->
  <source srcset="images/rice.jpg" media="(max-width: 768px)">
  <!--  ウインドウの幅が 1023px 以下だったら たまご -->
  <source srcset="images/egg.jpg" media="(max-width: 1024px)">
  <!--  ウインドウの幅が 1024px 以上と、picture要素非対応ブラウザだったら 卵かけご飯 -->
  <img src="images/tkg.jpg" alt="最高のご飯">
</picture>
  1. 上書き保存
  2. 「chapter02」 › 「picture」 › 「css」フォルダ内の「common.css」をテキストエディタで開く
  3. リキッドレイアウトと、フルードイメージのCSSを記述
chapter02/picture/css/common.css
/* フルードイメージ */
img {
  max-width: 100%;
  height: auto;
  vertical-align: bottom; /* 画像の下の余白を消す */
}


/* レイアウト */
#wrapper {
  margin: 0 auto;
  max-width: 960px;
  width: 95%;
  border: 8px solid #fff;
  box-shadow: 0 0 3px rgba(0, 0, 0, .3);
}
  1. 上書き保存
  2. ブラウザで「chapter02」 › 「picture」フォルダ内の「index.html」にアクセス
  3. ウインドウ幅に応じて選択される画像が変更されることを確認
ブラウザでの表示例

RERUN


高解像度ディスプレイへの対応Retinaディスプレイや、
4Kディスプレイに対応。

Appleの Retinaディスプレイ や 4K などの高解像度ディスプレイでは、
通常の画像は、ぼけて表示される。
従って、通常のサイズの2倍や3倍などの画像を用意し対応する。

srcset属性

img要素や、source要素は、HTML 5から追加されたsrcset属性を用いることで、高解像度ディスプレイ用の画像を提供することができる。

img要素のsrcset属性の使い方
<img src="srcset属性非対応ブラウザ用の画像ファイルパス" srcset="画像ファイルパス 倍率" alt="...">

srcset属性の属性値は、「,」区切りで複数指定可能
srcset属性の倍率を省略すると、「1x」となる
source要素のsrcset属性の使い方
<source srcset="画像ファイルパス 倍率" media="メディアクエリ">

srcset属性の属性値は、「,」区切りで複数指定可能
srcset属性の倍率を省略すると、「1x」となる

サンプル

img要素のsrcset属性のサンプル
<img src="images/normal.jpg" srcset="images/normal.jpg, images/retina.jpg 2x" alt="画像">
source要素のsrcset属性のサンプル
<source srcset="images/normal.jpg, images/retina.jpg 2x" media="(max-width: 767px)">

高解像度ディスプレイへの対策

  1. 「chapter02」 › 「picture」 フォルダ内の「index.html」をテキストエディタで開く
  2. srcset属性を追記
chapter02/picture/index.html
<picture>
<!--  ウインドウの幅が 767px 以下だったら 米 -->
  <source srcset="images/rice.jpg, images/rice@2x.jpg 2x" media="(max-width: 768px)">
  <!--  ウインドウの幅が 1023px 以下だったら たまご -->
  <source srcset="images/egg.jpg, images/egg@2x.jpg 2x" media="(max-width: 1024px)">
  <!--  ウインドウの幅が 1024px 以上と、picture要素非対応ブラウザだったら 卵かけご飯 -->
  <img src="images/tkg.jpg" srcset="images/tkg.jpg, images/tkg@2x.jpg 2x" alt="最高のご飯">
</picture>
  1. 上書き保存
  2. ブラウザで「chapter02」 › 「picture」フォルダ内の「index.html」にアクセス
ブラウザでの表示例

RERUN


まとめ レスポンシブWEBデザインには
様々な知識が必要

レスポンシブWEBデザインは、様々な技術を使って構築されるデザイン手法の一つです。

  • ビュートポートを設定する
  • リキッドレイアウトやフルードイメージは可変させる
  • メディアクエリで、CSSを切り分ける