在触摸设备上的浏览器中禁用双击“缩放”选项


112

我想禁用浏览器(在触摸设备上)中指定元素上双击缩放功能,而不禁用所有缩放功能

例如:可以多次点击一个元素以使某事发生。在桌面浏览器上(按预期方式),此方法工作正常,但在触摸设备浏览器上,它将放大。


尽管不是为了缩放,但是这里还有其他一些必要的内容-`-webkit-touch-callout:无;-webkit-text-size-adjust:无;-webkit-user-select:无;
Udayraj Deshmukh

Answers:


99

注意(从2020-08-04开始):此解决方案似乎无法在iOS Safari v12 +中运行。一旦找到涵盖iOS Safari的明确解决方案,我将更新此答案并删除此注释。

纯CSS解决方案

添加touch-action: manipulation到要禁用双击缩放的任何元素,例如以下disable-dbl-tap-zoom类:

.disable-dbl-tap-zoom {
  touch-action: manipulation;
}

touch-action文档(重点是我的):

操纵

启用平移和收缩缩放手势,但禁用其他非标准手势,例如双击以缩放

此值适用于Android和iOS。


@SergoPasoevi,您可以创建一个不起作用的示例吗?我正在为iOS 12使用此解决方案,并且对我有用。
罗斯·艾伦

我看到了与@SergoPasoevi相同的问题,但无法在iOS 12上使用
Trevor

在iOS 12上为我工作!
KB2497

2
用触摸动作包裹整个身体的弊端是什么?
oygen

1
双击图像在最新的iOS上不起作用。
亚当·西尔弗

54
<head>
<title>Site</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> 
etc...
</head>

我最近使用过它,并且在iPad上可以正常使用。尚未在Android或其他设备上进行测试(因为该网站仅在iPad上显示)。


16
那将禁用所有缩放功能,不幸的是,这不是我的问题。我只想禁用指定的元素。
Wouter Konecny

Oi废话。我反过来读,失败在我身上。抱歉!
卡巴拉姆

5
这个解决方案怎么样?仅限于iOS,但可以调整吗?:gist.github.com/2047491
Kablam

2
@WouterKonecny如果删除用户代理,请检查它是否可以在支持touchstart事件的任何设备上运行。要检测这些设备,您可以使用isEventSupported之
nxt 2012年

4
苹果现在正式忽略了这一点。github.com/w3c/html/issues/602
卡他非他明

38

我知道这可能已经很老了,但是我找到了一个非常适合我的解决方案。无需疯狂的元标记,也无需停止内容缩放。

我不确定100%跨装置,但它完全按照我的意愿工作。

$('.no-zoom').bind('touchend', function(e) {
  e.preventDefault();
  // Add your code here. 
  $(this).click();
  // This line still calls the standard click event, in case the user needs to interact with the element that is being clicked on, but still avoids zooming in cases of double clicking.
})

这将仅禁用常规的点击功能,然后再次调用标准的点击事件。这样可以防止移动设备缩放,否则将正常运行。

编辑:这已经过时间测试,并在几个实时应用程序中运行。似乎是100%跨浏览器和平台。在大多数情况下,除非您希望在click事件之前执行自定义行为,否则以上代码应可作为复制粘贴解决方案。


简单但很好的答案。无需修改元标记等
。– Benchpresser

2
这会禁用点击,我认为这不是一个很好的解决方案
Pixelomo 2015年

6
您不需要JS就可以设置CSS属性pointer-events: none
Pixelomo 2015年

1
谢谢您,此方法非常适合处理递增/递减按钮,而不会禁用整个页面的缩放。
拉蒙

1
如果我没问题,在某些情况下,这可能会失败,在某些情况下您需要受信任的事件(例如,单击sth触发全屏或其他实验,如yneed受信任的事件,这意味着由USER / OS触发)
Manuel Graf

29

我只是想正确回答我的问题,因为有些人没有阅读答案下面的评论。所以这里是:

(function($) {
  $.fn.nodoubletapzoom = function() {
      $(this).bind('touchstart', function preventZoom(e) {
        var t2 = e.timeStamp
          , t1 = $(this).data('lastTouch') || t2
          , dt = t2 - t1
          , fingers = e.originalEvent.touches.length;
        $(this).data('lastTouch', t2);
        if (!dt || dt > 500 || fingers > 1) return; // not double-tap

        e.preventDefault(); // double tap - prevent the zoom
        // also synthesize click events we just swallowed up
        $(this).trigger('click').trigger('click');
      });
  };
})(jQuery);

我没有写这个,我只是修改了它。我在这里找到了仅限iOS的版本:https ://gist.github.com/2047491(感谢Kablam)


1
这似乎不起作用,至少在SIII(带有Android 4.0.4)上不起作用。我尝试绑定到文档,正文,窗口,*,没有骰子。
2012年

我也
尝试

2
jQuery是不是JavaScript的这将是不错的,如何做到这一点没有一个图书馆的例子
马亭雅伯

寻找非jquery版本:-(
Timo

同样,jQuery不是javascript,也不应该鼓励使用jQuery,因为它不适用于基于更现代的想法(例如angular)的网站。阅读问题
Martijn Scheffer

15

CSS禁用全局双击缩放(在任何元素上):

  * {
      touch-action: manipulation;
  }

操纵

启用平移和收缩缩放手势,但禁用其他非标准手势,例如双击以缩放。

谢谢罗斯,我的回答扩展了他的观点https : //stackoverflow.com/a/53236027/9986657


1
这应该标记为答案。我尝试仅将其放在html和body上,但在iOS 13.2中不起作用。这可行。
R OMS

这本身无法在iOS 13上运行,但结合此代码,它会停止点按以完全缩放React应用程序。document.getElementById('root').addEventListener('click', () => {})
谢尔盖

苹果已禁用水龙头以在ios13上缩放,如何说它在iOS13上不起作用?
oygen

15

如果您需要一个不使用jQuery的版本,则可以修改Wouter Konecny的答案(也由JohanSundström修改了这个要点来创建)以使用普通JavaScript。

function preventZoom(e) {
  var t2 = e.timeStamp;
  var t1 = e.currentTarget.dataset.lastTouch || t2;
  var dt = t2 - t1;
  var fingers = e.touches.length;
  e.currentTarget.dataset.lastTouch = t2;

  if (!dt || dt > 500 || fingers > 1) return; // not double-tap

  e.preventDefault();
  e.target.click();
}

然后在touchstart调用此函数的事件处理程序上添加:

myButton.addEventListener('touchstart', preventZoom); 

3
辉煌。只是想提到我需要添加一个addEventListener来调用它。myButton.addEventListener('touchstart', preventZoom);
马丁·贾库比克,

11

您应的CSS属性设置touch-action,以none在该对方的回答中描述https://stackoverflow.com/a/42288386/1128216

.disable-doubletap-to-zoom {
    touch-action: none;
}

1
这行得通...但是,如果我想禁用缩放但留下其他触摸事件怎么办?我有一张大桌子,这也禁用了滚动。
FrenkyB

2
如果您只想摆脱双击缩放,则应将值设置为“ touch-action:操纵;” 这仍将允许平移和捏缩放。重要说明:这也有助于摆脱为实现双击缩放而引入的单击延迟浏览器。请参阅developer.mozilla.org/zh-CN/docs/Web/CSS/touch-action
cschuff

此类应在哪个HTML标记上添加?
拉兹万·赞菲尔

我认为您可以将其添加到您不想使用的任何元素中。例如,在我的情况下,我不希望用户放大页面的任何部分,因此将其添加到body标签中。
乔纳森·莫拉莱斯·韦莱兹

2
* {
    -ms-touch-action: manipulation;
    touch-action: manipulation;
}

禁用双击以放大触摸屏。包括Internet Explorer。


1

简单阻止的默认行为clickdblclick否则touchend事件将禁用缩放功能。

如果您已经对其中一个事件进行了回调,请调用event.preventDefault()


1
这对我有用。我在按钮上定义了自己的touchstart事件,我想禁用缩放功能。
瑞克·吉利

1

如果有像我这样的人正在使用Vue.js遇到此问题,只需添加.prevent就可以解决问题:@click.prevent="someAction"


0

这样可以防止双击“ body”中的元素,可以将其更改为任何其他选择器

$('body').bind('touchstart', function preventZoom(e){
            var t2 = e.timeStamp;
            var t1 = $(this).data('lastTouch') || t2;
            var dt = t2 - t1;
            var fingers = e.originalEvent.touches.length;
            $(this).data('lastTouch', t2);
            if (!dt || dt > 500 || fingers > 1){
                return; // not double-tap
            }
            e.preventDefault(); // double tap - prevent the zoom
            // also synthesize click events we just swallowed up
            $(e.target).trigger('click');

});

但这也阻止了我的click事件在多次单击时触发,因此我不得不绑定另一个事件以在多次单击时触发事件

$('.selector').bind('touchstart click', preventZoom(e) {    
    e.stopPropagation(); //stops propagation
    if(e.type == "touchstart") {
      // Handle touchstart event.
    } else if(e.type == "click") {
      // Handle click event.
    }
});

在touchstart上,我添加了代码以防止缩放并触发单击。

$('.selector').bind('touchstart, click', function preventZoom(e){
            e.stopPropagation(); //stops propagation
            if(e.type == "touchstart") {
                // Handle touchstart event.
                var t2 = e.timeStamp;
                var t1 = $(this).data('lastTouch') || t2;
                var dt = t2 - t1;
                var fingers = e.originalEvent.touches.length;
                $(this).data('lastTouch', t2);


                if (!dt || dt > 500 || fingers > 1){
                    return; // not double-tap
                }

                e.preventDefault(); // double tap - prevent the zoom
                // also synthesize click events we just swallowed up
                $(e.target).trigger('click');

            } else if(e.type == "click") {
                // Handle click event.
               "Put your events for click and touchstart here"
            }

 });

-1

我假设我确实有一个<div>包含文本,滑块和按钮的输入容器区域,并希望在其中避免意外的双击<div>。以下内容不会禁止在输入区域上进行缩放,并且与在我的<div>区域之外双击和缩放无关。视浏览器应用程序而定。

我刚试过

(1)对于iOS上的Safari和Android上的Chrome,是首选方法。适用于Samsung上的Internet应用程序,该应用程序不完全禁用两次抽头<div>,而是至少在处理抽头的元素上禁用两次抽头。它返回return false,对异常textrange投入。

$('selector of <div> input area').on('touchend',disabledoubletap);

function disabledoubletap(ev) {

    var preventok=$(ev.target).is('input[type=text],input[type=range]');

    if(preventok==false) return false; 
}

(2)(可选)对于Android(5.1,Samsung)上的内置Internet应用程序,禁止双击<div>,但禁止放大<div>

$('selector of <div> input area').on('touchstart touchend',disabledoubletap);

(3)对于Android 5.1上的Chrome,完全禁用双击,不禁止缩放,并且在其他浏览器中不执行双击操作。两次禁止<meta name="viewport" ...>令人讨厌,因为这<meta name="viewport" ...>似乎是一种好习惯。

<meta name="viewport" content="width=device-width, initial-scale=1, 
          maximum-scale=5, user-scalable=yes">


-4

开始了

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.