【问题标题】:IOS HTML disable double tap to zoomIOS HTML禁用双击缩放
【发布时间】:2018-02-20 09:33:08
【问题描述】:

我正在设计一个主要专注于数据输入的网站。在我的一个表单中,我有按钮可以快速增加和减少表单字段中的数值。我正在使用

<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 开始,苹果出于可访问性的原因删除了 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 但是,这会完全禁用快速点击,虽然可以防止双击缩放,但也会阻止用户快速输入值。有什么方法可以让按钮快速按下,同时禁用双击缩放?

【问题讨论】:

  • 减去两个touchend事件之间的时间戳,如果值小于数字,例如100,则取消事件,排除特定类的按钮,只需为事件的目标dom添加if语句.

标签: javascript html ios iphone ios10


【解决方案1】:

CSS 属性 touch-action 对我有用。在 iOS 11.1 上测试。

button {
    touch-action: manipulation;
}

查看 MDN 了解更多信息:https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action

【讨论】:

  • 这也适用于 10.2.1。将它放在“身体”上几乎可以整体禁用它。
  • 这与 viewport 元一起为我做了它以禁用缩放。
  • 这仅适用于块级元素/具有已知高度和宽度的元素。内联元素仍将具有默认的浏览器触摸行为。
  • 谢谢!这似乎比我之前提出的解决方案好得多。
  • 适用于 iOS 14.4
【解决方案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);
    }
});

【讨论】:

    【解决方案3】:

    我做了一个有点复杂的答案,但它在停止双击和捏拉缩放方面运行良好且可靠,并且允许几乎所有其他类型的交互

    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*/
    

    【讨论】:

      【解决方案4】:

      将此添加到您的标题中。这对我有用。

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

      【讨论】:

      • 在我的问题中,我已经声明我正在使用此代码。但是,从 IOS 10 开始,出于可访问性原因,Safari 不再应用 user-scalable=no。
      猜你喜欢
      • 2022-08-12
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2020-11-11
      相关资源
      最近更新 更多