Menu

meta viewport の書き方: width=device-width の意味

viewport の meta タグは、スマートフォンにデスクトップの幅ではなく画面の幅でページをレイアウトさせます。標準の書き方、各値の働き、レスポンシブな CSS がこれに依存する理由、避けるべき値を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

使うべきタグ

すべてのページの <head> にこの 1 行を書きます。

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

width=device-width でレイアウトの幅を画面の幅にし、initial-scale=1 でページを 100% の拡大率で開きます。ほとんどのサイトに必要なのはこれだけです。タグを入れたページ全体はこうなります。

スクリプトはタグとレイアウトの幅を読み取ります。デスクトップのブラウザは viewport タグを無視するので、このプレビューでは幅は単にプレビューの箱の幅です。スマートフォンでは、タグのおかげで同じファイルがスマートフォンの幅 (普通は 360 から 430 CSS ピクセル) を報告します。

タグがないとスマートフォンで何が起きるか

viewport タグが見つからないと、モバイルブラウザはそのページがデスクトップ向けに作られたものと見なします。ページを約 980 ピクセルの幅でレイアウトし、全体を画面に収まるよう縮小します。下の 2 台のスマートフォンの模型は同じページを読み込んでいて、一方は 980px で、もう一方はスマートフォンの幅でレイアウトし、どちらも同じ大きさに縮小しています。

1 台目のスマートフォンでは 16px のテキストがとても小さくなり、読者はピンチで拡大しなければなりません。2 台目では読みやすいままで、@media (max-width: 600px) のルールが一致するので列が縦に並びます。これがタグのもう 1 つの役割です。メディアクエリが見るのはレイアウトの幅なので、タグがないとスマートフォンは 980px と報告し、モバイル向けのスタイルが一切適用されません。show('with', 375) の 375 を 980 に変えると、2 台が同じ見た目になります。

タグは仕事の半分にすぎない

viewport タグで狭いレイアウトにはなりますが、CSS がそこに収まる必要があります。画面より広い固定幅の要素が 1 つあるだけで、ページ全体が横スクロールします。

1 つ目の箱は横スクロールし、2 つ目は縮んで収まります。画像などの幅の広い要素には max-width: 100% を指定し、固定のピクセル幅より柔軟な幅 (パーセント、fr、flexbox) を使いましょう。

viewport の値

値例働き
widthwidth=device-widthレイアウトの幅。device-width は CSS ピクセルでの画面の幅。数値も指定できるが、よい考えであることはまれ
initial-scaleinitial-scale=1ページを開いたときの拡大率
minimum-scale / maximum-scalemaximum-scale=5ズームの制限。最大値が低いとズームできなくなるので、maximum-scale は書かない
user-scalableuser-scalable=yesピンチでのズームを許可するかどうか。書かない
viewport-fitviewport-fit=coverノッチや角丸の下までページを広げる。env(safe-area-inset-*) の padding と組み合わせる
interactive-widgetinteractive-widget=resizes-content画面上のキーボードがレイアウトにどう影響するか。Android の Chrome が対応

値はカンマで区切ります。ノッチのあるスマートフォンで画面全体を使うページはこうなります。

<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<style>
  body {
    padding-top: env(safe-area-inset-top);
    padding-bottom: env(safe-area-inset-bottom);
  }
</style>

ズームを禁止しない

古いテンプレートでは、このタグを見かけます。

<!-- Avoid: stops people from zooming -->
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

これはピンチでのズームを妨げます。弱視の人はズームに頼っていて、Lighthouse などのアクセシビリティチェッカーはこれを指摘します。iOS の Safari は user-scalable=no を無視するので、このタグは一貫して動くことさえありません。iPhone で入力欄をタップすると拡大されてしまうなら、原因は input のフォントサイズが 16px 未満であることです。ズームを無効にするのではなく、input の font-size を 16px 以上にしましょう。

よくある間違い

  • タグを書き忘れる。 メディアクエリが 980px のレイアウトを見るので、これがないとレスポンシブなスタイルシートはスマートフォンで何もしません。ページのテンプレートで title タグ の隣に書きましょう。
  • 値をセミコロンで区切る。 カンマを使います: width=device-width, initial-scale=1。
  • width=375 のように幅を決め打ちする。 画面の大きさはさまざまなので、device-width を使いましょう。
  • user-scalable=no や maximum-scale=1 でズームを無効にする。
  • 横スクロールをタグのせいにする。 画面より広い要素を見つけて、柔軟な幅にしましょう。

よくある質問

meta viewport タグは何をしますか?

モバイルブラウザに、レイアウトの幅をどれくらいにするかを伝えます。これがないと、ほとんどのスマートフォンはページを約 980 CSS ピクセルの幅でレイアウトし、画面に収まるよう縮小します。width=device-width を指定するとレイアウトが画面の幅に合うので、テキストが読みやすくなり、メディアクエリも効きます。

標準の meta viewport タグはどう書きますか?

<meta name="viewport" content="width=device-width, initial-scale=1"> を <head> に書きます。ほぼすべてのレスポンシブなページではこれが正解です。

meta viewport が効かないのはなぜですか?

タグが <head> の中にあるか、name が viewport か、値がカンマで区切られているかを確認しましょう。それでも横スクロールするなら、固定幅、大きな画像、長い単語など、画面より広い要素があります。デバイスより広い CSS はこのタグでは直せません。

user-scalable=no や maximum-scale=1 を使うべきですか?

いいえ。どちらもズームを止めてしまいます。弱視のユーザーの多くはズームに頼っており、アクセシビリティの監査でも不合格になります。そもそも iOS の Safari は user-scalable=no を無視します。

meta viewport タグはデスクトップのブラウザに影響しますか?

しません。デスクトップのブラウザはこれを無視し、レイアウトの幅は単にウィンドウの幅になります。このタグが意味を持つのはスマートフォンとタブレットです。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める