问题描述

我做了一个 html 页面,它具有类型为”text” 的<input> 标签。当我使用 iPhone 上的 Safari 点击它时,页面变大 (自动缩放) 。有谁知道如何禁用这个?

最佳解决方案

如果 font-size 小于 16px,则浏览器将缩放,表单元素的默认 font-size 为 11px(至少在 Chrome 和 Safari 中) 。

另外,select 元件需要连接 focus pseudo-class 。

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;
}

没有必要使用上述所有内容,您只需对所需的元素进行样式,例如:仅 textnumbertextarea

input[type='text'],
input[type='number'],
textarea {
  font-size: 16px;
}

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

body {
  font-size: 16px;
}
input[type="text"]
  font-size: inherit;
}

次佳解决方案

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

新功能:IOS 将仍然放大,除非您在输入上使用 16px 而不用焦点。

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

我添加了一个背景,因为 IOS 在选择上添加了任何背景。

第三种解决方案

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

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

这解决了您的移动页面或表单将要到达’float’ 的问题。

第四种方案

总结答案是:将字体大小设置为至少 16px

第五种方案

input[type='text'],textarea {font-size:1em;}

第六种方案

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



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

第七种方案

没有干净的方法我可以找到,但这是一个黑客…

1) 我注意到鼠标悬停事件发生在缩放之前,但缩放发生在 mousedown 或 focus 事件之前。

2) 您可以使用 javascript 动态更改 META 视口标签 (请参阅 Enable/disable zoom on iPhone safari with Javascript?)

所以,尝试这个 (在 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" />');
}

这绝对是一个黑客… 可能有些情况下,鼠标悬停/下拉并不总是抓住入口/出口,但它在我的测试中运行良好,是一个坚实的开始。

第八种方案

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

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

第九种方案

将 user-scalable = 0 添加到视口元素如下

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

为我工作:)

第十种方案

Javascript 是在 iOS 7 上工作的。这是基于 @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" />');
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛