[mobile-safari] 뷰포트 확대 / 축소 사용 중지 iOS 10 이상 사파리?

나는 내 아이폰 6 플러스 아이폰 OS 10 베타 버전을 업데이트하고 바로 모바일 사파리, 당신은 두 번 눌러 모든 웹 페이지를 확대하거나 곤란 것으로 나타났습니다 무시user-scalable=no 메타 태그 코드를. 버그인지 기능인지 모르겠습니다. 기능으로 간주되면 뷰포트 확대 / 축소 iOS 10 사파리를 어떻게 비활성화합니까?


iOS 11/12 릴리스에서 업데이트되었지만 iOS 11 및 iOS 12 사파리는 여전히 메타 태그를 존중 하지 않습니다user-scalable=no .

Safari의 모바일 github 사이트



답변

iOS 10에서는 Safari에서 웹 페이지 크기 조정을 막을 수 있지만 더 많은 작업이 필요합니다. 카고 컬트 개발자들이 모든 뷰포트 태그에 “user-scalable = no”를 떨어 뜨리고 시각 장애가있는 사용자에게는 불필요하게 어려운 일이 발생하는 것을 막는 데 어려움이 있다고 생각합니다.

그럼에도 불구하고 Apple이 더블 탭 투 줌을 비활성화하는 간단한 (메타 태그) 방법이 있도록 구현 방식을 변경하고 싶습니다. 어려움의 대부분은 그 상호 작용과 관련이 있습니다.

다음과 같이 핀치 투 줌을 중지 할 수 있습니다.

document.addEventListener('touchmove', function (event) {
  if (event.scale !== 1) { event.preventDefault(); }
}, false);

더 깊은 대상이 이벤트에서 stopPropagation을 호출하면 이벤트가 문서에 도달하지 않으며이 리스너가 스케일링 동작을 막지 않습니다.

두 번 탭하여 확대를 비활성화하는 것도 비슷합니다. 이전 탭에서 300 밀리 초 이내에 발생하는 문서의 탭을 비활성화합니다.

var lastTouchEnd = 0;
document.addEventListener('touchend', function (event) {
  var now = (new Date()).getTime();
  if (now - lastTouchEnd <= 300) {
    event.preventDefault();
  }
  lastTouchEnd = now;
}, false);

양식 요소를 올바르게 설정하지 않으면 입력에 초점을 맞추면 자동 확대 / 축소가 수행되며 수동 확대 / 축소를 대부분 사용하지 않도록 설정했기 때문에 이제 확대 / 축소를 해제하는 것이 거의 불가능합니다. 입력 글꼴 크기가 16 픽셀 이상인지 확인하십시오.

기본 앱의 WKWebView 에서이 문제를 해결하려는 경우 위에 제공된 솔루션이 가능하지만 https : //.com/a/31943976/661418보다 나은 솔루션 입니다. 다른 답변에서 언급했듯이 iOS 10 베타 6에서 Apple은 이제 메타 태그를 기리는 플래그를 제공했습니다.

2017 년 5 월 업데이트 : pinch-zoom을 비활성화하는 오래된 ‘터치 스타트 길이 터치 터치’방법을보다 간단한 ‘check event.scale on touchmove’접근 방식으로 대체했습니다. 모든 사람에게 더 안정적이어야합니다.


답변

이것은 iOS 10의 새로운 기능입니다.

iOS 10 베타 1 릴리스 정보에서 :

  • Safari에서 웹 사이트에 대한 접근성을 향상시키기 위해 웹 사이트가 설정되어 있어도 사용자가 확대 / 축소 할 수 있습니다. user-scalable=no 가 뷰포트에 되어 .

JS 애드온이 곧 어떤 방법 으로든 이것을 비활성화 할 것으로 기대합니다.


답변

touch-action개별 요소 에서 css 속성을 사용 하여이 문제를 해결할 수있었습니다 . touch-action: manipulation;링크 나 버튼과 같이 일반적으로 클릭되는 요소를 설정 하십시오.


답변

이 동작은 최신 베타 버전에서 변경된 것으로 보이며, 작성 당시 베타 6입니다.

iOS 10 Beta 6 릴리스 정보 :

WKWebView이제는 기본적으로 user-scalable=no뷰포트를 기준으로합니다. 의 클라이언트는 WKWebView접근성을 개선하고 사용자가 WKWebViewConfiguration
속성 ignoresViewportScaleLimits을 로 설정하여 모든 페이지에서 확대 / 축소 할 수 있도록합니다 YES.

그러나 (매우 제한된) 테스트에서 아직 이것이 사실인지 확인할 수 없습니다.

편집 : 확인, iOS 10 Beta 6은 user-scalable=no기본적으로 나를 위해 존중 합니다.


답변

이 글을 쓰는 시점에서 Mobile Safari에서 작동하는 해결 방법은 addEventListenerbe 의 세 번째 인수를 갖는 { passive: false }것이므로 전체 해결 방법은 다음과 같습니다.

document.addEventListener('touchmove', function (event) {
  if (event.scale !== 1) { event.preventDefault(); }
}, { passive: false });

당신은 할 수 있습니다 옵션이 지원되는 경우 확인 하위 호환성을 유지 할 수 있습니다.


답변

더 강력한 자바 스크립트 옵션을 찾기 위해 약 1 시간을 보냈지 만 찾지 못했습니다. 지난 며칠 동안 hammer.js (Hammer.js는 모든 종류의 터치 이벤트를 쉽게 조작 할 수있는 라이브러리입니다)를 다루었 고 주로 내가하려는 일에 실패했습니다.

그 경고와 내가 자바 스크립트 전문가라는 것을 결코 이해하지 못한다면, 이것은 기본적으로 hammer.js를 사용하여 pinch-zoom 및 double-tap 이벤트를 캡처 한 다음 기록하고 버리는 솔루션입니다.

페이지에 hammer.js를 포함시킨 다음이 자바 스크립트를 머리에 붙이십시오.

< script type = "text/javascript" src="http://hammerjs.github.io/dist/hammer.min.js"> < /script >
< script type = "text/javascript" >

  // SPORK - block pinch-zoom to force use of tooltip zoom
  $(document).ready(function() {

    // the element you want to attach to, probably a wrapper for the page
    var myElement = document.getElementById('yourwrapperelement');
    // create a new hammer object, setting "touchAction" ensures the user can still scroll/pan
    var hammertime = new Hammer(myElement, {
      prevent_default: false,
      touchAction: "pan"
    });

    // pinch is not enabled by default in hammer
    hammertime.get('pinch').set({
      enable: true
    });

    // name the events you want to capture, then call some function if you want and most importantly, add the preventDefault to block the normal pinch action
    hammertime.on('pinch pinchend pinchstart doubletap', function(e) {
      console.log('captured event:', e.type);
      e.preventDefault();
    })
  });
</script>


답변

핀치 투 줌에 대한 이전 답변을 시도했습니다.

document.documentElement.addEventListener('touchstart', function (event) {
    if (event.touches.length > 1) {
        event.preventDefault();
    }
}, false);

그러나 때로는 event.touches.length> 1 일 때 화면이 여전히 확대
되어 화면에서 손가락이 움직이지 않도록 touchmove 이벤트를 사용하는 것이 가장 좋습니다. 코드는 다음과 같습니다.

document.documentElement.addEventListener('touchmove', function (event) {
    event.preventDefault();
}, false);

그것이 도움이되기를 바랍니다.