Запретить iPhone увеличивать масштаб при выборе в веб-приложении


86

У меня есть такой код:

<select>
    <option value="c">Klassen</option>
    <option value="t">Docenten</option>
    <option value="r">Lokalen</option>
    <option value="s">Leerlingen</option>
</select>

Запуск в полноэкранном веб-приложении на iPhone.

При выборе чего-либо из этого списка iPhone приближает selectэлемент -элемент. И не уменьшает масштаб после выбора чего-либо.

Как я могу предотвратить это? Или уменьшить масштаб?

Ответы:


107

Вероятно, это связано с тем, что браузер пытается увеличить область, поскольку размер шрифта меньше порогового значения, обычно это происходит на iphone.

Присвоение атрибута метатега «user-scalable = no» ограничивает возможность масштабирования в другом месте. Поскольку проблема заключается только в элементе select , попробуйте использовать в своем CSS следующее, этот хак изначально использовался для jquery mobile.

HTML:

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

CSS:

select{
font-size: 50px;
}

src: уменьшить масштаб после выбора в iphone


21
Если текст виден (как в моем случае), кажется, что 16 пикселей - это минимум, прежде чем он включит масштабирование.
Marlon Creative

6
Чтобы было понятнее, эта строка предотвратит автомасштабирование:$('<meta>', {name: 'viewport',content: 'user-scalable=no'}).appendTo('head');
Аббас

11
С каких это пор текст скрыт в элементе выбора ?? «Не принесет никаких проблем с макетом»
Билл

1
@Billy Я хочу сказать, когда font-size имеет значение 50 пикселей, это выглядит странно на других элементах html, кроме раскрывающегося списка, что я назвал проблемой макета.
Sasi Dhar

1
Но если вам нужно разрешить масштабирование пользователем для проблем доступности или по любой другой причине, см. Ответ ниже stackoverflow.com/questions/6483425/…
gota

53

user-scaleable = no - это то, что вам нужно, так что на этот вопрос есть окончательный ответ

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

4
На самом деле, добавления width = device-width, initial-scale = 1.0, maximum-scale = 1.0 должно быть достаточно. Я не верю, что вам нужна масштабируемость пользователя с максимальным масштабом.
Дэн Смарт

2
@DanSmart, по крайней мере, в моем случае (и я не знаю, что его отличает), минимального / максимального масштаба было недостаточно - добавление user-scaleable = no имело значение.
corolla

8
Это кажется очень жестким подходом - я рекомендую с осторожностью использовать user-scaleable = no. От Dev.Opera : «Также можно полностью отключить масштабирование, однако имейте в виду, что масштабирование является важной функцией доступности, которая используется многими людьми. Поэтому отключение этого должно происходить только тогда, когда это действительно необходимо, например, для определенные типы игр и приложений ".
Чарли Стэнард

4
user-scalable игнорируется в iOS 10.
nickdnk

1
Если размер шрифта превышает 16 пикселей, браузер может уменьшить масштаб при фокусировке ввода. Мне нужно было только добавить minimum-scale=1, что также сохраняет возможность масштабирования пользователя.
Micros

33

В моем случае это сработало при решении этой проблемы:

@media screen and (-webkit-min-device-pixel-ratio: 0) {
select:focus, textarea:focus, input:focus {
        font-size: 16px;
    }
}

Предлагаемый здесь по Кристина Arasmo Beymer


2
В моем случае IOS 7x старого масштабируемого пользователем было недостаточно. Вышеупомянутое помогло, спасибо, что поделились.
приземлился

27

iPhone будет немного увеличивать поля формы, если размер текста меньше 16 пикселей . Я бы предложил установить текст поля мобильной формы на 16 пикселей, а затем переопределить размер обратно для рабочего стола.

Ответы об отключении масштабирования бесполезны для слабовидящих пользователей, которые все еще могут захотеть увеличить масштаб на небольших мобильных устройствах.

Пример:

# Mobile first
input, textarea, select {
  font-size: 16px;
}

# Tablet upwards
@media (min-width: 768px) {
  font-size: 14px;
}

Это хорошо! Но что, если мой текст выходит за всю ширину поля выбора? Что мне делать в таком случае?
gota

Если ваше начальное сообщение о вариантах подходит, этого должно быть достаточно. Как только они выбрали вариант, даже если он немного усечен, они, вероятно, запомнят, что это было. Но да, большая проблема, если там написано «Пожалуйста, выберите
компанию

Этот ответ работает и, кажется, предлагает наименее навязчивый метод. Благодаря!
DeBraid

6

Я немного опоздал на вечеринку, но я нашел довольно изящный обходной путь, который решает эту проблему только с помощью манипуляций css. В моем случае я не мог изменить размер шрифта по причинам дизайна, а также не мог отключить масштабирование.

Поскольку iPhone будет немного увеличивать поля формы, если размер текста меньше 16 пикселей, мы можем обмануть iPhone, чтобы он подумал, что размер шрифта составляет 16 пикселей, а затем преобразовать его в наш размер.

Например, давайте возьмем пример, когда наш текст имеет размер 14 пикселей, поэтому он увеличивается, потому что он меньше 16 пикселей. Следовательно, мы можем преобразовать масштаб согласно 0,875.

В следующем примере я добавил отступ, чтобы показать, как соответствующим образом преобразовать другие свойства.

.no-zoom {
    font-size: 16px;
    transform-origin: top left;
    transform: scale(0.875);            //  14px / 16px
    padding: 4.57px;                    // 4px / 0.875
}

Я надеюсь, что это помогает!


Это неприятный, но также умный хакер, и я не люблю хаки ... но в данном случае это лучший ответ на этой странице, и нет альтернативы, если вам нужно остановить масштабирование, но все же вы хотите сохранить дизайн, как есть . Большое спасибо! :)
roNn23

2

Попробуй это:

function DisablePinchZoom() 
{
    $('meta[name=viewport]').attr("content", "");
    $('meta[name=viewport]').attr("content", "width=yourwidth, user-scalable=no");
}

function myFunction() 
{
    $('meta[name=viewport]').attr("content", "width=1047, user-scalable=yes");
}


<select id="cmbYo" onchange="javascript: myFunction();" onclick="javascript: DisablePinchZoom();">
</select>

DisablePinchZoom будет запущен перед onchange, поэтому масштабирование будет отключено во время запуска onchange. На функции onchange в конце вы можете восстановить исходную ситуацию.

Проверено на iPhone 5S


2

iOS масштабирует страницу, чтобы отобразить поле ввода большего размера, если его размер шрифта меньше 16 пикселей.

только При щелчке по любому полю страница масштабируется. поэтому при нажатии мы делаем его как 16 пикселей, а затем меняем на значение по умолчанию

нижеприведенный фрагмент мне подходит и ориентирован на мобильные устройства,

@media screen and (max-width: 767px) {
 select:active, input:active,textarea:active{
        font-size: 16px;
 }
}



0

Я не думаю, что вы ничего не можете сделать с поведением в одиночку.

Одна вещь, которую вы можете попробовать, - это вообще не допускать масштабирования страницы. Это хорошо, если ваша страничка рассчитана на телефон.

<meta name="viewport" content="width=device-width" />

Еще вы можете попробовать использовать конструкцию JavaScript вместо общего оператора select. Создайте скрытый div для отображения вашего меню, обработайте клики в javascript.

Удачи!


0

Как ответил здесь: Отключить автоматическое масштабирование тега ввода «Текст» - Safari на iPhone

Вы можете запретить Safari автоматически увеличивать масштаб текстовых полей во время ввода данных пользователем. не отключая возможность масштабирования с помощью щипка. Просто добавьmaximum-scale=1 но не учитывайте атрибут масштаба пользователя, предложенный в других ответах.

Это полезный вариант, если у вас есть форма в слое, которая «плавает» вокруг при увеличении, что может привести к смещению важных элементов пользовательского интерфейса за пределы экрана.

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


0

Попробуйте добавить этот CSS, чтобы отключить стиль iOS по умолчанию:

-webkit-appearance: none;

Это также будет работать с другими элементами, получившими особый стиль, например input [type = search].


0

Я читал об этом несколько часов, и лучшим решением является этот jquery здесь. Это также помогает с опцией «следующая вкладка» в iOS Safari. У меня здесь тоже есть вводные, но вы можете их удалить или добавить по своему усмотрению. По сути, mousedown срабатывает перед событием focus и заставляет браузер думать, что это 16 пикселей. Вдобавок фокусировка сработает на функции «следующая вкладка» и процесс повторится.

$(function(){
    $('input, select').on("mousedown focusout", function(){
        $('input, select').css('font-size','16px');
    });
    $('input, select').on("focus", function(){
        $('input, select').css('font-size','');
    });
})
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.