禁用 iOS 10+ Safari 上的视口缩放?

186

我已经将我的iPhone 6 Plus 升级到 iOS 10 beta 版本,发现在移动版 Safari 中,您可以通过双击或缩放的方式缩放任何网页,忽略 meta 标签中的 user-scalable=no 代码。我不知道这是一个错误还是功能。如果它被认为是一个功能,我们如何在iOS 10 Safari中禁用视口缩放?


更新至 iOS 11/12 版本后,iOS 11和iOS 12 Safari仍然不遵守 user-scalable=no meta标签。

Safari上的移动 GitHub 网站


4
一个无障碍功能:值得注意的是,在iOS 10上的Safari浏览器中 http://twitter.com/thomasfuchs/status/742531231007559680/photo/1 - ErikE
107
不是这样的。对于普通网页内容来说,这是一种不好的做法。对于Web应用程序而言,默认的缩放行为可能会完全破坏可用性。例如,没有人想要因为误点两次按键而放大“频道上移”按钮,也没有人想要因为误点跳跃按钮两次而放大视频游戏的某个部分。添加此功能有其原因,因此仅仅因为某些“网站设计师”不知道自己在做什么就让所有用户遭受可用性问题是毫无意义的。去抱怨网站设计师,并停止破坏浏览器。 - dgatwood
64
称这是“不好的做法”是一种观点,但这并不能改变苹果公司坚持采取跨平台实施数月/数年/数十年的网络标准并对其进行大规模破坏的事实。为什么苹果应该决定网页设计师不知道自己在做什么?这是一个很糟糕的论点。 - samrap
2
我个人认为,这源于在线样板代码,开发人员盲目复制粘贴而不知道代码的目的。 - William Isted
11
答案很简单,苹果:将禁用元标记设置为默认关闭的无障碍功能。那些需要它的人将拥有它,而不会惩罚那些不需要它的人。 - Ruben Martinez Jr.
显示剩余4条评论
19个回答

6

我尝试了之前有关捏合缩放的答案

document.documentElement.addEventListener('touchstart', function (event) {
    if (event.touches.length > 1) {
        event.preventDefault();
    }
}, false);

然而有时候当 event.touches.length > 1 时屏幕仍会缩放。

我发现最好的方法是使用 touchmove 事件,避免手指在屏幕上移动。代码将类似于以下内容:

document.documentElement.addEventListener('touchmove', function (event) {
    event.preventDefault();      
}, false);

希望这能有所帮助。

7
只有当您的应用程序完美匹配时,此方法才有效... 如果您具有可滚动的内容,则无法使用此方法... 对于某些情况仍是不错的技巧。 - eljamz
8
这甚至禁用了网站的滚动... 糟糕。 - Gags
@eljamz 谢谢你让我知道了,是的...我的应用程序在屏幕上完美适配。 - Chihying Wu
@Gags 我还没有测试滚动功能,谢谢你让我知道。 - Chihying Wu

6

在触摸事件中检查比例因子,然后防止触摸事件。

document.addEventListener('touchmove', function(event) {
    event = event.originalEvent || event;
    if(event.scale > 1) {
        event.preventDefault();
    }
}, false);

3
iOS 13将false更改为{passive: false}。 - wayofthefuture

5
如所请求,我已经将我的评论转换成答案,以便大家可以投票:
这个方法在iOS 13上有效率高达90%: 和

4
为什么这个方法90%的时间都有效?我在我的设备上尝试了一下,可是没有起作用 :( - JeanPaul A.
@JeanPaulA. 那你就是那10%的一员了。 - undefined

1
在iOS 10.2的Safari中,虽然听起来很奇怪,但是如果你的元素或其任何祖先具有以下特点之一,则双击缩放功能将被神奇地禁用:
  1. 一个onClick监听器——它可以是一个简单的noop。
  2. CSS中设置了cursor: pointer

如何捏合? - Sam Su
很遗憾,这个解决方案不包括捏合缩放。 为此,我们使用了以下提议的解决方案:https://dev59.com/8FoU5IYBdhLWcg3wHERp#39594334 - mariomc
对我不起作用。我正在使用iPod Touch上的10.2.1 Beta 4,使用此测试页面并双击任何灰色正方形进行缩放:https://jsbin.com/kamuta/quiet - robocat
1
我在一个React应用程序的span标签上使用了这个代码,但它没有起作用。 - Fasani

1

当意外发生 缩放 时,通常是以下情况造成的:

  • 用户双击界面上的某个组件
  • 用户使用两个或更多手指与视口进行交互(捏合)

为了防止 双击 行为,我发现两种非常简单的解决方法:

<button onclick='event.preventDefault()'>Prevent Default</button>
<button style='touch-action: manipulation'>Touch Action Manipulation</button>

这两个方法都可以防止Safari(iOS 10.3.2)对按钮进行缩放。如您所见,一个只是JavaScript,另一个只是CSS。请适当使用。
这里有个演示: https://codepen.io/lukejacksonn/pen/QMELXQ 我尚未尝试防止捏合行为(至少还没有),主要是因为我不倾向于为Web创建多点触摸界面,其次是因为我认为也许所有接口,包括原生应用程序UI,都应该在某些地方支持“捏合缩放”。但无论如何,我仍将设计以避免用户必须执行此操作才能使您的UI对他们可访问,不惜一切代价。

1

我发现了一个简单的解决办法,可以防止双击缩放:

    // Convert touchend events to click events to work around an IOS 10 feature which prevents
    // developers from using disabling double click touch zoom (which we don't want).
    document.addEventListener('touchend', function (event) {
        event.preventDefault();
        $(event.target).trigger('click');
    }, false);

1
在当前版本的Safari中,这个方法不再起作用。你需要将第二个参数定义为非被动性,通过传递{passiv:false}来实现。
 document.addEventListener('touchmove', function(e) {
 e.preventDefault();
}, { passive: false });

已在iOS 14.4上测试:它禁用了视口的触摸滚动,因此您无法再向上或向下滚动页面。 - Sébastien Gicquel

0

我在我的iOS页面上(iPhone 6,iOS 10.0.2)实践了所有以上答案,但没有成功。这是我的解决方案:

$(window).bind('gesturestart touchmove', function(event) {
    event = event.originalEvent || event;
    if (event.scale !== 1) {
         event.preventDefault();
         document.body.style.transform = 'scale(1)'
    }
});

不幸的是,这仅适用于您的页面完全匹配的情况,而不适用于具有可滚动内容的情况。 - jamesSampica
嗯。根据我的经验,这在可滚动内容方面运行良好(iOS 10.3)。 - Jeff McMahan

0

这个对我有用:

document.documentElement.addEventListener('touchmove', function (event) {
    event.preventDefault();
}, false);

我尝试了这个方法,它确实禁止了捏合缩放,但是它也禁用了视口的触摸滚动,导致页面无法上下滑动。 - TGR

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