Метатег viewport: зачем он нужен и как работает

Метатег viewport - строка в head страницы, которая сообщает мобильному браузеру, что вёрстку нужно показывать в реальном масштабе устройства, а не как уменьшенную копию десктопной версии. Без него мобильная адаптация просто не сработает, даже если в CSS уже есть гибкие единицы и медиа-запросы.

Это упрощённая имитация (настоящий эффект метатега проявляется только на реальном экране устройства, а не во вложенном окне блокнота): слева - как выглядела бы страница без метатега viewport, если браузер отрисовал её в масштабе 980px и сжал под маленький экран; справа - тот же текст в реальном размере, как после добавления метатега. Попробуй поменять текст в коде - соотношение размеров сохранится.

Что происходит без метатега viewport

Мобильные браузеры изначально создавались, когда почти все сайты вёрстались только под десктоп. Чтобы такие старые сайты не разваливались на маленьком экране, браузер по умолчанию отрисовывает страницу в невидимой "макетной области" (layout viewport) шириной около 980px - как будто она открыта на большом мониторе - а затем сжимает получившееся изображение целиком под реальный размер экрана. В результате весь текст становится крошечным, и пользователю приходится увеличивать масштаб щипком, чтобы хоть что-то прочитать.

<meta name="viewport" content="width=device-width, initial-scale=1"> - решает эту проблему одной строкой в head.

head без единого метатега viewport - даже идеально написанные media queries и гибкие единицы не спасут: браузер их просто не будет правильно применять к реальной ширине экрана.

Как работают width=device-width и initial-scale=1

У метатега два ключевых параметра, и оба нужны вместе. width=device-width говорит браузеру: используй в качестве макетной области РЕАЛЬНУЮ ширину экрана устройства, а не стандартные 980px. initial-scale=1 задаёт начальный масштаб отображения 1:1 - страница загружается без автоматического уменьшения. Важно понимать: сам по себе метатег viewport не делает сайт адаптивным - он не добавляет ни гибких единиц, ни медиа-запросов. Он лишь позволяет браузеру ПРАВИЛЬНО понимать реальную ширину экрана, чтобы уже заданные три составляющие адаптивного дизайна сработали так, как задумано.

content="width=device-width, initial-scale=1" - стандартный, самый частый вариант этого метатега.

content="width=980" - фиксированное число вместо device-width сводит эффект метатега почти к нулю: результат получится примерно таким же, как если бы тега не было вовсе.

user-scalable=no - плохая идея

У метатега viewport есть параметр user-scalable=no, который якобы "запрещает" пользователю увеличивать масштаб щипком. Раньше некоторые разработчики добавляли его, чтобы страница выглядела "как приложение". Но это реальная проблема доступности: людям с плохим зрением увеличение масштаба может быть жизненно необходимо, чтобы вообще прочитать текст. Из-за этого браузеры сегодня ведут себя по-разному и непоследовательно: на iOS этот запрет игнорируется начиная с iOS 10, а на Android некоторые браузеры (Chrome, Firefox, Edge) всё ещё его учитывают. Значит, полагаться на user-scalable=no нельзя - в лучшем случае он просто не сработает, а в худшем реально помешает части посетителей.

content="width=device-width, initial-scale=1" - без user-scalable=no, масштабирование остаётся доступным всем.

content="width=device-width, initial-scale=1, user-scalable=no" - мешает части пользователей увеличить текст, а на части устройств просто не сработает вовсе.

Из истории Метатег viewport не появился в официальной спецификации HTML - его придумала Apple для самого первого iPhone в 2007 году. Тогда почти ни один сайт в интернете не был рассчитан на маленький экран телефона, и без специального решения браузеру пришлось бы либо ломать вёрстку старых сайтов, либо показывать нечитаемо мелкий текст без всякой возможности это исправить. Apple выбрала второй вариант, но добавила именно возможность управлять этим через метатег - и решение оказалось настолько удобным, что остальные производители мобильных браузеров быстро переняли тот же тег как де-факто стандарт, хотя официально в спецификацию HTML он до сих пор не входит. По данным независимого исследования мобильных браузеров на quirksmode.org, даже спустя годы разные браузеры реализуют отдельные детали метатега (вроде того самого user-scalable) немного по-разному - несмотря на повсеместное распространение, единого стандарта на него как не было, так и нет.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Не добавляют метатег viewport вообще Мобильный браузер показывает страницу в масштабе ~980px и уменьшает её целиком Добавить <meta name="viewport" content="width=device-width, initial-scale=1"> в head
Путают метатег viewport с самой адаптивностью Один этот тег НЕ делает сайт адаптивным сам по себе Использовать метатег ВМЕСТЕ с гибкими единицами и медиа-запросами
Добавляют user-scalable=no, чтобы "запретить" масштабирование Мешает доступности для людей с плохим зрением, а на многих устройствах и не работает Не отключать масштабирование вообще
Указывают в content фиксированное число вместо device-width Эффект получается почти таким же, как при отсутствии тега Всегда использовать именно width=device-width, а не число

Шпаргалка

Что нужноКак сделать
Базовый метатег viewport<meta name="viewport" content="width=device-width, initial-scale=1">
Ширина макетной области по умолчанию (без тега)около 980px
Что делает width=device-widthравняет макетную область реальной ширине экрана устройства
Что делает initial-scale=1масштаб 1:1 при загрузке страницы, без автосжатия
user-scalable=noне использовать - вредит доступности и работает непоследовательно

Коротко: отвечаем на вопросы

Что будет, если не добавить метатег viewport?

Мобильный браузер отрисует страницу в невидимой макетной области шириной около 980px, как на десктопе, а затем сожмёт получившееся изображение под реальный экран. Текст станет крошечным, и пользователю придётся постоянно увеличивать масштаб щипком, чтобы прочитать содержимое.

Достаточно ли одного метатега viewport, чтобы сайт стал адаптивным?

Нет. Сам по себе метатег не добавляет ни гибких единиц, ни медиа-запросов - он только позволяет браузеру правильно понимать реальную ширину экрана, чтобы уже написанные адаптивные CSS-правила сработали так, как задумано.

Можно ли отключить масштабирование через user-scalable=no?

Технически можно написать, но полагаться на это не стоит: на iOS браузеры игнорируют этот запрет начиная с iOS 10 из соображений доступности, а на некоторых Android-браузерах он всё ещё работает - то есть поведение непоследовательно, а для части пользователей с плохим зрением такой запрет реально мешает.

Категория
css
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×