터치 장치의 브라우저에서 두 번 탭 "확대 / 축소"옵션 비활성화


112

모든 확대 / 축소 기능을 비활성화하지 않고 브라우저 (터치 장치에서)의 지정된 요소 에 대해 두 번 탭 확대 / 축소 기능 을 비활성화 하고 싶습니다 .

예 : 어떤 일이 일어나기 위해 하나의 요소를 여러 번 탭할 수 있습니다. 이것은 데스크톱 브라우저 (예상대로)에서는 잘 작동하지만 터치 장치 브라우저에서는 확대됩니다.


확대 / 축소를위한 것은 아니지만 여기에 다른 필수 기능이 있습니다.`-webkit-touch-callout : none; -webkit-text-size-adjust : 없음; -webkit-user-select : 없음;
Udayraj Deshmukh

답변:


98

참고 (2020 년 8 월 4 일 기준) :이 솔루션은 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에 사용하고 있으며 저에게 효과적입니다.
Ross Allen

나는 아이폰 OS (12)에 작동하지 않는, @SergoPasoevi 같은 문제를 볼
트레버 JEX

iOS 12에서 나를 위해 일했습니다!
KB2497

2
터치 액션 : 조작으로 몸 전체를 감싸는 단점은 무엇입니까?
oygen

1
이미지를 두 번 탭하면 최신 iOS에서 작동하지 않습니다.
Adam Silver

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

오이 쓰레기. 나는 그것을 다른 방향으로 읽었습니다. 실패는 나에게 있습니다. 죄송합니다!
Kablam

5
이 솔루션은 어떻습니까? iOS 전용이지만 조정할 수 있습니까? : gist.github.com/2047491
Kablam

2
@WouterKonecny ​​useragent를 제거하면 touchstart 이벤트를 지원하는 모든 장치에서 작동해야합니다. 이러한 장치를 감지하려면 isEventSupported
nxt

4
애플은 이제 공식적으로 이것을 무시합니다. github.com/w3c/html/issues/602
catamphetamine 2018

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 % 크로스 브라우저 및 플랫폼 인 것 같습니다. 위의 코드는 클릭 이벤트 전에 사용자 지정 동작을 원하지 않는 한 대부분의 경우 복사-붙여 넣기 솔루션으로 작동 합니다.


간단하지만 훌륭한 대답입니다. 메타 태그 등을 수정할 필요가 없습니다.
benchpresser

2
이것은 클릭을 비활성화합니다. 좋은 솔루션이라고 생각하지 않습니다. 죄송합니다
Pixelomo

6
JS가 필요하지 않습니다. CSS 속성 만 설정할 수 있습니다.pointer-events: none
Pixelomo

1
전체 페이지에서 확대 / 축소를 비활성화하지 않고 증가 / 감소 버튼을 처리하는 데 완벽하게 작동했습니다.
Ramón

1
올바르게 표시되면 신뢰할 수있는 이벤트가 필요한 특정 상황에서 실패 할 수 있습니다 (예 : 사용자 / OS에 의해 트리거됨을 의미하는 yneed 신뢰할 수있는 이벤트로 전체 화면 또는 기타 실험을 트리거하는 sth 클릭)
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 (안드로이드 4.0.4 포함)에서는 작동하지 않는 것 같습니다. 문서, 본문, 창, *, 주사위 없음에 바인딩을 시도했습니다.
Max

나도 Tryed, 사파리 / 아이 패드, 안드로이드 크롬하지만 안드로이드 기본 브라우저에서 작동
Strae

2
JQuery와는 라이브러리없이이 작업을 수행하는 방법의 예를 가지고 좋은 것 자바 스크립트를하지 않습니다
마티 페르

비 jquery 버전을 찾고 :-(
Timo

다시 말하지만, jQuery는 javascript가 아니며 angular와 같은 더 현대적인 아이디어를 기반으로 한 사이트에서는 잘 작동하지 않기 때문에 권장해서는 안됩니다. 질문 읽기
Martijn Scheffer

15

두 번 탭 확대 / 축소를 전역 적으로 비활성화하는 CSS (모든 요소) :

  * {
      touch-action: manipulation;
  }

시장 조작

패닝 및 핀치 확대 / 축소 제스처를 활성화하지만 두 번 탭하여 확대 / 축소하는 것과 같은 추가 비표준 제스처는 비활성화합니다.

감사합니다 Ross, 내 대답은 그의 확장입니다 : https://stackoverflow.com/a/53236027/9986657


1
이것은 답으로 표시되어야합니다. 나는 그것을 html과 body에만 넣으려고했지만 iOS 13.2에서는 작동하지 않았습니다. 작동합니다.
R OMS 2019

이것은 iOS 13 자체에서는 작동하지 않지만이 코드와 함께 React 앱을 완전히 확대하려면 탭합니다. document.getElementById('root').addEventListener('click', () => {})
Sergei

애플은 ios13에서 확대 / 축소하려면 탭을 비활성화했습니다. iOS13에서 작동하지 않는다고 어떻게 말할 수 있습니까?
oygen

15

jQuery없이 작동 하는 버전이 필요한 경우 바닐라 JavaScript를 사용 하도록 Wouter Konecny의 답변 ( Johan Sundström 이 요점 을 수정하여 생성됨)을 수정 했습니다 .

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

이 다른 답변 https://stackoverflow.com/a/42288386/1128216에 설명 된대로 css 속성 touch-actionnone로 설정해야합니다.

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

1
이것은 작동하지만 확대 / 축소를 비활성화하고 다른 터치 이벤트를 남기고 싶다면 어떻게해야합니까? 나는 큰 테이블을 가지고 있으며 이것은 또한 스크롤을 비활성화합니다.
FrenkyB

2
두 번 탭하는 확대 / 축소 만 제거하려면 값을 '터치 동작 : 조작;'으로 설정해야합니다. 그래도 패닝 및 핀치 줌이 가능합니다. 중요 참고 : 이것은 또한 더블 탭 확대 / 축소를 구현하기 위해 도입 된 클릭 지연 브라우저를 제거하는 데 도움이됩니다. 참조 developer.mozilla.org/en-US/docs/Web/CSS/touch-action을
cschuff

이 클래스를 어떤 HTML 태그에 추가해야합니까?
Razvan Zamfir

확대하는 데 사용하지 않으려는 요소에 추가 할 수 있다고 생각합니다. 예를 들어, 제 경우에는 사용자가 내 페이지의 어떤 부분도 확대하는 것을 원하지 않았기 때문에 본문 태그에 추가했습니다.
Jonathan Morales Vélez

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

터치 스크린에서 확대 / 축소하려면 두 번 탭을 사용 중지합니다. 인터넷 익스플로러가 포함되어 있습니다.


1

간단한는의 기본 동작을 방지 click, dblclick또는 touchend이벤트는 줌 기능을 사용할 수 없게됩니다.

이 이벤트 중 하나에 대한 콜백이 이미있는 경우 event.preventDefault().


1
이것은 나를 위해 일했습니다. 버튼에 대한 자체 터치 스타트 이벤트를 정의하고 있었는데 줌 기능을 비활성화하고 싶었습니다.
Rick Giuly 2016

1

Vue.js를 사용 하여이 문제를 겪고있는 저와 같은 사람이 있다면 .prevent 를 추가하기 만하면 됩니다.@click.prevent="someAction"


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의 경우 선호되는 방법입니다. 삼성의 인터넷 앱을 제외하고 작동합니다. 여기서는 전체 <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.