Как я могу "отключить" масштабирование на мобильной веб-странице?

Я создаю мобильную веб-страницу, которая представляет собой большую форму с несколькими текстовыми вводами.

Однако (по крайней мере, на моем мобильном телефоне Android), каждый раз, когда я нажимаю на ввод, вся страница там увеличивается, скрывая остальную часть страницы. Есть ли какая-нибудь команда HTML или CSS, чтобы отключить этот вид масштабирования на мобильных веб-страницах?

16 ответов

Это должно быть все, что вам нужно

<meta 
     name='viewport' 
     content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' 
/>

Для тех из вас, кто опаздывает на вечеринку, ответ kgutteridge не работает для меня, и ответ Бенни Нойгебауэра включает target-densitydpi ( функция, которая не рекомендуется).

Это, однако, работает для меня:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />

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

Рендеринг страницы по ширине устройства, не масштабировать:

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

Запретить масштабирование и запретить пользователю возможность масштабирования:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">

Снятие всего масштабирования, все масштабирование

<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />

Похоже, что простое добавление метатегов в index.html не мешает масштабированию страницы. Добавление стиля ниже сотворит чудеса.

:root {
  touch-action: pan-x pan-y;
  height: 100% 
}

РЕДАКТИРОВАТЬ: Демо: https://no-mobile-zoom.stackblitz.io/

Поскольку до сих пор нет решения для первоначальной проблемы, вот мои два чистых CSS-цента.

Мобильные браузеры (большинство из них) требуют, чтобы размер шрифта на входах был 16px. Так

input[type="text"],
input[type="number"],
input[type="email"],
input[type="tel"],
input[type="password"] {
  font-size: 16px;
}

решает проблему. Таким образом, вам не нужно отключать масштабирование и потерять специальные возможности вашего сайта.

Если ваш базовый размер шрифта не равен 16px или не равен 16px на мобильных устройствах, вы можете использовать медиа-запросы.

@media screen and (max-width: 767px) {
  input[type="text"],
  input[type="number"],
  input[type="email"],
  input[type="tel"],
  input[type="password"] {
    font-size: 16px;
  }
}

Ты можешь использовать:

<head>
  <meta name="viewport" content="target-densitydpi=device-dpi, initial-scale=1.0, user-scalable=no" />
  ...
</head>

Но учтите, что в Android 4.4 свойство target-densitydpi больше не поддерживается. Так что для Android 4.4 и более поздних версий рекомендуется использовать следующее:

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />

Пожалуйста, попробуйте добавить этот метатег и стиль

<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>


<style>
body{
        touch-action: manipulation;
    }
</style>

Возможное решение для веб-приложений. Хотя масштабирование больше нельзя отключить в iOS Safari, оно будет отключено при открытии сайта с помощью ярлыка на главном экране.

Добавьте эти метатеги, чтобы объявить ваше приложение "совместимым с веб-приложением":

    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport"/>
    <meta name='apple-mobile-web-app-capable' content='yes' />

Однако только использовать эту функцию, если ваше приложение самообеспечивающийся, как вперед / назад кнопку и URL бар Aswell как варианты обмена отключены. (Вы все еще можете проводить пальцем влево и вправо) Однако этот подход позволяет использовать такие приложения, как ux. Полноэкранный браузер запускается только тогда, когда сайт загружается с домашнего экрана. Я также заставил его работать только после того, как я включил apple-touch-icon-180x180.png в свою корневую папку.

В качестве бонуса вы, вероятно, также захотите включить вариант этого:

<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent'/>
<script type="text/javascript">
document.addEventListener('touchmove', function (event) {
  if (event.scale !== 1) { event.preventDefault(); }
}, { passive: false });
</script>

Добавьте скрипт, чтобы отключить сжатие, нажатие, фокус Zoom

      <header>
 <meta name="viewport" content="user-scalable=no">
</header>

чистый"user-scalable=no"достаточно, и исключение других параметров ширины и масштаба должно подойти для вашего случая. В моем случае я просто добавил фрагмент в свой файл . Проверено на iOS 16.

Вы можете выполнить задачу, просто добавив следующий элемент meta в свою голову:

<meta name="viewport" content="user-scalable=no">

Добавление всех атрибутов, таких как "ширина", "начальный масштаб", "максимальная ширина", "максимальный масштаб", может не работать. Поэтому просто добавьте вышеуказанный элемент.

Решение с использованием meta-tag не работал у меня (проверено на Chrome win10 и Safari IOS 14.3), и я также считаю, что проблемы доступности, упомянутые Джеком и другими, должны быть учтены.

Мое решение - отключить масштабирование только тех элементов, которые повреждены масштабированием по умолчанию.

Я сделал это, зарегистрировав слушателей событий для жестов масштабирования и используя event.preventDefault() чтобы подавить поведение масштабирования по умолчанию в браузерах.

Это нужно сделать с помощью нескольких событий (сенсорные жесты, колесо мыши и клавиши). Следующий фрагмент - это пример колесика мыши и жестов сжатия на сенсорных панелях:

      noteSheetCanvas.addEventListener("wheel", e => {
        // suppress browsers default zoom-behavior:
        e.preventDefault();

        // execution my own custom zooming-behavior:
        if (e.deltaY > 0) {
            this._zoom(1);
        } else {
            this._zoom(-1);
        }
    });

Здесь описано, как определять сенсорные жесты: /questions/15306286/samyij-prostoj-sposob-obnaruzhit-schepotku/15306312#15306312

Я использовал это, чтобы сохранить стандартное поведение масштабирования для большинства частей моего приложения и определить настраиваемое поведение масштабирования для элемента холста.

Используя этот пост и несколько других, мне удалось разобраться в этом, чтобы он был совместим с Android и iPhone / iPad / iPod, используя следующий код. Это для PHP, вы можете использовать ту же концепцию для любого другого языка с поиском строк.

      <?php //Device specific headers
$iPod    = stripos($_SERVER['HTTP_USER_AGENT'],"iPod");
$iPhone  = stripos($_SERVER['HTTP_USER_AGENT'],"iPhone");
$iPad    = stripos($_SERVER['HTTP_USER_AGENT'],"iPad");
$Android = stripos($_SERVER['HTTP_USER_AGENT'],"Android");
$webOS   = stripos($_SERVER['HTTP_USER_AGENT'],"webOS");

if($iPhone || $iPod || $iPad){
    echo '<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />';
} else {
    echo '<meta name="viewport" content="width=device-width, initial-scale=1.0" />';
}

?>

Кому-то это может помочь: на iOS моя проблема решилась заменой <button>с для <div>с., наряду с другими упомянутыми вещами.

document.addEventListener('dblclick', (event) => {
    event.preventDefault()
}, { passive: false });

Некоторые метатеги вида на устройство не будут работать. В этом случае вы можете добавить этот скрипт

$(document).on('touchmove', false);

например:

</head>
<body>
<script>$(document).on('touchmove', false);</script>
</body>
Другие вопросы по тегам