Menu

Meta viewport в HTML: что делает width=device-width

Мета-тег viewport говорит телефонам строить раскладку страницы по ширине экрана, а не по ширине компьютера. Разберем стандартный тег, что делает каждое значение, почему от него зависит адаптивный CSS и каких значений избегать.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Какой тег использовать

Поставьте эту строку в <head> каждой страницы:

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

width=device-width делает раскладку шириной с экран, а initial-scale=1 открывает страницу с масштабом 100%. Большинству сайтов больше ничего не нужно. Полная страница с этим тегом:

Скрипт читает тег и ширину раскладки. Браузеры на компьютере игнорируют тег viewport, поэтому в этом превью ширина просто равна ширине блока превью. На телефоне тот же файл сообщит ширину телефона (обычно от 360 до 430 пикселей CSS) благодаря тегу.

Что делают телефоны без него

Мобильный браузер, не нашедший тега viewport, предполагает, что страница сделана для компьютера. Он строит раскладку шириной около 980 пикселей, а затем уменьшает все целиком под экран. Два имитированных телефона ниже загружают одну и ту же страницу, один с раскладкой 980px, другой с шириной телефона, и оба масштабированы до одного размера:

На первом телефоне текст размером 16px становится крошечным, и читателю приходится увеличивать его жестом. На втором он остается читаемым, а столбцы выстраиваются друг под другом, потому что срабатывает правило @media (max-width: 600px). В этом вторая задача тега: медиазапросы видят ширину раскладки, поэтому без тега телефон сообщает 980px, и ваши мобильные стили никогда не применяются. Замените 375 на 980 в show('with', 375), и оба телефона будут выглядеть одинаково.

Тег это только половина работы

Тег viewport дает узкую раскладку; ваш CSS должен в нее поместиться. Один элемент с фиксированной шириной больше экрана заставляет всю страницу прокручиваться вбок:

Первый блок прокручивается вбок; второй сжимается под размер. Задайте картинкам и другим широким элементам 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-*).
interactive-widgetinteractive-widget=resizes-contentКак экранная клавиатура влияет на раскладку. Поддерживается в Chrome на Android.

Значения разделяются запятыми. Страница, которая заполняет весь экран на телефонах с вырезом, выглядит так:

<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, отмечают его как ошибку. Safari на iOS игнорирует user-scalable=no, так что тег даже не работает одинаково везде. Если поле формы на iPhone увеличивается при касании, причина в размере шрифта поля меньше 16px; задайте полю font-size не меньше 16px, а не отключайте масштабирование.

Частые ошибки

  • Забытый тег. Без него адаптивные стили ничего не делают на телефонах, потому что медиазапросы видят раскладку шириной 980px. Поставьте его рядом с тегом title в шаблоне страницы.
  • Точки с запятой между значениями. Используйте запятые: width=device-width, initial-scale=1.
  • Жестко заданная ширина, например width=375. Экраны бывают разными; используйте device-width.
  • Запрет масштабирования через user-scalable=no или maximum-scale=1.
  • Вина тега в прокрутке вбок. Найдите элемент, который шире экрана, и дайте ему гибкую ширину.

Часто задаваемые вопросы

Что делает мета-тег viewport?

Он сообщает мобильным браузерам, какой ширины должна быть раскладка. Без него большинство телефонов строят страницу шириной около 980 пикселей CSS и уменьшают ее под экран. С width=device-width раскладка совпадает с шириной экрана, поэтому текст читается, а медиазапросы работают.

Какой стандартный мета-тег viewport?

<meta name="viewport" content="width=device-width, initial-scale=1">, внутри <head>. Это правильный выбор почти для любой адаптивной страницы.

Почему meta viewport не работает?

Проверьте, что тег стоит в <head>, что name равен viewport, а значения разделены запятыми. Если страница все равно прокручивается вбок, какой-то элемент шире экрана, например фиксированная ширина, большая картинка или длинное слово; тег не может исправить CSS, который шире устройства.

Стоит ли использовать user-scalable=no или maximum-scale=1?

Нет. Оба запрещают масштабирование, на которое полагаются многие люди со слабым зрением, и не проходят проверки доступности. Safari на iOS все равно игнорирует user-scalable=no.

Влияет ли meta viewport на браузеры на компьютере?

Нет. Браузеры на компьютере его игнорируют; ширина раскладки там просто равна ширине окна. Тег важен на телефонах и планшетах.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ