如何防止在 Safari 移动浏览器上捏缩放(滚动)?

Posted

技术标签:

【中文标题】如何防止在 Safari 移动浏览器上捏缩放(滚动)?【英文标题】:How to prevent pinch to zoom (on scroll) on safari mobile browser? 【发布时间】:2018-03-18 15:26:48 【问题描述】:

我需要我的 Web 应用程序作为本机移动应用程序运行。为此,我需要防止在所有浏览器上进行捏合缩放和双击缩放。在 Chrome 和 Firefox 中这很容易:

<meta name="viewport" content="width=device-width, user-scalable=no" />

在 Safari 上是一个挑战。 Here 我发现了如何防止捏合缩放和禁用双击缩放。但是当你滚动和捏缩放时,它的缩放。我的问题是是否有办法在滚动时也阻止它?

【问题讨论】:

请不要这样做,这会破坏预期的行为,这是糟糕的用户体验 - 如果某些东西太小,我想放大它。 我知道这是不好的做法。但是老板想要这种行为。 这根本不是一个坏习惯。这只是伪装成可访问性功能的 Apple 的帮助。启用或禁用网页行为的决定必须留给网络开发人员。 【参考方案1】:

结合你链接中的javascriptpreventDefault解决方案;您可以使用以下方法禁用页面范围内的捏合和捏合。

<style>
html,
body 
  position: fixed;
  overflow: hidden;

</style>

并使用以下 CSS 将 &lt;body&gt; 中的所有内容包装在主包装器中

<style>
.mainwrapper 
  width: 100vw;
  height: 100vh;
  overflow-y: scroll;
  -webkit-overflow-scrolling: touch;

</style>

<body>
    <div id="master_wrap">
        ...content...
    </div> <!-- /master wrapper -->
</body>

您实际上禁用了所有 body/html 级别的滚动,然后在主包装器内重新启用滚动以下级别,其中包括弹性和动量滚动。当这些元素滚动时,捏合已经被忽略了。

缺点

1 - 如果您有 fixedabsolute 元素,那么滚动会变得非常卡顿。

2 - 似乎还有一个奇怪的错误,如果您从页面的高处向下滚动,页面的一部分将被修改,并且捏合再次可用。我认为它可能与vh 属性有关,并且可能有一个 JS 解决方案可以更好地设置元素的高度/宽度。

【讨论】:

【参考方案2】:

如果您想忽略所有可以滚动正文内容的事件,您可以将一个函数绑定到 touchmove 事件,以防止默认行为并停止该事件的传播:

document.body.addEventListener("touchmove", function(event) 
    event.preventDefault();
    event.stopPropagation();
, false);

在 jQuery 或类似库中:

$(document.body).on("touchmove", function(event) 
    event.preventDefault();
    event.stopPropagation();
);

Link

【讨论】:

以上是关于如何防止在 Safari 移动浏览器上捏缩放(滚动)?的主要内容,如果未能解决你的问题,请参考以下文章

在滚动视图内的 UIImageView 上捏缩放效果?

在移动浏览器上缩放或滚动

MobileSafari(iOS Safari):有没有办法防止水平/垂直滚动“捕捉”?

如何防止 iOS Safari 屏幕底部的滚动事件

idea 通用设置 编码设置防止乱码ctrl+鼠标滚动就可以缩放字体大小 跟浏览器一样

CSS android浏览器不允许滚动内容