いつもなんとなくで使ってしまいがちですが重要なビューポート。不適切なコードを適当にコピペで使ってしまうと、後々レイアウト調整がめんどくさくなったり、css書き直しになったりします。怖すぎますね!
新規サイト作成の受注が増えてきたので、覚書としてviewportの基本的な構造について書いていきたいと思います。
日本語に訳するとViewport=「表示領域」。ここ何年かのスマートフォンやタブレットの普及に伴い、Webサイトも色々な端末サイズに合わせて制作する需要がすごく増えてきました。
PC向けのサイトをスマホで見た時、画像が小さすぎたり文字サイズが小さすぎたりですごく読みずらかったりしますよね。ちょっと古いPCサイトとかだと、Viewportが書かれてなかったりするのも見たことあります。
Viewportとはhtmlのmeta要素のname属性として値を設定することで、Webページを表示する際ブラウザに、どれくらいのスケールでWebページを表示するかの制御をする役割を果たします。近年のマルチデバイス対応に向けて重要視されてきてるようです。
<meta name=”viewport” content=”width=device-width, initial-scale=1″>
これはレスポンシブサイトでよく使われている指定方法になります。これを例にして解説していきます。
name(meta要素)name=”viewport” → 今から表示領域の設定をします、と宣言する。
Content(属性)content=”width=device-width, initial-scale=1″ → 表示領域をこのように設定します、と言った具体的な指示を宣言する。
この例ではdevice-width、initial-scale=1が指定されていますね。
これは
width=デバイスのウィンドウ横幅に合わせる
initial-scale(初期倍率)=等倍にする
といった指定がされている事になります。
複数の属性値がある場合は「,(カンマ)」で区切ります。
という事は、この例で指定しているdevice-widthとinitial-scale=1のどっちかが不要って事になりますよね。ですがマイクロソフトが出してるWindowsPhoneというスマホのIEでは、initial-scale
がサポート外との事です。なのでやっぱり両方つけといたほう良いのではと言った意見もあるようです。
ただ日本では、WindowsPhoneのシェアは極めて低いらしいので、日本国内のユーザーが対象であれば基本的にどちらか1つをつけて置けば問題ないようです。
私はWindowsPhoneなんて見たことも触ったこともないのに、無駄にいつも両方指定していました。
とくにこれからもWindowsPhoneを対象端末に入れる予定もないし、今後は「initial-scale=1」だけでいいかなって思ってます。
ちなみにこのサイトではviewport-fit=coverも指定してます。これはiPhoneX以降のsafariのランドスペースで表示されるセーフエリア対策です。サイトに応じて必要ならつけたほうがいいかも。
以下はviewportで指定できる値になりますが、基本的にはwidth、initial-scale、viewport-fit以外はあまり使うことがないかと思います。
width 横幅 | ウィンドウ横幅。初期値980px。 具体的な数値(200px〜10000px)以外に、自動的にデバイスの表示幅を取得するdevice-widthが指定できる。 |
---|---|
height 縦幅 | ウィンドウ高さ。 初期値は「横幅とのアスペスト比から計算される値」。 200px~10000pxで指定。もしくはdevice-height。 |
initial-scale 初期倍率 | 10〜1000%、もしくは0.1〜10.0で指定可。 |
minimum-scale 最小倍率 | ユーザーがズームできる最小倍率。 初期値0.25。0〜10の数値を指定可。 |
maximum-scale 最大倍率 | ユーザーがズームできる最大倍率。 初期値1.6。0〜10の数値を指定可。 |
user-scalable ズーム操作の可否 iOS10からは非対応に。 | ユーザーのズーム操作を可能にするか、不可にするか。yes/noで指定。初期値はyes(ズーム操作可能)。 |
viewport-fit ランドスペース表示時にビューポートが画面をどのように埋めるかを制御 | 初期値はauto。 contain(ウィンドウ左右にセーフエリアとった余白が出現する。見た目はsafariではaotoと同じ)、cover(ウィンドウ全てを使用して表示) |
さて、レスポンシブサイト作成にあたって恐らく主流とされているのが、
メディアクエリによるビューポートサイズごとのスタイル出しわけ。大体こんな感じで使われます。
@media screen and (max-width:499px) {/* ビューポートサイズが499pxまでこのcssのスタイルが適用 */}
@media screen and (min-width:500px) and (max-width:959px) { /* 500pxから1024pxまでこのcssのスタイルが適用 */}
@media screen and (min-width:1025px) {/* 1025px以上はこのcssのスタイルが適用 */}
head内に指定する方法もある。
<link rel="stylesheet" type="text/css" href="common.css"><!-- mediaを指定しない場合は初期値のallが適用される -->
<link rel="stylesheet" type="text/css" href="common_sp.css" media="screen and (max-width:499px)"><!-- ビューポートサイズが499pxまでこのcssのスタイルが適用 -->
<link rel="stylesheet" type="text/css" href="common_tab.css" media="screen and (min-width:500px) and (max-width:1024px)"> <!-- 500pxから1024pxまでこのcssのスタイルが適用 -->
<link rel="stylesheet" type="text/css" href="common_pc.css" media="screen and (min-width:1025px)"><!-- 1025px以上はこのcssのスタイルが適用 -->
でもこれ、viewportを適切に指定しないと思い通りに効きません。
<meta name="viewport" content="width=750">
@media screen and (max-width:499px) {/* ビューポートサイズが499pxまでこのcssのスタイルが適用 */}
@media screen and (min-width:500px) {/* 500px以上はこのcssのスタイルが適用 */}
PC以外で強制的にコンテンツ幅を750pxにしてるのに、cssのブレークポイントは499pxになってます。コンテンツ幅が499pxになる事はないので、表示が切り替わるわけがないですね!
viewportのコンテンツ幅を数値で指定する場合は、ブレークポイントの数値も合わせて指定する必要があります。
そもそも数値で指定するのって何かメリットあるんでしょうか・・・?
ちなみにスマホなどのデバイスでのビューポートサイズは、cssピクセルで描画されるサイズになります。こちらも参考にどうぞ。
レスポンシブサイトを制作する時は、基本的に下記で問題ないかと思います。
<meta name=”viewport” content=”initial-scale=1″>
もし数値で指定する場合は、ブレークポイントと数値を合わせる事を忘れないようにしましょう。
Viewportの役割をきちんと理解し、Webサイトの用途やターゲットブラウザに対して、どのような指定が最適なのかを判断できることがすごく重要だと思います😊
何かあった時の迅速なトラブルシューティングにも繋がります!
ページトップへ
initial-scaleって?
ページが最初にロードされたときの拡大率を制御します。
initial-scale=1だと等倍表示。
widthをdevice-widthにした場合、自動的にinitial-scale=1となります。その逆も然りで、initial-scale=1を指定した場合には自動的にwidth=device-widthになります。