我正在设计一个主要关注数据输入的网站。在我的一个表单中,我有一些按钮可以快速递增和递减表单字段中的数字值。我正在使用
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
禁用使用适用于IOS的Firefox应用程序的缩放功能。但是,当另一个用户使用Safari对其进行测试时,单击该按钮的速度过快会导致页面放大,从而分散用户的注意力并使其无法快速增加值。从IOS 10开始,Apple出于可访问性原因删除了user-scalable = no,这就是为什么它只适用于像Firefox这样的第三方浏览器。我发现最接近禁用双击缩放的是
var lastTouchEnd = 0;
document.addEventListener('touchend', function (event) {
var now = (new Date()).getTime();
if (now - lastTouchEnd <= 300) {
event.preventDefault();
}
lastTouchEnd = now;
}, false);
来自https://stackoverflow.com/a/38573198的但是,这会禁用快速点击,这虽然可以防止双击缩放,但也会阻止用户快速输入值。有没有办法允许快速按下按钮,同时还禁用双击缩放?
答案 0 :(得分:30)
CSS属性touch-action
适合我。在iOS 11.1上测试。
button {
touch-action: manipulation;
}
有关详细信息,请参阅MDN:https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action
答案 1 :(得分:2)
我最终使用以下代码解决了这个问题:请参阅Greg的回答above
$(document).click(function(event) {
element = document.elementFromPoint(event.clientX, event.clientY);
if(document.getElementById("div_excluded_from_doubletap").contains(element)) {
event.preventDefault();
clickFunction(element);
}
});
答案 2 :(得分:0)
我做了一个复杂的回答,但它在停止双击和双指缩放方面运行良好且可靠,并且几乎允许所有其他类型的交互
let drags = new Set() //set of all active drags
document.addEventListener("touchmove", function(event){
if(!event.isTrusted)return //don't react to fake touches
Array.from(event.changedTouches).forEach(function(touch){
drags.add(touch.identifier) //mark this touch as a drag
})
})
document.addEventListener("touchend", function(event){
if(!event.isTrusted)return
let isDrag = false
Array.from(event.changedTouches).forEach(function(touch){
if(drags.has(touch.identifier)){
isDrag = true
}
drags.delete(touch.identifier) //touch ended, so delete it
})
if(!isDrag && document.activeElement == document.body){
//note that double-tap only happens when the body is active
event.preventDefault() //don't zoom
event.stopPropagation() //don't relay event
event.target.focus() //in case it's an input element
event.target.click() //in case it has a click handler
event.target.dispatchEvent(new TouchEvent("touchend",event))
//dispatch a copy of this event (for other touch handlers)
}
})
注意:greg 的回答并不一致(双击某些元素仍会放大)
如果你想防止双指缩放,你需要一些 JS 和 CSS(不要问我为什么):
document.addEventListener('touchmove', function(event){
if (event.scale !== 1) event.preventDefault(); //if a scale gesture, don't
})
和
*{touch-action: pan-x pan-y} /*only allow scroll gestures*/
答案 3 :(得分:-4)
将此添加到标题中。这适合我。
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />