タッチデバイスのブラウザーでダブルタップ「ズーム」オプションを無効にする


112

すべてのズーム機能を無効にすることなく、ブラウザーの指定された要素(タッチデバイス上)のダブルタップズーム機能を無効にしたい。

例:何かが発生するために、1つの要素を複数回タップすることができます。これはデスクトップブラウザーでは(期待どおり)正常に動作しますが、タッチデバイスブラウザーではズームインします。


ズーム用ではありませんが、他の重要なものがあります-`-webkit-touch-callout:none; -webkit-text-size-adjust:なし。-webkit-user-select:なし。
Udayraj Deshmukh 2017

回答:


98

注(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または他のデバイスでテストされていません(WebサイトはiPadでのみ表示されるため)。


16
これですべてのズーム機能が無効になりますが、残念ながらそれは私の質問ではありませんでした。指定した要素のみを無効にしたい。
Wouter Konecny、2012年

おいがらくた。私はそれを逆に読んで、失敗しました。ごめんなさい!
Kablam、2012年

5
このソリューションはどうですか?iOSのみですが、おそらく調整可能ですか?:gist.github.com/2047491
Kablam、

2
@WouterKonecny useragentチェックを削除すると、touchstartイベントをサポートするすべてのデバイスで機能するはずです。これらのデバイスを検出するには、isEventSupported
nxt

4
Appleは現在これを公式に無視している。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%クロスブラウザとプラットフォームのようです。上記のコードは、クリックイベントの前にカスタム動作が必要な場合を除き、ほとんどの場合、コピーと貼り付けのソリューションとして機能します。


シンプルだが素晴らしい答え。メタタグなどを変更する必要はありません
ベンチプレッサー2015年

2
これはクリックを無効にします。申し訳ありませんが、良い解決策ではないと思います
Pixelomo

6
CSSを設定するだけでJSを実行する必要はありませんpointer-events: none
Pixelomo

1
これはページ全体のズームを無効にすることなくインクリメント/デクリメントボタンを処理するために完全に機能しましたありがとうございます。
ラモン・

1
これが正しく表示されると、信頼できるイベントが必要な特定の状況で失敗する可能性があります(たとえば、フルスクリーンまたは他の実験をトリガーするsthをクリックして、信頼できるイベントがユーザー/ 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を含む)では機能しないようです。ドキュメント、ボディ、ウィンドウ、*、サイコロにバインドしませんでした。
最大

私も試してみましたが、safari / ipad、android chromeでは機能しますが、androidのデフォルトブラウザーでは機能しません
Strae

2
jqueryはjavascriptではありません。ライブラリなしでこれを行う方法の例があるとよいでしょう
Martijn Scheffer

jquery以外のバージョンを探しています:-(
Timo

繰り返しますが、jQueryはjavascriptではなく、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', () => {})
セルゲイ

Appleはタップを無効にしてiOS13をズームしますが、iOS13では機能しないとどうやって言えますか?
oygen

15

バージョンが必要な場合はjQueryなく動作し、私は変更はWouter Konecnyの回答(も変更することで作成されたこの要旨によるヨハン・サンドストロームをバニラは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);
martin jakubik

11

この他の回答で説明されtouch-actionnoneいるようにcssプロパティを設定する必要がありますhttps://stackoverflow.com/a/42288386/1128216

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

1
これは機能します...しかし、ズームを無効にしたいが、他のタッチイベントを残したい場合はどうなりますか?大きなテーブルがあり、これもスクロールを無効にします。
FrenkyB 2018

2
ダブルタップズームのみを解除する場合は、値を 'touch-action:操作;'に設定する必要があります。これにより、パンとピンチズームが可能になります。重要な注意:これは、ダブルタップズームを実装するために導入されたクリック遅延ブラウザーを取り除くのにも役立ちます。developer.mozilla.org/en-US/docs/Web/CSS/touch-action
cschuff

このクラスはどのHTMLタグに追加する必要がありますか?
Razvan Zamfir 2018

ズームインしたくない要素に追加するだけでいいと思います。たとえば、私の場合、ユーザーにページのどの部分も拡大表示させたくないので、bodyタグに追加しました。
ジョナサンモラレスベレス

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

ダブルタップを無効にすると、タッチスクリーンでズームできます。インターネットエクスプローラが含まれています。


1

シンプルのデフォルトの動作を妨げるclickdblclickまたはtouchendイベントは、ズーム機能を無効にします。

このイベントの1つにすでにコールバックがある場合は、単にを呼び出しますevent.preventDefault()


1
これでうまくいきました。ボタンに独自のタッチスタートイベントを定義していて、ズーム機能を無効にしたいと思っていました。
Rick Giuly、2016年


0

これにより、「ボディ」内の要素のダブルタップズームが防止されます。これは、他のセレクターに変更できます

$('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');

});

しかし、これにより、複数回クリックしたときにクリックイベントがトリガーされないため、別のイベントをバインドして複数のクリックでイベントをトリガーする必要がありました。

$('.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.
    }
});

タッチスタートで、ズームを防止してクリックをトリガーするコードを追加しました。

$('.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のインターネットアプリを除いて機能します。Samsungは、完全タップでは<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)の組み込みインターネットアプリでは、のダブルタップを禁止します<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">

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.