在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个回答

2
这个问题的简单解决方案是:
@media screen and (max-width: 599px) {
  input, select, textarea {
    font-size: 16px;
  }
}

注意: max-width 可根据您的要求进行自定义。


这似乎有效。我不得不使用 font-size: 16px !important; 来覆盖UI组件库设置的其他规则。 - Antoine Weber
很高兴听到这个消息。 - Abhinav Akhil

2

基于Stephen Walsh的回答...这段代码可以在不改变输入焦点时的字体大小(看起来很糟糕)的情况下正常工作,而且它仍然可以与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)
    });

如果用户在单击输入控件之前已经缩放了一点,那么这个解决方案会导致视口突然“取消缩放”吗? - Bruno Torquato
是的,它确实有这个效果,但它看起来并不比以前每次用户点击输入时发生的“缩放”效果更突兀。 - Pete

2

将输入字段的字体大小设置为与页面正文相同的字体大小,似乎可以防止浏览器缩小或放大页面。 我建议使用font-size: 1rem作为更优雅的解决方案。


1
由于iPhone的自动缩放(无法缩小)仍然很烦人,因此这里提供了一种基于dlo建议的JavaScript方法来处理焦点/失焦,从而解决问题。
当文本输入框获得焦点时,禁用缩放;当文本输入框失去焦点时,重新启用缩放。
请注意:有些用户可能不喜欢在小文本输入框中编辑文本!因此,我个人更喜欢在编辑期间更改输入框的文本大小(请参见下面的代码)。
<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>

0

这是我在一个项目中使用的一个技巧:

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

最终得到了我想要的初始样式和比例,但无法在焦点上进行缩放。


0

我花了一些时间才找到它,但这是我找到的最好的代码......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));
});

0

关于将字体大小设置为16像素的顶部答案的评论问如何解决,如果您想要更大/更小的字体。

我不知道你们怎么看,但使用像素作为字体大小并不是最好的选择,应该使用em。

在我的响应式网站上,我的文本字段比16像素大。我将表单容器设置为2rem,将输入字段设置为1.4em。在我的移动查询中,我根据视口更改html字体大小。由于默认的html是10,因此我的输入字段在桌面上计算为28px

为了消除自动缩放,我必须将我的输入更改为1.6em。这将我的字体大小增加到32px。略高且几乎不可见。在我的iPhone 4&5上,我将我的html字体大小更改为15px以进行纵向,并在横向上更改回10px。似乎那个像素大小的最佳点是48px,这就是为什么我从1.4em(42px)更改为1.6em(48px)的原因。

您需要做的事情是找到字体大小的最佳点,然后将其转换回您的rem / em大小。


2
对于未来的读者:没有人应该使用em,因为它会打开潘多拉魔盒。 无论如何,没有人只是改变字体大小而不重新设计页面,因为很多布局都可能被破坏。对于操作系统的增大字体大小,所有浏览器自然地按照16的基础进行缩放,使rem过时了,因为px的行为相同但更容易处理。 否则,您将遇到插件混合使用rem和px的问题。 - Artimus
@Artimus,你的评论“没人应该使用em”是个人观点。如果有人学会正确使用em和rem,那么将网站进行设备适配就更加容易。px和pt是固定的,所以如果你的网站支持响应式设计,你需要针对每个需要修改的字体添加媒体查询。如果你正确使用rem和em,你只需要在html字体大小上添加媒体查询,其他内容会自动适配。 - Jon Tinsman

0
最近在使用Bootstrap 5.3时遇到了一个问题,即包含`.input-group-sm`和`.form-control`的情况。我通过以下纯CSS的解决方法解决了这个问题(没有使用视口或脚本的hack)...
input, textarea {
    font-size: 1rem !important;
}
@media (min-width: 768px) {
    input, textarea {
        font-size: inherit !important;
    }
}

那样的话,字体应该足够大,以避免在小设备上自动缩放。根据需要增加最小宽度媒体断点以适应平板电脑(没有可供测试的)。

-3
请不要使用JavaScript或黑客技术来使其工作。这将影响您在网络上的项目得分。 以下方法可以解决问题:
input, input:active, input:focus, input:focus-within, input:hover, input:visited {
    font-size: 16px!important;
}

4
这不算作弊吗?除非你特别想要所有输入的字体大小为16px,否则这会破坏网站的外观和布局。这根本不是一个合适的解决方案。 - nextgentech
这是一个完美的解决方案。你对我的解决方案的回答有点过早了。首先好好读一下问题。为什么他/她不想要所有输入缩放固定?这不奇怪吗?所以你要在一个页面上解决缩放输入,而在另一个页面上不解决? - Chocoprins18
9
重点是你通过引入另一个问题来“解决”一个问题——被迫让每个输入都使用16像素字体大小。如果您的输入尺寸较小或较大(通常会出现这种情况)怎么办?我的主要批评是你在指责其他人使用“hack”的同时,却强制所有输入使用固定的字体大小来解决这个问题(顺便说一下,这个问题七年前已经被最高评分答案指出)。也许你应该先阅读其他的答案。 - nextgentech

-13

终于成功了!!! 我完成了我的搜索之旅!

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

iPhone OS6Android 2.3.3模拟器上测试过。

我有一个固定宽度为640像素的移动网站,我一直面临着自动缩放的问题。

我尝试了很多解决方案,但没有一个能在iPhone和Android上都起作用!

现在对我来说,禁用缩放是可以的,因为这个网站是移动优先设计的!

这就是我找到它的地方: 如何进行视口大小和缩放以实现跨浏览器支持?


6
这会严重影响视图大小,不允许视力障碍者缩放。我认为这不是一个好的解决方案? - dano
2
是的,这个解决方案通常不太好,因为它固定了视口大小,当你迁移到不同的设备时会导致问题。 - Lucent Fox
不符合标准。 - Usman Arshad

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