マルチデバイス対応の方法をまとめてみた

前回の続きで、マルチデバイスの具体的な対応方法をviewportの設定とcssの出し分けの2点でまとめてみました。

スマホ、タブレットに対応させるための方法として、やることは主に以下の二つです。

1,viewportの設定
2,cssの出しわけ

それぞれまとめてみました。

viewportの設定

viewportとは、スマートフォンのブラウザのウィンドウサイズに該当するものです。
一方、スマートフォンの画面サイズ、いわゆるdevice-widthは980pxもありません。 iPhoneでいえば、viewportは横幅980px、device-widthは横幅320px、縦幅480pxです。

通常のPCサイトを見ると、ブラウザ上で縮小されて表示されます。 例えば、コンテンツ幅が800pxのサイトでは、縮小されて横幅が左右合計180pxの余白がでます。
また、スマホの画面サイズが横幅320pxなので合わせてサイトを設計しても、viewportを設定しないと、 660px(980px-320px)の余白ができ、かなり縮小されて表示されてしまいます。

そこで、viewportの設定が必要となります。
viewportはmetaタグを用いて以下のように記述します。

<meta name="viewport" content="width=device-width, initial-scale=1.0">

name属性に"viewport"と記述し、content属性に内容を記述していきます。
content属性に記入できる内容は以下の通りです。

width viewportの横幅
height viewportの縦幅
initial-scale 初期の倍率
minimum-sacle 倍率の最小値
maximum-scale 倍率の最大値
user-scalable 拡大縮小の可否

初期値は端末によって異なるため、除いてあります。
それぞれpxや乗数で入力して調整できますが、ほとんどの端末にもれなく対応するためには、以下のように記述するのがベターかと思います。

▼ユーザーの拡大、縮小あり

<meta name="viewport" content="width=device-width, initial-scale=1.0">

▼ユーザーの拡大、縮小なし

<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">

user-scalable、つまりユーザーの拡大と縮小の可否で分けてあります。ユーザーはデフォルトで拡大できると認識していることがほとんどだと思うので、 基本的には拡大縮小は可能にすべきだと思いますが、拡大させたくない場合は2番目のように記述します。

androidにおけるviewportの扱い

viewportはもともとiphoneのsafariの仕様ではありますが、一応androidでも実装されています。 android developersのサイトによれば、OS2.0以降はviewportの設定が効くという話ですが、端末によっては効かなかったりするらしいです。
検証したわけではないので、なんとも言えませんが...。

画面を横にしたときのviewportの扱い

画面を横にすると、当たり前ですが画面幅の縦と横が逆になります。iPhoneでいえば、480px×320pxになります。 画面を横にした場合は、viewportが320pxから480pxになるのが通常の解釈です。 しかし、どうやらviewportはデバイスの向きを変えても、読み込み時のviewportは固定されるらしいです。 つまり、user-scalableをyesにしていると、320pxのまま、画面幅maxまで拡大されてしまいます。
以下実験してみました。user-scalableをyes/noそれぞれの時に画面を横にした場合の表示です。

・user-scalableがyesの場合

user-scalableがyesの場合

・user-scalableがnoの場合

user-scalableがnoの場合

このように、user-scalableをyesにしていると、初期表示の時点でブラウザからコンテンツがはみ出してしまいます。
ユーザーはどんな時に横にしてブラウジングするかは分かりませんが、この崩れを避けるにはuser-scalableをnoにしたほうが無難です。 ユーザーの拡大縮小操作が犠牲になってしまいますが...。
ちなみに、自分はnoにしています。

以上、viewportについてのまとめでした。
viewportはマルチデバイス対応に限らず、スマホサイト、タブレットサイトを作成する場合は基本的に設定したほうがいいです。

CSSの出し分け

続いてCSSの出し分けについてです。

よく言われる方法は主に3つ。
php、javascript等のuseragentでcssを出し分ける方法が1つ。
もうひとつが巷で噂のcssのmediaqueriesの機能を用いた方法です。

前者はuseragentで条件分岐してcssを書き出すだけです。
ちなみに、こんな感じになるかと。

(function(){
  var ua = {
    iPhone: navigator.userAgent.indexOf('iPhone') != -1,
    iPad: navigator.userAgent.indexOf('iPad') != -1,
    iPod: navigator.userAgent.indexOf('iPod') != -1,
    android: navigator.userAgent.indexOf('Android') != -1,
    windows: navigator.userAgent.indexOf('Windows Phone') != -1
  }
  if(ua.iPhone || ua.iPad || ua.iPod || ua.android || ua.windows){
    document.write('<meta name="viewport" content="initial-scale=1.0">\n');
    document.write('<link rel="stylesheet" type="text/css" href="SP.css" media="screen">\n');
  }else{
    document.write('<link rel="stylesheet" type="text/css" href="PC.css" media="all">\n');
  }
}());

上の例はスマホ、タブレットだった場合、meta(viewport)とlink(デバイス別CSS)を、それ以外の場合はPC用のCSSを書き出しています。 見ての通り、スマホサイト作成レポートに書いたuseragentの記述とあまり変わりません。 条件分岐後の処理がURLの移動なのか、CSSの振り分けなのかの違いです。
なので、今回はCSSのmediaqueriesの機能をまとめてみます。

mediaqueriesとは

mediaqueries(メディアクエリー)とは、HTML4、CSS2からあるmediatype(メディアタイプ)の拡張機能です。 mediatypeとはCSSをスクリーン、テレビ、プリンタなど媒体に合わせて出し分ける機能です。 mediajqueriesでは、より詳細にCSSを出し分けることができます。 様々な条件をもとに分岐を設定できるのですが、マルチデバイス対応においてはスクリーンタイプの幅をベースに分岐させます。
記述は以下のようになります。

<link rel="stylesheet" media="screen and (max-width: 580px)" href="small.css" />

特筆すべきところは、media属性です。
「media="screen and (max-width: 580px)"」
と書いてあります。
これは、mediatypeがscreenの場合で、max-width、すなわち画面幅が580px未満の場合にこのCSSを読み込ませるというものです。
簡単なデモページをつくってみました。

mediaqueriesのデモページはこちら
※ PCで閲覧し、画面幅を徐々に狭めてみてください。

サンプルページでは、(1)画面幅が800px以下の場合と、(2)画面幅が500px以下の場合で読み込むCSSを分けています。800pxはiPad、500pxはiPhoneその他スマートフォンを想定しています。
ソース上では以下のように記述をしてあります。

1) 画面幅が501px~800pxの場合

2) 画面幅が500px以下の場合

もちろん、iPadでは(1)が、iPhoneでは(2)と同じスタイルが適応させているのを確認できるかと思います。
また、上記の例では、ファイルごと出し分けをしましたが、一部スタイルのみを適用させることもできます。 その場合は下記のように記述します。

@media screen and (max-width: 500px){
	.hoge {
		background-color: #cccccc;
	}
	/* 続けて入力可能 */
}

画面幅が500px未満の場合のみ、hogeというクラス名を持つ要素にスタイルが適応されます。
デバイスに向けたCSS出し分けの際では、あまり用いることはないと思いますが...。

こんな感じで、各デバイスに合わせてCSSを出し分けます。
そのうちこのブログもトップページくらいはマルチデバイス対応にします。

コメントする

トラックバック