June 7, 2011
問題児のViewport。いろんな端末でいろんな挙動を示すらしく、Viewportに何を指定するのか悩みました。
最低の横幅を320pxと想定して作成されたリキッドの画面であれば何も悩まずに以下を指定すればOKですね。
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
今回の案件はPC画面とHTMLを共有している影響で、横幅320pxに収まりませんので、上記の指定ができません。なぜ320pxにこだわるかと言うと、個人的な経験則ですが以下の仕様が存在すると思われるから。
上記ふたつの条件が揃った場合に、Viewportで指定した横幅の数値が無視されるようです。結果として、Viewportの横幅が「320px」に強制的に解釈されて画面が拡大されてしまいます。※Galaxy S(Android2.2での検証結果)
また注意するべき点は、横幅というのは、ディスプレイの解像度ではなく、devicePixelRatioで換算したブラウザでの値になる点。算出方法は「ブラウザの表示領域(横幅と縦幅) = ディスプレイ亜解像度 / devicePixelRatio」となります。端末ごとのdevicePixelRatio値を[to-R]さんでまとめられているものを参考にして以下の表にまとめています。
キャリア | デバイス名 | devicePixelRatio | 画面サイズ | ディスプレイ解像度 | ブラウザ解像度 |
docomo | GalaxyS | 1.5 | 約 4.0インチ | 480 * 800 | 320 * 533 |
docomo | Galaxy Tab | 1.5 | 約 7.0インチ | 600 * 1024 | 400 * 683 |
docomo | Xperia(SO-01B) | 1.5 | 約 4.0インチ | 480 * 854 | 320 * 569 |
docomo | HT-03A | 1 | 約3.2インチ | 800 * 480 | 800 * 480 |
docomo | LYNX(SH-10B) | 1 | 約 5.0インチ | 960 * 480 | 960 * 480 |
docomo | REGZA Phone(T-01C) | 1.5 | 約 4.0インチ | 480 * 854 | 320 * 569 |
docomo | Xperia arc | 1.5 | 約 4.2インチ | 480 * 854 | 320 * 569 |
au | IS01 | 1 | 約5.0インチ | 960 * 480 | 960 * 480 |
au | IS03 | 2 | 約3.5インチ | 960 * 640 | 480 * 320 |
au | IS06 | 1.5 | 3.7インチ | 800 * 480 | 533 * 320 |
au | htc EVO WiMAX ISW11HT | 1.5 | 約4.3インチ | 800 * 480 | 533 * 320 |
SoftBank | iPhone3GS | 1 | 3.5インチ | 320 * 480 | 320 * 480 |
SoftBank | iPhone4 | 2.0 | 3.5インチ | 640 * 960 | 320 * 480 |
SoftBank | HTC Desire(X06HT) | 1 | 3.7インチ | 800 * 480 | 800 * 480 |
SoftBank | HTC Desire HD(001HT) | 1.5 | 約4.3インチ | 800 * 480 | 533 * 320 |
SoftBank | GALAPAGOS(003SH) | 1.5 | 3.8インチ | 800 * 480 | 533 * 320 |
EMOBILE | HTC Aria | 1 | 3.2インチ | 480 * 320 | 480 * 320 |
Nexus S | 1.5 | 4.0インチ | 480 * 800 | 320 * 533 |
ネット上でもいろんな情報がありますが、個人的には上記の2つの条件が揃った場合にViewportが無効になりました。恐らく多くのAndroid端末で同じ挙動ではないかと予測しています。
逆を言えば、どちらかの条件に該当しなければ良いので、今回はAndroidの場合には「user-scalable=no」を諦めました。iPhoneは上記の条件に該当しませんので、「user-scalable=yes」とします。
width1.html
meta name="viewport" content="width=device-width,user-scalable=no"
○問題なく表示できます。
width2.html
meta name="viewport" content="width=320,user-scalable=no"
○問題なく表示できます。
width3.html
meta name="viewport" content="width=400,user-scalable=no"
×なぜか横幅320pxでuser-scalable=yesで描画されます。
widthを320以下にするか、user-scalableをyesにすると意図した横幅で表示してくれます。
width4.html
meta name="viewport" content="width=400,user-scalable=yes"
○問題なく表示できます。
width3.htmlとの違いはser-scalable=の値だけ。結果的にwidth=320以上でser-scalable=yesの場合はだめだってことですね。