防止iPhone在web应用程序中缩放`select`。

100

我有这段代码:

<select>
    <option value="c">Klassen</option>
    <option value="t">Docenten</option>
    <option value="r">Lokalen</option>
    <option value="s">Leerlingen</option>
</select>

在iPhone上以全屏web应用程序运行。

当从此列表中选择某个内容时,iPhone会放大select元素。并且在选择完内容后不会缩小回去。

我该如何防止这种情况发生?或者缩小回去?

12个回答

118

可能是因为浏览器尝试缩放区域,因为字体大小小于阈值,在iPhone上通常会发生这种情况。

给予meta标签属性"user-scalable=no"将限制用户在其他地方缩放。由于问题仅出现在select元素中,请尝试在您的CSS中使用以下内容,此hack最初用于jquery移动。

HTML:

<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

CSS:

select{
font-size: 50px;
}

源代码:在 iPhone 上选择后取消缩放


21
如果文本是可见的(如我的情况),则似乎16像素是启用缩放之前的最小值。 - Marlon Creative
6
为了更清晰,这行代码将防止自动缩放:$('<meta>', {name: 'viewport',content: 'user-scalable=no'}).appendTo('head'); - Abbas
11
文本隐藏在 select 元素中是从什么时候开始的?“不会带来任何布局问题”。 - Bill
1
@Billy 我的意思是,当字体大小被赋值为50px时,在下拉菜单以外的其他HTML元素上看起来很奇怪,这就是我所说的布局问题。 - Sasi Dhar
1
但是如果你需要允许用户缩放以解决无障碍问题或其他任何原因,请参考下面的答案 https://dev59.com/KWw15IYBdhLWcg3wo9Vx#32884742 - gota
显示剩余9条评论

57

你需要使用user-scalable=no,这样就可以给出这个问题的明确答案了。

<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">

5
实际上,只需添加width=device-width、initial-scale=1.0、maximum-scale=1.0即可。我认为在maximum-scale中不需要使用user-scalable。 - Dan Smart
3
在我的情况下(我不知道它有什么不同),最小/最大比例尺是不够的 - 添加"user-scalable=no"确实发挥了作用。 - corolla
9
这种做法似乎太过强硬 - 我建议谨慎使用 user-scalable=no。来自Dev.Opera的文章中提到:“完全关闭缩放也是可能的,但请记住,缩放是许多人使用的重要辅助功能。因此,仅应在确实有必要时(例如某些类型的游戏和应用程序)才关闭它。” - Charlie Stanard
4
自iOS 10起,user-scalable被忽略。 - nickdnk
1
当您的字体大于16px时,浏览器在聚焦输入时可能会缩小。对我来说,我只需要添加 minimum-scale=1,这也保留了用户缩放的可能性。 - Micros

39

如果文本大小小于16像素,iPhone会略微缩放表单字段。我建议将移动端表单字段的文本设置为16像素,然后在桌面端覆盖尺寸缩小。

对于无障碍/部分视力用户仍可能想在较小的移动设备上进行缩放,因此建议不要禁用缩放。

例如:

# Mobile first
input, textarea, select {
  font-size: 16px;
}

# Tablet upwards
@media (min-width: 768px) {
  font-size: 14px;
}

1
很好!但是如果我的文本超出了选择框的完整宽度怎么办?在这种情况下我该怎么做? - gota
如果您的起始选项信息适合,则应该足够了。因为一旦他们选择了一个选项,即使有点被截断,他们也很可能记得它是什么。但是,如果它说“请选择Co...”,那就更成问题了。 - martinedwards
1
这个答案可行,而且似乎提供了最不显眼的方法。谢谢! - DeBraid

35

这种方法似乎适用于我解决此问题:

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

这里由Christina Arasmo Beymer建议,请参考此处


2
在我的情况下,IOS 7x的旧用户可缩放性不够用。上述方法解决了问题,感谢您的分享。 - landed

9
我来晚了,但我发现一种使用 CSS 操纵解决此问题的非常不错的方法。在我的情况下,由于设计原因,我无法更改字体大小,也无法禁用缩放。
因为 iPhone 在文本设置小于 16 像素时会轻微缩放表单字段,所以我们可以欺骗 iPhone 认为字体大小为 16px,然后将其转换为我们想要的大小。
例如,假设我们的文本大小为14px,因此它会因为小于16px而被缩放。因此,我们可以根据0.875进行比例变换。
在下面的示例中,我添加了填充以显示如何相应转换其他属性。
.no-zoom {
    font-size: 16px;
    transform-origin: top left;
    transform: scale(0.875);            //  14px / 16px
    padding: 4.57px;                    // 4px / 0.875
}

希望这有所帮助!


这是一个不好的但也很聪明的技巧,我不喜欢使用技巧...但在这种情况下,它是这个页面上最好的答案,如果你必须停止缩放并且仍然想保持设计不变,那么没有其他选择。非常感谢! :) - roNn23
在我看来,这是最好的答案。唯一需要注意的是,可能需要调整transform-origin的值(例如,在我的情况下,center是最合适的)。 - undeletable

6

如果iOS浏览器中输入框的字体大小小于16px,则会缩放页面以显示更大的输入框。

只有在点击字段时,它才会缩放页面。因此,我们在单击时将其设置为16px,然后再改回默认值。

下面的代码片段对移动设备有效。

@media screen and (max-width: 767px) {
 select:active, input:active,textarea:active{
        font-size: 16px;
 }
}


3

试试这个:

function DisablePinchZoom() 
{
    $('meta[name=viewport]').attr("content", "");
    $('meta[name=viewport]').attr("content", "width=yourwidth, user-scalable=no");
}

function myFunction() 
{
    $('meta[name=viewport]').attr("content", "width=1047, user-scalable=yes");
}


<select id="cmbYo" onchange="javascript: myFunction();" onclick="javascript: DisablePinchZoom();">
</select>

在触发 onchange 事件之前,将会触发 DisablePinchZoom 事件,因此在 onchange 触发时,缩放将被禁用。在 onchange 函数的结尾处,您可以恢复最初的状态。

已在 iPhone 5S 上测试通过。


1
将所有“select”字体大小设置为16px
选择{ 字体大小:16像素; }

0

我认为你无法单独解决这种行为问题。

你可以尝试的一件事是完全禁止页面缩放。如果你的页面是为手机设计的,这是一个不错的选择。

<meta name="viewport" content="width=device-width" />

你可以尝试使用JavaScript构造而不是通用的“select”语句。创建一个隐藏的div来显示你的菜单,使用JavaScript处理点击事件。

祝你好运!


0

已经花了几个小时阅读这个问题,最好的解决方案是使用这里的jQuery。这也有助于iOS Safari中的“下一个选项卡”选项。我在这里有一些输入,但随意删除或添加。基本上,mousedown事件会在focus事件之前触发,并欺骗浏览器认为它是16像素。此外,focusout将触发“下一个选项卡”功能并重复该过程。

$(function(){
    $('input, select').on("mousedown focusout", function(){
        $('input, select').css('font-size','16px');
    });
    $('input, select').on("focus", function(){
        $('input, select').css('font-size','');
    });
})

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