スマートフォンをはじめとしたモバイル端末でホームページを表示することを想定するとき、Viewportと呼ばれるタグを挿入します。
タグを挿入する時、例えば以下のようなコードを*コピー&ペーストしている方は多いのではないでしょうか。

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

貼り付けるだけでも問題ありませんが、構造を理解すれば好きなようにカスタマイズすることも可能です。

今回は、Viewportの基本的な概念から設定に関する具体的なコツをご紹介します。

Viewportとは?

Viewportとは表示領域のことで、ブラウザにおける仮想のカンバスサイズを決めて、サイトの表示の仕方を制御する役割があります。

desktop.png

例えば、上記のようなホームページがあるとします。
モバイルのViewportを指定していない場合は、デスクトップサイトで表示される横幅をモバイル端末の横幅と合わせてしまうので、以下のように非常に小さくて閲覧しにくい状態で表示されてしまいます。

allz.png

<meta name="viewport" content="width=360">

上記のように指定すると、横幅360pxの仮想領域としてViewportが作られます。
ブラウザはこのViewportの幅をもとにレンダリングを行うので、メディアクエリでも360pxとして反応し、DOM操作でclientWidthを取得しても360pxとなります。
モバイル端末の幅よりもViewportの幅のほうが小さいか同じであれば、スマートフォンサイトとしてストレスなく閲覧することができるでしょう。

以下のように指定すると、Viewportの幅は実際の解像度ではなく端末やブラウザに合わせた値を返します。

<meta name="viewport" content="width=device-width">

Viewportで指定できるもの

mobile.jpg

1. width (横幅)

Viewportの横幅をピクセル単位で指定します。意外と知られていませんが、初期値は960pxです。
また、指定できる範囲は200px〜10000pxで、そのほかにデバイス幅に合わせるdevice-widthがあります。

2. height (縦幅)

Viewportを指定するときにはあまり登場しませんが、横幅とのアスペスト比から計算される値が初期値となっています。
特に指定することはないとは思いますが、同じように200px〜10000pxの間で指定でき、device-heightも指定できます。

3. initial-scale (初期倍率)

初期倍率を設定します。
width=device-widthとしてinitial-scaleを指定しない場合は、自動的にinitial-scale=1となります。
一方、initial-scale=1とした時には、やはり暗黙的にwidth=device-widthであるので、実はどちらかを指定しておけば大丈夫です(※)。

※ Windows PhoneのIEではinitial-scaleに対応していないので、やはりinitial-scaleとwidthを同時指定したほうがいい、という考え方もあります。

4. minimum-scale (最小倍率)

最小縮小倍率を指定することができます。
初期値は0.25で、0より大きく10未満の値を指定します。
こちらもあまり知られていないかもしれませんが、initial-scaleとminimum-scaleは一緒に指定することができません(縮小ができなくなります)。

5. maximum-scale (最大倍率)

同様に、最大拡大倍率を指定できます。
初期値は1.6で、0より大きく10未満の値を指定します。

6. user-scalable (ユーザーのズーム操作の可否)

ユーザーがズームすることを許可するかどうかを指定することができます。
初期値はuser-scalable=yesで、yes/noまたは1/0で指定することができます。

7. target-densitydpi (ターゲットとなる画面密度)

こちらは旧版のAndroid端末に向けて指定します。
ターゲットとなる画面密度を設定しますが、target-densitydpi=device-dpiとすると端末ごとに表示される文字サイズも大きく変わってきてしまいます。
そうならないように、target-densitydpi=medium-dpiに設定するか、あるいはそもそも記述しない、というのが最近の慣行となっているようです。

最近のAndroid端末(Android4.2以降)では廃止されているので、特に気にしなくてもいいかもしれません。