Я сделал HTML-страницу с <input>
тегом type="text"
. Когда я нажимаю на него с помощью Safari на iPhone, страница становится больше (автоматическое увеличение). Кто-нибудь знает, как это отключить?
html
iphone
zoom
mobile-safari
html-input
Эдуардо Черногория
источник
источник
Ответы:
Браузер будет изменять масштаб, если размер шрифта меньше, чем
16px
размер шрифта по умолчанию для элементов формы11px
(по крайней мере, в Chrome и Safari).Кроме того,
select
элемент должен иметь присоединенныйfocus
псевдокласс.Не обязательно использовать все выше, вы можете просто стиль элементы вам нужно, например: просто
text
,number
иtextarea
:Альтернативное решение, чтобы входные элементы наследовали от родительского стиля:
источник
select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"] { font-size: 16px; }
select:focus
. У меня была такая же проблема.Вы можете запретить Safari автоматически увеличивать текстовые поля во время ввода данных пользователем, не отключая возможности пользователя увеличивать масштаб. Просто добавьте,
maximum-scale=1
но не указывайте атрибут пользовательского масштаба, предложенный в других ответах.Это полезный вариант, если у вас есть форма в слое, которая «плавает» при увеличении, что может привести к тому, что важные элементы пользовательского интерфейса переместятся за пределы экрана.
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
источник
Новое: IOS все равно будет масштабироваться, если вы не используете 16px на входе без фокуса.
Я добавил фон, так как IOS не добавляет фон на выбор.
источник
@media screen and (-webkit-min-device-pixel-ratio:0) and (max-device-width:1024px)
для ограничения эффекта на iPhone, но не изменяйте веб-сайты при просмотре в Chrome.@supports (-webkit-overflow-scrolling: touch)
, так как эта функция CSS существует только на iOSЕсли ваш сайт предназначен для мобильных устройств, вы можете решить не разрешать масштабирование.
Это решает проблему, с которой ваша мобильная страница или форма будут «плавать» вокруг.
источник
В итоге ответ таков: установите размер шрифта элементов формы не менее 16 пикселей
источник
font-size: 100%
значение и получает необходимые 16px.источник
1em
, или100%
). Если вы установили нестандартный размер шрифта, вы можете установитьfont-size
в своем фрагменте,16px
чтобы избежать автоматического масштабирования.1em
ни другое не1rem
является правильным решением, потому что оба могут быть меньше,16px
а Safari требует, по крайней мере,16px
не увеличивать масштаб.Правильный способ исправить эту проблему - изменить окно просмотра мета на:
источник
Там нет чистого способа я мог бы найти, но вот взломать ...
1) Я заметил, что событие наведения мыши происходит до масштабирования, но масштабирование происходит до событий mousedown или focus.
2) Вы можете динамически изменять тег окна просмотра META, используя javascript (см. Включить / отключить увеличение iPhone Safari с помощью Javascript? )
Итак, попробуйте это (показано в jquery для компактности):
Это определенно хак ... могут быть ситуации, когда при наведении / выключении мыши не всегда перехватываются входы / выходы, но это хорошо сработало в моих тестах и является хорошим началом.
источник
Добавьте пользовательский масштабируемый = 0 к мета области просмотра следующим образом
Работал для меня :)
источник
Мне недавно (сегодня: D) пришлось интегрировать это поведение. Чтобы не влиять на исходные поля дизайна, включая поля со списком, я решил применить преобразование в фокусе поля:
источник
Как уже указывалось во многих других ответах, этого можно достичь, добавив
maximum-scale
метатегviewport
. Однако это отрицательно сказывается на отключении пользовательского масштабирования на устройствах Android . ( Он не отключает масштабирование пользователя на устройствах iOS начиная с версии 10 ).Мы можем использовать JavaScript для динамического добавления
maximum-scale
в мету,viewport
когда устройством является iOS. Это обеспечивает лучшее из обоих миров: мы позволяем пользователю увеличивать масштаб и не позволяем iOS масштабировать текстовые поля в фокусе.Код:
источник
addMaximumScaleToMetaViewport
? Это исключительно по семантическим причинам?Взлом Javascript, который работает на iOS 7. Это основано на ответе @dlo, но события mouseover и mouseout заменяются событиями touchstart и touchend. По сути, этот сценарий добавляет тайм-аут на полсекунды, прежде чем зум снова включится, чтобы предотвратить увеличение.
источник
Это сработало для меня:
источник
Я использовал решение Кристины выше, но с небольшой модификацией для начальной загрузки и другим правилом, применимым к настольным компьютерам. Размер шрифта по умолчанию в Bootstrap составляет 14 пикселей, что вызывает увеличение. Следующее изменяет его на 16px для «элементов управления форм» в Bootstrap, предотвращая масштабирование.
И вернемся к 14px для не мобильных браузеров.
Я попытался использовать .form-control: focus, который оставил его на 14px, кроме фокуса, который изменил его на 16px, и это не решило проблему масштабирования с iOS8. По крайней мере, на моем iPhone, использующем iOS8, размер шрифта должен быть 16px перед фокусировкой, чтобы iPhone не масштабировал страницу.
источник
Я сделал это, также с JQuery:
Конечно, некоторые другие элементы интерфейса, возможно, придется адаптировать, если этот
16px
размер шрифта нарушает дизайн.источник
Через некоторое время попыток я придумал это решение
На «mousedown» он устанавливает размер шрифта ввода в 16px. Это предотвратит увеличение. На событии фокуса он изменяет размер шрифта обратно к начальному значению.
В отличие от ранее опубликованных решений, это позволит вам установить любой размер шрифта для ввода.
источник
Прочитав здесь почти каждую строчку и протестировав различные решения, это благодаря всем, кто поделился своими решениями, что я придумал, протестировал и работал для меня на iPhone 7 iOS 10.x:
Тем не менее, он имеет некоторые недостатки: заметно «скачок» в результате быстрого изменения размера шрифта, происходящего между состояниями «зависание» и «фокус», а также влияние перерисовки на производительность.
источник
Вдохновленный ответом @jirikuchta, я решил эту проблему, добавив немного CSS:
Нет JS, и я не замечаю ни вспышки, ни чего-либо.
Стоит отметить, что
viewport
withmaximum-scale=1
также работает, но не тогда, когда страница загружается как iframe, или если у вас есть другой скрипт, модифицирующий иviewport
т. Д.источник
Псевдоэлементы вроде
:focus
не работают, как раньше. Начиная с iOS 11, простое объявление сброса может быть добавлено перед вашими основными стилями (при условии, что вы не переопределите их с меньшим размером шрифта).Стоит отметить, что для библиотек CSS, таких как Tachyons.css, легко случайно изменить размер шрифта.
Например, class:
f5
эквивалентно:,fontSize: 1rem
что хорошо, если вы сохранили масштаб шрифта основного текста по умолчанию.Однако: если вы выберете класс размера шрифта:
f6
это будет эквивалентноfontSize: .875rem
небольшому дисплею вверх. В этом случае вам нужно быть более точным в отношении объявлений сброса:источник
Кстати, если вы используете Bootstrap , вы можете просто использовать этот вариант:
источник
Мне пришлось «исправить» проблему с автоматическим увеличением в элементах управления формы для веб-сайта Голландского университета (который использовал 15px в элементах управления формой). Я выдвинул следующий набор требований:
Это то, что я придумал до сих пор:
Некоторые заметки:
источник
Вместо того, чтобы просто установить размер шрифта в 16px, вы можете:
scale()
CSS-преобразование и отрицательные поля, чтобы уменьшить поле ввода до правильного размера.Например, предположим, что ваше поле ввода изначально оформлено с помощью:
Если вы увеличите поле, увеличив все размеры на 16/12 = 133,33%, а затем уменьшите
scale()
на 12/16 = 75%, поле ввода будет иметь правильный визуальный размер (и размер шрифта), и масштабирование будет отсутствовать. фокус.Поскольку это
scale()
влияет только на визуальный размер, вам также необходимо добавить отрицательные поля, чтобы уменьшить логический размер поля.С этим CSS:
поле ввода будет иметь логический размер шрифта 16 пикселей, в то время как будет отображаться текст размером 12 пикселей.
У меня есть запись в блоге, в которой я немного подробнее расскажу, и этот пример представлен в виде просматриваемого HTML:
в iPhone Safari нет увеличения при вводе, идеальный пиксельный способ
источник
Даже с этими ответами мне потребовалось три дня, чтобы понять, что происходит, и мне может понадобиться решение снова в будущем.
Моя ситуация немного отличалась от описанной.
У меня был какой-то спорный текст в div на странице. Когда пользователь нажал на кнопку DIFFERENT div, своего рода кнопку, я автоматически выделил некоторый текст в contenteditable div (диапазон выбора, который ранее был сохранен и очищен), запустил execCommand расширенного текста в этом выделении и очистил его снова.
Это позволило мне незаметно изменять цвета текста на основе взаимодействия пользователя с цветовыми элементами в других местах на странице, сохраняя при этом выделение, как правило, скрытым, чтобы они могли видеть цвета в правильном контексте.
Что ж, на iPad Safari нажатие на div цвета привело к появлению экранной клавиатуры, и я ничего не сделал, чтобы помешать этому.
Я наконец понял, как iPad делает это.
Он прослушивает последовательность прикосновений и касаний, которые запускают выделение редактируемого текста.
Когда эта комбинация происходит, она показывает экранную клавиатуру.
На самом деле, он выполняет масштабирование тележки, где он расширяет нижележащую страницу, в то же время увеличивая редактируемый текст. Мне потребовался день, чтобы понять, что я вижу.
Таким образом, решение, которое я использовал, состояло в том, чтобы перехватить как touchstart, так и touchend для этих конкретных цветовых элементов. В обоих обработчиках я прекращаю распространение и всплывающие сообщения и возвращаю false. Но в событии touchend я запускаю то же поведение, что и нажатие.
Итак, раньше Safari запускал, как мне кажется, «touchstart», «mousedown», «touchend», «mouseup», «click», и из-за моего кода, выделение текста, в таком порядке.
Новая последовательность из-за перехватов - это просто выделение текста. Все остальное перехватывается до того, как Safari сможет обработать его и выполнить работу с клавиатурой. Перехваты touchstart и touchend также предотвращают запуск событий мыши, и в контексте это вполне нормально.
Я не знаю более простой способ описать это, но я думаю, что важно иметь его здесь, потому что я нашел эту тему в течение часа после первого столкновения с проблемой.
Я на 98% уверен, что то же самое исправление будет работать с полями ввода и всем остальным. Перехватывайте события касания и обрабатывайте их отдельно, не позволяя им распространяться или пузыриться, и подумайте о том, чтобы сделать какие-либо выборки после небольшого тайм-аута, просто чтобы убедиться, что Safari не распознает последовательность как триггер клавиатуры.
источник
Я вижу, что люди здесь делают странные вещи с помощью JavaScript или функции окна просмотра и отключают все масштабирование вручную на устройствах. Это не должно быть решением по моему мнению. Добавление этого фрагмента CSS отключит автоматическое масштабирование в iOS без изменения размера шрифта до фиксированного числа, например 16px.
По умолчанию я использую размер шрифта 93,8% (15 пикселей) в полях ввода и добавляя свой фрагмент кода CSS, он остается на уровне 93,8%. Не нужно менять на 16px или сделать его фиксированным числом.
источник
Установка размера шрифта (для полей ввода), равного размеру шрифта тела, кажется, что мешает браузеру уменьшать или уменьшать масштаб. Я бы предложил использовать
font-size: 1rem
как более элегантное решение.источник
Поскольку автоматическое увеличение (без уменьшения) все еще раздражает iPhone, вот JavaScript, основанный на предложении dlo работать с фокусом / размытием.
Масштабирование отключается, как только ввод текста дублируется и повторно активируется, когда ввод оставлен.
Примечание: некоторые пользователи могут не ценить редактирование текстов при небольшом вводе текста! Поэтому я лично предпочитаю изменять размер текста ввода во время редактирования (см. Код ниже).
Следующий код изменит размер текста ввода до 16 пикселей (рассчитывается, т. Е. В текущем размере масштабирования), когда элемент находится в фокусе. Поэтому iPhone не будет автоматически увеличивать масштаб.
Примечание. Коэффициент масштабирования рассчитывается на основе window.innerWidth и дисплея iPhone с разрешением 320 пикселей. Это будет действительно только для iPhone в портретном режиме.
источник
Мне потребовалось некоторое время, чтобы найти его, но вот лучший код, который я нашел ...... http://nerd.vasilis.nl/prevent-ios-from-zooming-onfocus/
источник
Основываясь на ответе Стивена Уолша ... Этот код работает без изменения размера шрифта для ввода в фокусе (что выглядит неубедительно), плюс он все еще работает с FastClick , который я предлагаю добавить ко всем мобильным сайтам, чтобы помочь придать "мгновенный" эффект. Отрегулируйте «ширину области просмотра» в соответствии с вашими потребностями.
источник
В комментарии к главному ответу об установке размера шрифта в 16px спрашивалось, как это решение, что делать, если вы хотите увеличить / уменьшить шрифт.
Я не знаю всех вас, но использование px для размеров шрифта не лучший способ, вы должны использовать em.
Я столкнулся с этой проблемой на моем адаптивном сайте, где мое текстовое поле больше 16 пикселей. У меня был контейнер формы для 2rem и поле ввода 1.4em. В моих мобильных запросах я изменяю размер шрифта html в зависимости от области просмотра. Поскольку html по умолчанию равен 10, мое поле ввода рассчитывается на 28 пикселей на рабочем столе
Чтобы удалить авто-зум, мне пришлось изменить свой ввод на 1.6em. Это увеличило мой размер шрифта до 32 пикселей. Просто чуть выше и едва заметно. На моем iPhone 4 & 5 я изменяю свой размер шрифта html на 15 пикселей для портрета и обратно на 10 пикселей для ландшафта. Похоже, что лучшим местом для этого размера пикселя было 48 пикселей, поэтому я перешел с 1.4em (42px) на 1.6em (48px).
Все, что вам нужно сделать, это найти нужное место на шрифте, а затем преобразовать его обратно в ваши размеры rem / em.
источник
Вот взлом, который я использовал на одном из моих проектов:
Закончил начальные стили и масштаб, который я хотел, но без фокусировки.
источник