Отключить функцию автоматического увеличения ввода «Текст» - Safari на iPhone - PullRequest
440 голосов
/ 07 июня 2010

Я создал HTML-страницу с тегом <input> с type="text". Когда я нажимаю на него с помощью Safari на iPhone, страница становится больше (автоматическое увеличение). Кто-нибудь знает, как это отключить?

Ответы [ 30 ]

2 голосов
/ 26 апреля 2015

Установка размера шрифта (для полей ввода), равного размеру шрифта тела, кажется тем, что мешает браузеру уменьшать или уменьшать масштаб. Я бы предложил использовать font-size: 1rem как более элегантное решение.

1 голос
/ 01 августа 2018

Вот хак, который я использовал в одном из моих проектов:

select {
    font-size: 2.6rem; // 1rem = 10px
    ...
    transform-origin: ... ...;
    transform: scale(0.5) ...;
}

Завершено начальными стилями и масштабом, которые я хотел, но без увеличения фокуса.

1 голос
/ 14 июля 2013

Поскольку автоматическое увеличение (без уменьшения) все еще раздражает iPhone, вот JavaScript, основанный на предложении dlo работать с фокусом / размытием.

Масштабирование отключается, как только ввод текста дублируется и повторно активируется, когда ввод остается.

Примечание: Некоторые пользователи могут не ценить редактирование текстов при небольшом вводе текста! Поэтому я лично предпочитаю изменять размер текста ввода во время редактирования (см. Код ниже).

<script type="text/javascript">
<!--
function attachEvent(element, evtId, handler) {
    if (element.addEventListener) {
        element.addEventListener(evtId, handler, false);
    } else if (element.attachEvent) {
        var ieEvtId = "on"+evtId;
        element.attachEvent(ieEvtId, handler);
    } else {
        var legEvtId = "on"+evtId;
        element[legEvtId] = handler;
    }
}
function onBeforeZoom(evt) {
    var viewportmeta = document.querySelector('meta[name="viewport"]');
    if (viewportmeta) {
        viewportmeta.content = "user-scalable=0";
    }
}
function onAfterZoom(evt) {
    var viewportmeta = document.querySelector('meta[name="viewport"]');
    if (viewportmeta) {
        viewportmeta.content = "width=device-width, user-scalable=1";
    }
}
function disableZoom() {
    // Search all relevant input elements and attach zoom-events
    var inputs = document.getElementsByTagName("input");
    for (var i=0; i<inputs.length; i++) {
        attachEvent(inputs[i], "focus", onBeforeZoom);
        attachEvent(inputs[i], "blur", onAfterZoom);
    }
}
if (navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPad/i)) {
    attachEvent(window, "load", disableZoom);
}
// -->
</script>

Следующий код изменит размер текста на входе до 16 пикселей (рассчитывается, т.е. в текущем размере масштабирования), когда элемент находится в фокусе. Поэтому iPhone не будет автоматически увеличивать масштаб.

Примечание: Коэффициент масштабирования рассчитывается на основе window.innerWidth и дисплея iPhone с разрешением 320 пикселей. Это только будет действительным для iPhone в портретном режиме.

<script type="text/javascript">
<!--
function attachEvent(element, evtId, handler) {
    if (element.addEventListener) {
        element.addEventListener(evtId, handler, false);
    } else if (element.attachEvent) {
        var ieEvtId = "on"+evtId;
        element.attachEvent(ieEvtId, handler);
    } else {
        var legEvtId = "on"+evtId;
        element[legEvtId] = handler;
    }
}
function getSender(evt, local) {
    if (!evt) {
        evt = window.event;
    }
    var sender;
    if (evt.srcElement) {
        sender = evt.srcElement;
    } else {
        sender = local;
    }
    return sender;
}
function onBeforeZoom(evt) {
    var zoom = 320 / window.innerWidth;
    var element = getSender(evt);
    element.style.fontSize = Math.ceil(16 / zoom) + "px";
}
function onAfterZoom(evt) {
    var element = getSender(evt);
    element.style.fontSize = "";
}
function disableZoom() {
    // Search all relevant input elements and attach zoom-events
    var inputs = document.getElementsByTagName("input");
    for (var i=0; i<inputs.length; i++) {
        attachEvent(inputs[i], "focus", onBeforeZoom);
        attachEvent(inputs[i], "blur", onAfterZoom);
    }
}
if (navigator.userAgent.match(/iPhone/i)) {
    attachEvent(window, "load", disableZoom);
}
// -->
</script>
1 голос
/ 27 июня 2014

На основании ответа Стивена Уолша ... Этот код работает без изменения размера шрифта для ввода на фокусе (что выглядит неубедительно), плюс он все еще работает с FastClick , который я Предлагаю добавить ко всем мобильным сайтам, чтобы помочь привезти «снаппи». Отрегулируйте «ширину области просмотра» в соответствии со своими потребностями.

// disable autozoom when input is focused
    var $viewportMeta = $('head > meta[name="viewport"]');
    $('input, select, textarea').bind('touchend', function(event) {
        $viewportMeta.attr('content', 'width=640, user-scalable=0');
        setTimeout(function(){ $viewportMeta.attr('content', 'width=640, user-scalable=1'); }, 1)
    });
1 голос
/ 26 мая 2016

Комментарий к верхнему ответу об установке размера шрифта в 16px спросил, как это решение, что, если вы хотите больший / меньший шрифт.

Я не знаю всех вас, но использование px для размеров шрифта не лучший способ, вы должны использовать em.

Я столкнулся с этой проблемой на моем адаптивном сайте, где мое текстовое поле больше 16 пикселей. У меня был контейнер формы для 2rem, а для поля ввода - 1.4em. В моих мобильных запросах я изменяю размер шрифта html в зависимости от области просмотра. Так как html по умолчанию равен 10, мое поле ввода рассчитывается на 28 пикселей на рабочем столе

Чтобы удалить авто-увеличение, мне пришлось изменить свой ввод на 1.6em. Это увеличило мой размер шрифта до 32 пикселей. Просто чуть выше и едва заметно. На моем iPhone 4 & 5 я изменяю свой размер шрифта html на 15px для портрета и обратно на 10px для пейзажа. Похоже, что наилучшим вариантом для этого размера пикселя было 48 пикселей, поэтому я изменил его с 1.4em (42px) на 1.6em (48px).

Что вам нужно сделать, так это найти нужное место на шрифте, а затем преобразовать его обратно в ваши размеры rem / em.

0 голосов
/ 09 декабря 2018

Пожалуйста, не используйте Javascript или хаки, чтобы он работал. Это повлияет на оценку вашего проекта в Интернете.

Это поможет:

input, input:active, input:focus, input:focus-within, input:hover, input:visited {
    font-size: 16px!important;
}
0 голосов
/ 05 ноября 2018

В Angular вы можете использовать директивы для предотвращения увеличения фокуса на устройствах IOS. Нет метатега для сохранения доступности.

import { Directive, ElementRef, HostListener } from '@angular/core';

const MINIMAL_FONT_SIZE_BEFORE_ZOOMING_IN_PX = 16;

@Directive({ selector: '[noZoomiOS]' })

export class NoZoomiOSDirective {
  constructor(private el: ElementRef) {}

@HostListener('focus')
  onFocus() {
    this.setFontSize('');
  }

@HostListener('mousedown')
  onMouseDown() {
    this.setFontSize(`${MINIMAL_FONT_SIZE_BEFORE_ZOOMING_IN_PX}px`);
  }

private setFontSize(size: string) {
  const { fontSize: currentInputFontSize } = window.getComputedStyle(this.el.nativeElement, null);

  if (MINIMAL_FONT_SIZE_BEFORE_ZOOMING_IN_PX <= +currentInputFontSize.match(/\d+/)) {
      return;
   }

  const iOS = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
  iOS 
     && (this.el.nativeElement.style.fontSize = size);
 }
}

Вы можете использовать его вот так <input noZoomiOS > после того, как объявите его в своем *.module.ts

0 голосов
/ 01 ноября 2018

Вместо того, чтобы просто установить размер шрифта в 16px, вы можете:

  1. Стилизовать поле ввода так, чтобы оно было больше, чем предполагалось, позволяя установить логический размер шрифта 16px.
  2. Используйте CSS-преобразование scale() и отрицательные поля, чтобы уменьшить поле ввода до правильного размера.

Например, предположим, что ваше поле вводаИзначально стиль:

input[type="text"] {
    border-radius: 5px;
    font-size: 12px;
    line-height: 20px;
    padding: 5px;
    width: 100%;
}

Если вы увеличите поле, увеличив все размеры на 16/12 = 133,33%, а затем уменьшите с помощью scale() на 12/16 = 75%, поле ввода будет иметьисправьте визуальный размер (и размер шрифта), и фокус не будет увеличен.

Поскольку scale() влияет только на визуальный размер, вам также необходимо добавить отрицательные поля, чтобы уменьшить логический размер поля.

С этим CSS:

input[type="text"] {
    /* enlarge by 16/12 = 133.33% */
    border-radius: 6.666666667px;
    font-size: 16px;
    line-height: 26.666666667px;
    padding: 6.666666667px;
    width: 133.333333333%;

    /* scale down by 12/16 = 75% */
    transform: scale(0.75);
    transform-origin: left top;

    /* remove extra white space */
    margin-bottom: -10px;
    margin-right: -33.333333333%;
}

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

У меня есть запись в блоге, куда я идучуть более подробно, и есть этопример для просмотра HTML:
Нет увеличения изображения в Safari на iPhone, идеальный способ пикселя

0 голосов
/ 14 мая 2014

ЭТО РАБОТАЕТ !!! Я заканчиваю свой поиск ПОИСКА!

<meta name="viewport" content="width=640px, initial-scale=.5, maximum-scale=.5" />

протестировано на iPhone OS6 , Android 2.3.3, эмулятор

У меня есть мобильный веб-сайт с фиксированной шириной 640 пикселей, и я фокусировался на автоматическом увеличении до.

Я пытался выбрать несколько шлюзов, но ни один не работал на iPhone и Android!

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

вот где я нахожу это: Как изменить размер окна просмотра для поддержки нескольких браузеров?

0 голосов
/ 06 июня 2014

Мне понадобилось время, чтобы найти его, но вот лучший код, который я нашел ...... http://nerd.vasilis.nl/prevent-ios-from-zooming-onfocus/

var $viewportMeta = $('meta[name="viewport"]');
$('input, select, textarea').bind('focus blur', function(event) {
$viewportMeta.attr('content', 'width=device-width,initial-scale=1,maximum-scale=' +        (event.type == 'blur' ? 10 : 1));
});
...