禁用输入"文本"标签中的自动缩放 - iPhone上的Safari

Edu*_*gro 479 html iphone zoom html-input mobile-safari

我制作了一个带有<input>标签的HTML页面type="text".当我在iPhone上使用Safari点击它时,页面变大(自动缩放).有人知道如何禁用它吗?

小智 452

如果字体大小小于16px并且表单元素的默认字体大小11px(至少在Chrome和Safari中),浏览器将缩放.

此外,select元素需要附加focus伪类.

input[type="color"],
input[type="date"],
input[type="datetime"],
input[type="datetime-local"],
input[type="email"],
input[type="month"],
input[type="number"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="text"],
input[type="time"],
input[type="url"],
input[type="week"],
select:focus,
textarea {
  font-size: 16px;
}
Run Code Online (Sandbox Code Playgroud)

这是没有必要使用所有的上面,你可以样式你所需要的元素,如:只是text,numbertextarea:

input[type='text'],
input[type='number'],
textarea {
  font-size: 16px;
}
Run Code Online (Sandbox Code Playgroud)

使输入元素继承父样式的替代解决方案:

body {
  font-size: 16px;
}
input[type="text"] {
  font-size: inherit;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不明白,这是怎么回事?如果我想要更小/更大的字体大小怎么办? (119认同)
  • 只是为了得到所有内容:`select,textarea,输入[type ="text"],输入[type ="password"],输入[type ="datetime"],输入[type ="datetime-local"],输入[type ="date"],输入[type ="month"],输入[type ="time"],输入[type ="week"],输入[type ="number"],输入[type ="email" "],输入[type ="url"],输入[type ="search"],输入[type ="tel"],输入[type ="color"] {font-size:16px; }` (78认同)
  • 正确的方法是将元标记更改为:<meta name ="viewport"content ="width = device-width,initial-scale = 1,maximum-scale = 1,user-scalable = 0"/> (41认同)
  • @MilosMatic在大多数情况下可能不是一个好的解决方案,因为它完全阻止用户扩展页面.对您的访客来说可能更烦人. (35认同)
  • @Nic你需要使用`select:focus`.也有同样的问题. (8认同)
  • 我在iOS 7上使用Nic Barbier的风格 - 其中包括`select` - Safari仍然放大到选择.任何的想法? (5认同)
  • 我发现这适用于指定的那些字段,但不是选择字段...任何想法如何实现类似的这些? (4认同)
  • @iamkeir对于选择下拉菜单的问题解决[http://stackoverflow.com/questions/6483425/prevent-iphone-from-zooming-in-on-select-in-web-app] (3认同)
  • "确保页面的视口元素不会阻止浏览器捏缩放,以便可以将页面缩放到200%.应避免使用此元素的用户可扩展和最大比例属性的限制值." https://www.w3.org/TR/mobile-accessibility-mapping/#zoom-magnification (3认同)
  • 这个答案在 7 年前可能有效,但现在不正确。我有一个字体大小为 40px 的 TEXTAREA,Safari 正在我的 iphone 6 上自动缩放它。正确答案是 @daxmacrog (2认同)

dax*_*rog 244

您可以阻止Safari在用户输入期间自动放大文本字段,而不会禁用用户捏缩放的功能.只需添加maximum-scale=1但省略其他答案中建议的用户比例属性.

如果你在一个图层中有一个"浮动"(如果放大),这可能会导致重要的UI元素移出屏幕,这是一个值得的选择.

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

  • 这是2018+解决方案.这就像你的生活取决于它一样. (47认同)
  • 这将破坏android设备的缩放能力 (13认同)
  • @HenrikPetterson这不仅仅是禁用OP指定的自动缩放,它还禁用了缩放缩放.所以我不认为这是2018+解决方案. (7认同)
  • @AndréWerlang这不准确.如答案中清楚所述,此解决方案不会禁用Safari(或Firefox)中的缩放缩放,这是OP所询问的内容.但正如之前的评论所指出的那样,它确实禁用了Android设备和iOS上的Chrome用户缩放功能. (4认同)
  • 关于“maximum-scale=1”是否会令人烦恼地禁用用户捏缩放,存在很多困惑。当 Apple 正确地决定忽略禁用用户捏缩放功能时,这种行为**随着 iOS 10** 发生了变化。好消息是该设置仍然可以防止焦点自动变焦。 (4认同)
  • @daxmacrog,你是对的,但是OP没有提到他是否想要通过允许所需的行为打破机器人.这是我个人采取错误选择的地方.当然,最好指定一下. (3认同)
  • 这不是一个好的答案,甚至谷歌也这么认为:https://web.dev/meta-viewport/?utm_source=lighthouse&amp;utm_medium=devtools (3认同)
  • 今天刚尝试过这个,因为 iPhone 自动缩放太烦人了:这个更改很好地禁用了自动缩放。捏合缩放仍然适用于 iPhone Safari、Edge、Android 浏览器和 PWA。Pinch zom 在 iPhone PWA 安装上不再起作用(这很奇怪,因为这也是 safari?) (3认同)
  • 您可以使用`var iOS = navigator.platform &amp;&amp; /iPad|iPhone|iPod/.test(navigator.platform);`检查浏览器是否在iOS上 (2认同)
  • 因此,iOS上没有适用于Chrome的元解决方案。在所有移动iOS浏览器上,它将自动放大,而在移动Safari上,您可以使用maximum-scale = 1禁用此功能,但是在iOS版Chrome上,它会禁用所有缩放功能(例如在android上),因为Google认为它遵循的标准更好,但是实际上比Safari差,因为它不允许您分别禁用自动缩放和用户缩放。 (2认同)
  • 大多数辅助服务也会抱怨在任何浏览器中禁用缩放 (2认同)
  • 我想我尝试了每一个选项,这是唯一一个可以防止自动缩放并且仍然允许用户缩放的选项。我仍然可以在 Android 设备上缩放,所以也许情况已经改变了。这似乎是最好的解决方案。 (2认同)

Chr*_*ina 221

@media screen and (-webkit-min-device-pixel-ratio:0) { 
  select:focus,
  textarea:focus,
  input:focus {
    font-size: 16px;
    background: #eee;
  }
}
Run Code Online (Sandbox Code Playgroud)

新增功能:IOS仍然可以缩放,除非你在没有焦点的输入上使用16px.

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

我添加了一个背景,因为IOS在select上没有添加背景.

  • 为什么每个人都说16px,但没有人关心为什么它是16px?为什么这么随意?为什么我们必须将表单字段文本大小设置为16px而不是..比如1.8rem或2.5em等?这只是一个来自专有操作系统的愚蠢错误吗? (30认同)
  • @Beebee 100%字体大小为16px,即使不是所有浏览器(桌面也是如此)的默认设置.IOS使用它作为默认值可能因为它是一个舒适的阅读大小.为什么这样设置我没有费心去查,不在乎. (13认同)
  • 这不仅适用于iOS(iphone/ipad/ipod)上的Safari,还适用于Safari/OSX和Chrome(Windows和Mac).因此,如果你试图专门针对iPhone,这将无法正常工作. (9认同)
  • 您应该使用`@supports(-webkit-overflow-scrolling:touch)`而不是使用媒体查询,因为此css功能仅存在于iOS上 (9认同)
  • 使用`@media screen和(-webkit-min-device-pixel-ratio:0)和(max-device-width:1024px)`来限制对iPhone的影响,但在Chrome中查看时不要修改网站. (5认同)
  • 这是一个简单,优雅的解决方案,似乎运作良好.我喜欢向聚焦元素添加背景的提示,因为它有助于使活动字段从其余部分中脱颖而出.谢谢! (2认同)
  • @CiaranPhillips,我认为`:focus` 修饰符的目的是在未选择字段时将字体保持在正常大小。这是一个好主意,但 iOS 8 上的 Safari 仍然为我自动缩放,除非我删除 `:focus` 修饰符。 (2认同)
  • @JamesMoran 自 iOS 13 起,不再支持 `-webkit-overflow-scrolling`。请改用 `@supports (-webkit-touch-callout: none)` (2认同)

Mar*_*ijn 182

如果您的网站设计适合移动设备,则可以决定不允许扩展.

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
Run Code Online (Sandbox Code Playgroud)

这解决了您的移动页面或表单将"浮动"的问题.

  • 技术上正确,但我不同意推理.在正确设计的网站上禁用用户缩放通常仍然是个坏主意. (118认同)
  • 在原生移动应用程序中,您永远不会有机会进行缩放,并且它们工作正常,为什么Web应用程序会有所不同?如果你设置适当的字体大小和行高与明确的对比,你应该没问题. (69认同)
  • 从用户体验的角度来看,禁用用户缩放功能是一种可怕的做法,应该不惜一切代价避免这种做法.能够自由放大是一个基本的辅助功能,是一个永远不会从用户手中夺走的控件. (62认同)
  • 那些使用"在本机应用程序中运行良好"这一论点的人忽视了这样一个事实:精心制作的本机应用程序遵循操作系统级别的可访问性设置,例如文本大小.老年人和视力不佳的用户可以并且确实使用极大的操作系统范围的字体,因为他们*需要*.Web应用程序通常不会或不能遵循此设置,因此允许Web浏览器的内置辅助功能(如缩放)至关重要.无论你认为什么是完全可读的,相信我,有些人会发现它不够清楚.如果您重视可用性,请*不*从用户那里取消此选项. (37认同)
  • "设计得当"非常主观.考虑一个完全响应的站点顶部的固定的50px标头,它应该适用于所有浏览器.放大iOS Safari打破了标题定位,几乎打破了整个网站. (20认同)
  • 正确设计意味着您已经以在移动设备(主要是电话)上可读的方式处理所有html(文本)和设计元素.如果正确完成此操作,则无需允许缩放访问者并避免缩放/缩放时的所有意外行为. (2认同)
  • 这只是一种意见,禁用用户滚动很重要.只要您的网站有效,可读等,那么您就可以了.原生的moble应用程序不允许您放大,一般来说,只要您的应用程序构建良好,大多数人都不需要此功能. (2认同)
  • @jotav https://xkcd.com/1174/无法缩放是我避免移动应用程序的众多原因之一. (2认同)
  • “确保浏览器捏缩放不会被页面的视口元元素阻止,以便它可用于将页面缩放到 200%。应避免使用此元元素的用户可缩放和最大缩放属性的限制值。” https://www.w3.org/TR/mobile-accessibility-mapping/#zoom-magnification (2认同)

Nik*_*Nik 70

总之,答案是:将表单元素的字体大小设置为至少16px

  • 最佳做法是在body,button,input,textarea和select元素上声明100%.这允许用户设置默认值,而不是浏览器附带的16px.在屏幕上阅读有问题的人可能会将其默认值设置为18px或20px.你不想通过强制16px来覆盖他们的选择.然而,当谈到iOS时,他们决定扩大他们的HIG所说的太小的任何价值.不幸的是,它似乎没有解释100%的价值,所以我们坚持在默认情况下添加以安抚它. (7认同)

sto*_*per 34

input[type='text'],textarea {font-size:1em;}
Run Code Online (Sandbox Code Playgroud)

  • 这仅适用于您的正文字体大小是默认值(未指定,或"1em"或"100%").如果设置自定义字体大小,可以将代码段中的"font-size"设置为"16px"以避免自动缩放. (18认同)
  • 请注意,将user-scalable设置为no将禁用所有缩放,这可能是个坏主意. (3认同)
  • “ 1em”和“ 1rem”都不是正确的解决方案,因为两者都不能小于“ 16px”,而Safari至少需要“ 16px”才能缩放。 (2认同)
  • 我使用了视口解决方案,但是它不起作用,16px解决方案可以正常工作,但是对于我网站的输入框来说16px太大了,有没有第三种解决方案 (2认同)

Mil*_*tic 20

解决此问题的正确方法是将元视口更改为:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
Run Code Online (Sandbox Code Playgroud)

  • 这不一定是防止此行为的"正确"方法.如果文本太小而无法阅读,则Mobile Safari会放大.一起关闭缩放是很重要的,并且阻止用户以他们可能期望的方式与您的页面进行交互. (30认同)
  • 显然在iOS10中,Apple将最大规模的属性更改为不再受到尊重,允许所有站点放大,无论其设置如何. (3认同)
  • 这适用于iOS10 20/September/2016版本...至少适用于我的应用程序...谢谢!在我使用<meta name ="viewport"content ="width = device-width,initial-scale = 1,**minimum-scale = 1**,maximum-scale = 1">之前我把它切换到了行在响应和它工作... (3认同)
  • 这实际上为我工作。谢谢! (2认同)
  • “确保浏览器捏缩放不会被页面的视口元元素阻止,以便它可用于将页面缩放到 200%。应避免使用此元元素的用户可缩放和最大缩放属性的限制值。” https://www.w3.org/TR/mobile-accessibility-mapping/#zoom-magnification (2认同)

dlo*_*dlo 16

我找不到干净的方式,但是这里有一个黑客......

1)我注意到鼠标悬停事件发生在缩放之前,但是缩放发生在mousedown或焦点事件之前.

2)您可以使用javascript动态更改META视口标记(请参阅使用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" />');
}
Run Code Online (Sandbox Code Playgroud)

这绝对是一个黑客......可能存在鼠标悬停/下降并不总是捕获进入/退出的情况,但它在我的测试中运行良好并且是一个可靠的开始.

  • 不确定Safari行为何时可能已更改,但现在(iOS6.0.1)mousedown正在自动缩放之前发生.因此,在我之前的解决方案中,缩放过早地重新启用.我没有提出足够的修复,因为我现在尝试的所有事件都发生在缩放之前.您可以在keydown或blur上重新启用缩放,但有些情况可能会错过(例如,如果用户想要在开始键入任何内容之前手动缩放). (5认同)
  • 这似乎不再起作用了,iOS6 :( (3认同)

pio*_*ouM 14

我最近(今天:D)不得不整合这种行为.为了不影响原始设计领域,包括组合,我选择在该领域的重点应用转换:

input[type="text"]:focus, input[type="password"]:focus,
textarea:focus, select:focus {
  font-size: 16px;
}
Run Code Online (Sandbox Code Playgroud)


小智 13

user-scalable = 0添加到viewport meta,如下所示

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
Run Code Online (Sandbox Code Playgroud)

为我工作:)

  • "确保页面的视口元素不会阻止浏览器捏缩放,以便可以将页面缩放到200%.应避免使用此元素的用户可扩展和最大比例属性的限制值." https://www.w3.org/TR/mobile-accessibility-mapping/#zoom-magnification (10认同)
  • 这打破了W3定义的可访问性规则. (8认同)

Mel*_*igy 13

受到@jirikuchta 回答的启发,我通过添加以下 CSS 解决了这个问题:

#myTextArea:active {
  font-size: 16px; /* `16px` is safer I assume, although `1rem` works too */
}
Run Code Online (Sandbox Code Playgroud)

没有 JS,我没有注意到任何闪光或任何东西。

值得注意的是,viewportwithmaximum-scale=1也可以工作,但当页面作为 iframe 加载时,或者如果您有其他脚本修改viewport.


Jef*_* To 12

不是简单地将字体大小设置为 16px,您可以:

  1. 设置输入字段的样式,使其大于其预期大小,允许将逻辑字体大小设置为 16px。
  2. 使用scale()CSS 转换和负边距将输入字段缩小到正确的大小。

例如,假设您的输入字段最初的样式为:

input[type="text"] {
    border-radius: 5px;
    font-size: 12px;
    line-height: 20px;
    padding: 5px;
    width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

如果通过将所有尺寸增加 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%;
}
Run Code Online (Sandbox Code Playgroud)

输入字段的逻辑字体大小为 16 像素,同时显示为 12 像素的文本。

我有一篇博客文章,我在其中详细介绍了一些细节,并将此示例作为可查看的 HTML:
在 iPhone 上的 Safari 中没有输入缩放,像素完美的方式


Ame*_*tak 10

我查看了多个答案。\

  1. maximum-scale=1在标签中进行设置的答案meta在 iOS 设备上运行良好,但在 Android 设备上禁用捏合缩放功能。
  2. 有设置的那个font-size: 16px; onfocus对我来说太老套了。

所以我写了一个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";
Run Code Online (Sandbox Code Playgroud)


jon*_*bbs 9

2021年解决方案...

好吧,我已经阅读了所有旧答案,但没有一个对我有用。经过几个小时的尝试不同的事情后,最终的解决方案似乎很简单。

input{
    transform: scale(0.875);
    transform-origin: left center;
    margin-right: -14.28%;
}
Run Code Online (Sandbox Code Playgroud)

在 PC 上的 iOS/Android/Chrome 上测试

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

我的输入的父级设置为“display:flex”,并且它会增长以适合父级,因为它具有“flex: 1 1 auto”。您可能需要,也可能不需要,但为了完整性,我将其包括在内。


小智 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" />');
} 
Run Code Online (Sandbox Code Playgroud)


lor*_*chi 8

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

@supports (-webkit-overflow-scrolling: touch) {
   input {
     font-size: 16px;
   }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

这对我有用:

input, textarea {
    font-size: initial;
}
Run Code Online (Sandbox Code Playgroud)


小智 7

我使用了上面的Christina解决方案,但对引导程序进行了少量修改,并将另一条规则应用于台式计算机.Bootstrap的默认字体大小为14px,导致缩放.对于Bootstrap中的"表单控件",以下内容将其更改为16px,从而阻止了缩放.

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

对于非移动浏览器,返回14px.

@media (min-width: 768px) {
  .form-control {
    font-size: 14px;
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用.form-control:focus,它将它保持在14px,除了焦点,它将其更改为16px并且它没有修复iOS8的缩放问题.至少在使用iOS8的我的iPhone上,字体大小必须是16px才能让iPhone无法缩放页面.


小智 7

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

/* Prevent zoom */
select, input, textarea {
  font-size: 16px;
}
Run Code Online (Sandbox Code Playgroud)

值得一提的是,对于诸如 Tachyons.css 之类的 CSS 库,很容易意外覆盖您的字体大小。

例如 class:f5相当于: fontSize: 1rem,如果您将正文字体比例保持在默认值,这很好。

但是:如果您选择字体大小等级:f6这将等同于fontSize: .875rem向上的小显示器。在这种情况下,您需要更具体地了解您的重置声明:


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

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

/* not small */

}

Run Code Online (Sandbox Code Playgroud)


Nic*_*zey 6

我也用jQuery做了这个:

$('input[type=search]').on('focus', function(){
  // replace CSS font-size with 16px to disable auto zoom on iOS
  $(this).data('fontSize', $(this).css('font-size')).css('font-size', '16px');
}).on('blur', function(){
  // put back the CSS font-size
  $(this).css('font-size', $(this).data('fontSize'));
});
Run Code Online (Sandbox Code Playgroud)

当然,如果此16px字体大小破坏了设计,则可能必须调整界面中的某些其他元素.

  • 这很优雅.这是stylin'.我没有双关语.聪明的方法. (4认同)

jir*_*hta 6

经过一段时间的尝试,我想出了这个解决方案

// set font-size to 16px to prevent zoom 
input.addEventListener("mousedown", function (e) {
  e.target.style.fontSize = "16px";
});

// change font-size back to its initial value so the design will not break
input.addEventListener("focus", function (e) {
  e.target.style.fontSize = "";
});
Run Code Online (Sandbox Code Playgroud)

在“ mousedown”上,它将输入的字体大小设置为16px。这将阻止缩放。发生焦点事件时,它将字体大小改回初始值。

与以前发布的解决方案不同,这将使您可以将输入的字体大小设置为所需的大小。


l3b*_*bel 6

在阅读了这里的几乎每一行并测试了各种解决方案之后,感谢所有分享他们的解决方案的人,这是我在 iPhone 7 iOS 10.x 上提出、测试和为我工作的内容:

@media screen and (-webkit-min-device-pixel-ratio:0) {
    input[type="email"]:hover,
    input[type="number"]:hover,
    input[type="search"]:hover,
    input[type="text"]:hover,
    input[type="tel"]:hover,
    input[type="url"]:hover,
    input[type="password"]:hover,
    textarea:hover,
    select:hover{font-size: initial;}
}
@media (min-width: 768px) {
    input[type="email"]:hover,
    input[type="number"]:hover,
    input[type="search"]:hover,
    input[type="text"]:hover,
    input[type="tel"]:hover,
    input[type="url"]:hover,
    input[type="password"]:hover,
    textarea:hover,
    select:hover{font-size: inherit;}
}
Run Code Online (Sandbox Code Playgroud)

但是,它有一些缺点,由于在“悬停”状态和“焦点”状态之间发生快速字体大小变化而导致“跳跃”明显 - 以及重绘对性能的影响


Rou*_*ica 6

用于(hover: none) and (pointer: coarse)定位所有触摸屏设备:

这里的许多答案都诉诸于部署JavaScriptjQuery

但它应该(而且确实)完全有可能用CSS来控制条件字体呈现之类的问题。


Safari Mobile 要求(有充分的理由)任何表单元素在交互时必须具有最小字体大小16px(或视觉等效值)。

让我们致力于让深思熟虑的用户体验适用于所有触摸屏浏览器。

那么我们可以采用以下方法:

@media only screen and (hover: none) and (pointer: coarse) {

  input,
  select,
  textarea {
    font-size: 11px;
  }

  input:focus,
  select:focus,
  textarea:focus {
    font-size: 16px;
  }
}
Run Code Online (Sandbox Code Playgroud)

结果

使用触摸屏设备时,当上面的任何交互式表单元素获得焦点时,font-size该表单元素的 会暂时设置为16px

这反过来会禁用 iOS Safari Mobile auto-zoom

用户启动的捏合缩放在所有设备上均不受影响,并且永远不会被禁用。


Oli*_*Ash 5

正如许多其他答案已经指出的那样,这可以通过添加maximum-scale到meta viewport标签来实现。然而,这具有在Android设备上禁用用户缩放的负面影响。(从v10开始,它不会禁用iOS设备上的用户缩放。)

当设备为iOS时,我们可以使用JavaScript动态添加maximum-scale到元数据viewport。这实现了两全其美:我们允许用户缩放阻止iOS缩放到焦点上的文本字段。

| maximum-scale             | iOS: can zoom | iOS: no text field zoom | Android: can zoom |
| ------------------------- | ------------- | ----------------------- | ----------------- |
| yes                       | yes           | yes                     | no                |
| no                        | yes           | no                      | yes               |
| yes on iOS, no on Android | yes           | yes                     | yes               |
Run Code Online (Sandbox Code Playgroud)

码:

const addMaximumScaleToMetaViewport = () => {
  const el = document.querySelector('meta[name=viewport]');

  if (el !== null) {
    let content = el.getAttribute('content');
    let re = /maximum\-scale=[0-9\.]+/g;

    if (re.test(content)) {
        content = content.replace(re, 'maximum-scale=1.0');
    } else {
        content = [content, 'maximum-scale=1.0'].join(', ')
    }

    el.setAttribute('content', content);
  }
};

const disableIosTextFieldZoom = addMaximumScaleToMetaViewport;

// /sf/ask/632703781/#9039885
const checkIsIOS = () =>
  /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;

if (checkIsIOS()) {
  disableIosTextFieldZoom();
}
Run Code Online (Sandbox Code Playgroud)

  • 截至目前 2021 年的最佳解决方案(带有一些排列好的代码) (6认同)