HTMLで絶対に使われる以下の意味を知らなかったので、調べた結果メモ。
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
「そもそもviewportってなんだ?」って調べた結果、
- まず、実際の液晶の解像度は一旦忘れろ。
<meta name="viewport" content="width=480">
と指定したとする。- するとそこに幅480pxの仮想的なウインドウが作られる。幅480pxの液晶モニターがあることをイメージして欲しい。これをviewportと呼ぶ。
- ブラウザはviewportにレンダリングする。viewportの中では、あたかも本当に480pxのモニターを使っているかのような環境になっている。なので、JSの
document.documentElement.clientWidth
なんかも480を返すし、media queryの条件判定でも480pxの画面幅が使われる。- 次にviewportを実際の液晶画面に表示する。この時、viewportの幅が実際の液晶画面よりも大きければviewportがはみ出して、液晶画面にはviewportの一部しか表示されないだろう。逆に、viewportの幅が液晶画面よりも小さければviewportの内容は液晶画面に収まるが、液晶画面には余白ができてしまうだろう。これを調整するため、ブラウザはviewportのレンダリング結果を液晶の画面サイズに合うようにズームアップまたはダウンして表示する。
<meta name="viewport" content="width=device-width">
と指定した場合はviewportの幅は端末やブラウザアプリ毎によって異なる。重要なのはここでも実際の液晶の解像度ではなく360とか580などのスマホらしい小さい値が使われるということだ。
これを読むと「あーなるほど」って理解できたけど
もう一つ疑問が残った。
それは「スマホの解像度」と「ブラウザで取得できる画面サイズ」が違うということ。
例えば、iPhoneXの解像度は1125x2436
。
なので
<meta name="viewport" content="width=device-width">
と指定した場合は、1125
が実際のwidthになるはず。
でも実際は375
と表示される。
実際に確認するために以下のように実行してみる。
- Yahooのサイトを開いて、F12を押す
- iPhoneXとしてシミュレートして、
document.documentElement.clientWidth
を取得してみる
すると、document.documentElement.clientWidth
の値は375
になる。
本来は1125
と表示されるはずなのに実際は375
。
これはなぜ?
結論からいうと、「高精細ディスプレイ」のせいだった。
Appleだと「Retinaディスプレイ」などと呼んだりらしいけど
要するに「1インチ当たりピクセルが何個詰まっているか」を表す用語として、ppiやdpiという用語がありますが、最近のスマホはこの値は非常に高いために、「ブラウザでは1ピクセルを複数のピクセルを使って表そう」という仕組みになっているらしい(この表現が正しいのか分かりませんが)。
んで、その「1ピクセルを複数のピクセルを使って表すか」は、window.devicePixelRatio
で確認できる。
このように3
と表示される。
つまり、
3 x 375 = 1125
となり「本来の解像だね!」となる
おわり
コメント