在iPhone上的Safari浏览器中禁用“文本”标签的自动缩放

863

我制作了一个包含 <input> 标签以及 type="text" 属性的 HTML 页面。当我在 iPhone 上使用 Safari 点击它时,页面会变大(自动缩放)。有人知道如何禁用此功能吗?


11
所有使用 Twitter Bootstrap 的用户注意:还可以参考这个 Github 问题 - Jeroen
78
我发誓,苹果公司是有意制造这些反功能来搞乱我们的思维。 - Andrew Koster
12
@AndrewKoster,即使到了2020年,我仍然同意你的观点。 - Ashok
13
2020年8月,我再次来到这里,希望能在回答中得到奇迹。明年再见。我要吃一个苹果。 - Marc
14
iOS 是下一个 IE。 - step
显示剩余4条评论
40个回答

17

我没有找到什么简单干净的方法,但这里有一个hack...

1) 我注意到mouseover事件会在缩放之前发生,但缩放会在mousedown或focus事件之前发生。

2) 您可以使用javascript动态更改META viewport标签(参见在JavaScript中启用/禁用iPhone Safari上的缩放?

因此,请尝试这样做(以jquery显示为紧凑):

$("input[type=text], textarea").mouseover(zoomDisable).mousedown(zoomEnable);
function zoomDisable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="user-scalable=0" />');
}
function zoomEnable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="user-scalable=1" />');
}

这绝对是一种hack方法...可能会有一些情况下mouseover / down不能始终捕捉到进入/退出,但在我的测试中表现良好并且是一个坚实的开始。


5
不确定Safari的行为何时发生了改变,但现在(iOS6.0.1)自动缩放之前会发生mousedown事件。因此,在我的先前解决方案中,缩放被重新启用得太早了。我还没有想出一个足够好的修复方法,因为我尝试过的所有事件都是在缩放之前发生的。你可以在keydown或blur事件上重新启用缩放,但在某些情况下这可能会错过一些场景(例如用户在开始键入任何内容之前想要手动缩放)。 - dlo

16

这对我在iOS Safari和Chrome上都有效。对于输入选择器,可以将类或ID设置为包含当前选择器。

@supports (-webkit-overflow-scrolling: touch) {
   input {
     font-size: 16px;
   }
}

1
它有帮助,但是怎么帮助呢? - Fikret
对我也管用。我只是将它粘贴到了index.css中,嘭,iOS缩放不再卡顿了。 - FBB

14

我最近(今天:D)不得不集成这个功能。为了不影响原始设计字段,包括组合框,我选择在字段的焦点应用转换:

input[type="text"]:focus, input[type="password"]:focus,
textarea:focus, select:focus {
  font-size: 16px;
}

FYI,这在我的iOS 6版本的iPhone 5上运行良好,但在iOS 5版本的iPhone 4上以纵向模式运行时,焦点样式是在缩放后应用的。可能有一些微妙的事情发生,我没有进一步调查。 - Vish
我只想说我有很多不同的查询,使用缩放可以加快开发速度,取决于您缩放的程度,将决定您需要多大的字体大小。我相信这对程序开发非常有帮助。 - mike
:focus 在我的 iOS 10.2 iPhone 6 上无效,但 input[type="text"]:hover 却可以正常工作。 - Amirhossein Rzd

13

将以下内容添加到视口 meta 中:user-scalable=0

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

对我很有效 :)


16
确保网页的视口元素不会阻止浏览器的捏合缩放功能,以便将页面缩放至200%。应避免在该元素的user-scalable和maximum-scale属性中使用限制性数值。 - danielnixon
12
这违反了 W3 定义的无障碍规则。 - Joshua Russell
对我来说很有效,而且这对我来说是最好的解决方案,因为我想要自由地更改小于16px的输入字体大小,而不想使用JS hack。 - Blue Bot

10

我查看了多个答案。

  1. meta 标签中设置 maximum-scale=1 的答案可以在 iOS 设备上正常工作,但会禁用 Android 设备上的缩放功能。
  2. onfocus 上设置 font-size: 16px; 的答案对我来说太过于hacky.

因此,我编写了一个JS函数来动态更改 meta 标签。

var iOS = navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
if (iOS)
    document.head.querySelector('meta[name="viewport"]').content = "width=device-width, initial-scale=1, maximum-scale=1";
else
    document.head.querySelector('meta[name="viewport"]').content = "width=device-width, initial-scale=1";

9

2021年的解决方案...

好的,我已经阅读了所有旧答案,但它们都没有对我起作用。经过多个小时尝试不同的方法,最终解决方案似乎很简单。

input{
    transform: scale(0.875);
    transform-origin: left center;
    margin-right: -14.28%;
}

已测试在iOS/Android/电脑Chrome上

这使您能够使用14像素字体,如果您需要不同的大小,则缩放因子是14/16 = 0.875,负边距为(1-0.875)/ 0.875 * 100

我的输入父元素设置为"display:flex"并且它会根据父元素增长,因为它具有"flex: 1 1 auto"。可能需要也可能不需要,但我包含它以完整起见。


8
这对我有用:

这对我有用:

input, textarea {
    font-size: initial;
}

简单明了,但有没有办法控制那个“初始”大小? - 2540625
我还没有测试过,但这应该是一种控制字体大小的方法。(如果有效,请告诉我,我会更新我的答案)body { font-size: 20px; }input { font-size: inherit; } - user1000952

8

这是在iOS 7上有效的Javascript hack。它基于@dlo的回答,但将mouseover和mouseout事件替换为touchstart和touchend事件。基本上,该脚本在启用缩放之前添加了半秒延迟,以防止缩放。

$("input[type=text], textarea").on({ 'touchstart' : function() {
    zoomDisable();
}});
$("input[type=text], textarea").on({ 'touchend' : function() {
    setTimeout(zoomEnable, 500);
}});

function zoomDisable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0" />');
}
function zoomEnable(){
  $('head meta[name=viewport]').remove();
  $('head').prepend('<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=1" />');
} 

这对我来说效果最好。但是,我将touchstart/touchend事件更改为一个具有zoomDisable和zoomEnable的“focus”事件。 - Justin Elkow
在较新版本的iOS上添加延迟似乎效果不错,但有趣的是,当设置为250毫秒时,它并不起作用。这暗示在某些情况下,500毫秒也可能无法正常工作,但如果大部分时间都能正常工作,那么我想这比完全不工作要好。思路很好。 - dlo

8

我使用了Christina上面的解决方案,但是对于Bootstrap进行了一些小修改,并添加了另一个规则以适用于桌面电脑。Bootstrap的默认字体大小为14px,这会导致缩放。以下更改将其更改为16px,适用于Bootstrap中的“表单控件”,从而防止缩放。

@media screen and (-webkit-min-device-pixel-ratio:0) {
  .form-control {
    font-size: 16px;
  }
}

非移动浏览器的字体大小将恢复到14像素。

@media (min-width: 768px) {
  .form-control {
    font-size: 14px;
  }
}

我尝试使用.form-control:focus,这将使其保持在14px,除了在焦点上会更改为16px,但它并没有解决iOS8放大的问题。至少在我的iPhone上使用iOS8,字体大小必须在聚焦之前为16px,才能避免iPhone缩放页面。


7

伪类如:focus不再像以前那样工作。从iOS 11开始,可以在主要样式之前添加一个简单的重置声明(前提是您没有用较小的字体大小覆盖它们)。

/* Prevent zoom */
select, input, textarea {
  font-size: 16px;
}

值得提到的是,对于像Tachyons.css这样的CSS库,很容易意外覆盖您的字体大小。

例如类:f5 等同于:fontSize: 1rem,如果您保持默认的body字体规模,则没有问题。

然而:如果您选择字体大小类:f6,则在小屏幕以上会等同于 fontSize: .875rem。在这种情况下,您需要更具体地声明重置:


  /* Prevent zoom */
  select, input, textarea {
    font-size: 16px!important;
  }

@media screen and (min-width: 30em) {

/* not small */

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接