在iOS 10的Safari中,可以防止网页缩放,但这将需要更多您的工作。我想争论的是,难度应该阻止盲目开发人员在每个视口标记中添加"user-scalable=no"并使视力受损的用户面临不必要的困难。
尽管如此,我仍希望看到苹果公司改变他们的实现方式,以便有一种简单(元标记)的方法来禁用双击缩放功能。大部分困难与该交互有关。
您可以使用类似以下内容来停止捏合缩放:
document.addEventListener('touchmove', function (event) {
if (event.scale !== 1) { event.preventDefault(); }
}, false);
注意,如果任何更深层次的目标在事件上调用了stopPropagation,则该事件将无法到达文档,并且此侦听器将无法防止缩放行为。var lastTouchEnd = 0;
document.addEventListener('touchend', function (event) {
var now = (new Date()).getTime();
if (now - lastTouchEnd <= 300) {
event.preventDefault();
}
lastTouchEnd = now;
}, false);
如果您的表单元素设置不正确,聚焦输入框会自动缩放,由于您大多数情况下禁用了手动缩放,现在取消缩放几乎是不可能的。确保输入字体大小>= 16px。
如果您正在尝试在本机应用程序中的WKWebView中解决此问题,则上面提供的解决方案是可行的,但这是更好的解决方案:https://dev59.com/mV8e5IYBdhLWcg3wnrcQ#31943976。如其他答案中所述,在iOS 10 beta 6中,Apple现在提供了一个标志来使用meta标记。
更新于2017年5月:我用更简单的“检查touchmove上的event.scale”方法替换了旧的“在touchstart上检查触摸长度”的禁用pinch-zoom的方法。对于每个人来说应该更可靠。
touchmove
事件上使用preventDefault
来禁用缩放和滚动。但是如果要禁用缩放,也会导致滚动被禁用(无法完全禁用缩放)。 - Paolo这是iOS 10的一个新功能。
iOS 10 beta 1发行说明中提到:
- 为了改善Safari中网站的可访问性,即使网站在视口中设置了
user-scalable=no
,用户现在也可以使用捏合手势进行缩放。
我预计不久之后我们会看到一种JS插件来以某种方式禁用它。
我能够通过在单个元素上使用touch-action
CSS属性来解决此问题。尝试在通常会被点击的元素(如链接或按钮)上设置touch-action: manipulation;
。
touch-action: none;
来自己控制所有手势。 - Guy Sophertouch-action: none
,只支持 manipulation
,这样就无法解决双指缩放的问题。 - humanityANDpeace在撰写本文时,在移动Safari中有效的解决方法是将addEventListener
的第三个参数设置为{ passive: false }
,因此完整的解决方法如下:
document.addEventListener('touchmove', function (event) {
if (event.scale !== 1) { event.preventDefault(); }
}, { passive: false });
您可能希望检查是否支持选项以保持向后兼容。
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
。 - Patrick DaVader<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" />
和<meta name="HandheldFriendly" content="true">
。 - Sterling Bourne使用"touch-action: pan-x pan-y"可以禁用"双指缩放"和"双击缩放"功能。在我测试过的所有触摸屏幕/手机上都有效,包括iOS Safari 14.5.1。
body {
touch-action: pan-x pan-y;
}
body
,你还需要在任何具有 overflow: scroll
或 overflow: auto
属性的元素上设置它。或者只需在 *
上设置即可。 - Jo Lissbody
外,你还需要在任何具有 overflow: scroll
或 overflow: auto
属性的元素上设置它。或者直接在 *
上设置。 - undefined看起来这种行为在最新的测试版中已经发生了改变,写作时最新的测试版是beta 6。
iOS 10 Beta 6 的发行说明如下:
WKWebView
现在默认支持视口的user-scalable=no
属性。WKWebView
的客户端可以通过设置WKWebViewConfiguration
属性中的ignoresViewportScaleLimits
为YES
来改善可访问性并允许用户对所有页面进行缩放。
然而,在我的(非常有限的)测试中,我尚不能确认是否真的如此。
编辑:验证结果,iOS 10 Beta 6 对于我来说默认支持 user-scalable=no
。
WKWebView
,而不是Safari。来源:我们的一款地图应用程序出现了问题,我们完全不知道该如何修复它。 - Fabio PoloniWKWebView
中相同的错误/功能时来到这里,并且在回答时有点假设原始问题是关于WKWebView
的。因此,我想在最初的测试版之一中,苹果改变了WKWebView
和移动Safari的行为,然后在beta 6中,他们恢复了WKWebView
的行为,但保留了移动Safari的行为。 - Cellane< script type = "text/javascript" src="http://hammerjs.github.io/dist/hammer.min.js"> < /script >
< script type = "text/javascript" >
// SPORK - block pinch-zoom to force use of tooltip zoom
$(document).ready(function() {
// the element you want to attach to, probably a wrapper for the page
var myElement = document.getElementById('yourwrapperelement');
// create a new hammer object, setting "touchAction" ensures the user can still scroll/pan
var hammertime = new Hammer(myElement, {
prevent_default: false,
touchAction: "pan"
});
// pinch is not enabled by default in hammer
hammertime.get('pinch').set({
enable: true
});
// name the events you want to capture, then call some function if you want and most importantly, add the preventDefault to block the normal pinch action
hammertime.on('pinch pinchend pinchstart doubletap', function(e) {
console.log('captured event:', e.type);
e.preventDefault();
})
});
</script>
.preventDefault
的方式来阻止视口缩放。我同时在使用滑动/捏合/平移/点击等手势,将其添加到了所有的处理器上,我不确定是哪个具体的手势起到了作用。 - Conan在我的情况下,我正在使用Babylon.js创建一个3D场景,我的整个页面由一个全屏画布组成。 3D引擎具有自己的缩放功能,但在iOS上,捏合缩放会干扰它。 我更新了@Joseph的答案以解决我的问题。为了禁用它,我发现需要将{passive: false}作为选项传递给事件侦听器。以下代码对我有效:
window.addEventListener(
"touchmove",
function(event) {
if (event.scale !== 1) {
event.preventDefault();
}
},
{ passive: false }
);
$(function () {
if (!(/iPad|iPhone|iPod/.test(navigator.userAgent))) return
$(document.head).append(
'<style>*{cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}</style>'
)
$(window).on('gesturestart touchmove', function (evt) {
if (evt.originalEvent.scale !== 1) {
evt.originalEvent.preventDefault()
document.body.style.transform = 'scale(1)'
}
})
})
✔ 禁用捏合缩放。
✔ 禁用双击缩放。
✔ 滚动不受影响。
✔ 禁用轻击高亮(在iOS上由样式规则触发)。
注意:根据您的喜好调整iOS检测。有关更多信息,请单击此处。
对于出现在上面代码中的lukejackson和Piotr Kowalski,我们表示歉意,其答案已被修改。
addEventListener
的答案之一并将{passive:false}
作为options
参数传递来纠正它,而不是false
。但是,为了向后兼容,除非支持passive
选项字段,否则需要传递false
。请参见https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners - Josh Gallagher我想出了一个相当朴素的解决方案,但它似乎起作用了。 我的目标是防止意外的双击被解释为缩放,同时保持捏合缩放对无障碍性的工作。
这个想法是在双击中测量第一个 touchstart
和第二个 touchend
之间的时间,如果延迟时间过短,则将最后一个 touchend
解释为单击。虽然可以防止意外的缩放,但这种方法似乎能保持列表滚动不受影响,这很好。不确定是否漏掉了什么。
let preLastTouchStartAt = 0;
let lastTouchStartAt = 0;
const delay = 500;
document.addEventListener('touchstart', () => {
preLastTouchStartAt = lastTouchStartAt;
lastTouchStartAt = +new Date();
});
document.addEventListener('touchend', (event) => {
const touchEndAt = +new Date();
if (touchEndAt - preLastTouchStartAt < delay) {
event.preventDefault();
event.target.click();
}
});
受到mutewinter的代码片段和Joseph的回答的启发。