tắt chế độ xem phóng to thu nhỏ iOS 10+ safari?


164

Tôi đã cập nhật iPhone 6 cộng với iOS phiên bản 10 beta của tôi và chỉ phát hiện ra rằng trong safari di động, bạn có thể phóng to bất kỳ trang web bằng cách khai thác đôi hoặc véo IGNORE các user-scalable=nomã trong thẻ meta. Tôi không biết đó là lỗi hay tính năng. Nếu nó được coi là một tính năng, làm thế nào để chúng tôi vô hiệu hóa chế độ xem phóng to thu nhỏ iOS 10?


được cập nhật trên phiên bản iOS 11/12, safari iOS 11 và iOS 12 vẫn KHÔNG tôn trọng user-scalable=nothẻ meta.

trang web github di động trên Safari


2
Một tính năng trợ năng: Lưu ý trong Safari trên iOS 10 twitter.com/thomasfuchs/status/742531231007559680/photo/1
ErikE

87
Không, không phải vậy. Đó là thực tế xấu cho nội dung web bình thường. Đối với các ứng dụng web, hành vi thu phóng mặc định hoàn toàn có thể làm hỏng khả năng sử dụng. Ví dụ, không ai muốn phóng to nút tăng kênh vì họ đã gõ hai lần, cũng không phóng to một phần của trò chơi video vì họ gõ hai lần nút nhảy. Có một lý do mà tính năng này đã được thêm vào ngay từ đầu và không có ý nghĩa gì để phá vỡ khả năng sử dụng đối với mọi người chỉ vì một vài "nhà thiết kế web" không biết họ đang làm gì. Hãy hét lên với các nhà thiết kế trang web và thoát khỏi trình duyệt.
dgatwood

36
Nói rằng đó là "thực tiễn xấu" là một ý kiến ​​và không thay đổi thực tế rằng Apple khăng khăng lấy các tiêu chuẩn web mà cộng đồng dành hàng tháng / năm / thập kỷ để thực hiện đa nền tảng và lấy một thứ tào lao khổng lồ. Tại sao Apple nên ra lệnh rằng các nhà thiết kế web không biết họ đang làm gì? Lý lẽ khủng khiếp.
samrap

2
Cá nhân, tôi nghĩ rằng điều này bắt nguồn từ mã soạn sẵn trực tuyến nơi các nhà phát triển chỉ sao chép và dán một cách mù quáng mà không biết mục đích của mã là gì.
William Isted

7
Câu trả lời rất đơn giản, Apple: biến việc vô hiệu hóa thẻ meta thành cài đặt trợ năng tắt mặc định. Những người cần nó, sẽ có nó, mà không trừng phạt những người không.
Ruben Martinez Jr.

Câu trả lời:


94

Có thể ngăn quy mô trang web trong safari trên iOS 10, nhưng nó sẽ liên quan đến nhiều công việc hơn từ phía bạn. Tôi đoán lập luận là một mức độ khó sẽ ngăn các nhà phát triển hàng hóa bỏ "người dùng có thể mở rộng = không" vào mọi thẻ xem và khiến mọi thứ trở nên khó khăn đối với người dùng bị suy giảm thị lực.

Tuy nhiên, tôi muốn thấy Apple thay đổi cách triển khai của họ để có một cách đơn giản (thẻ meta) để vô hiệu hóa hai lần nhấn để thu phóng. Hầu hết những khó khăn liên quan đến sự tương tác đó.

Bạn có thể dừng pinch-to-zoom bằng một cái gì đó như thế này:

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

Lưu ý rằng nếu bất kỳ mục tiêu sâu hơn nào gọi stopPropagation trong sự kiện, sự kiện sẽ không đến được tài liệu và hành vi mở rộng sẽ không bị ngăn chặn bởi người nghe này.

Vô hiệu hóa hai lần nhấn để thu phóng là tương tự. Bạn tắt bất kỳ lần nhấn nào trên tài liệu xảy ra trong vòng 300 mili giây của lần nhấn trước:

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

Nếu bạn không thiết lập đúng các thành phần biểu mẫu của mình, việc tập trung vào đầu vào sẽ tự động thu phóng và vì bạn hầu như đã vô hiệu hóa thu phóng thủ công, giờ đây sẽ gần như không thể làm mờ. Đảm bảo kích thước phông chữ đầu vào là> = 16px.

Nếu bạn đang cố gắng giải quyết vấn đề này trong WKWebView trong ứng dụng gốc, thì giải pháp đưa ra ở trên là khả thi, nhưng đây là một giải pháp tốt hơn: https://stackoverflow.com/a/31943976/661418 . Và như đã đề cập trong các câu trả lời khác, trong iOS 10 beta 6, Apple hiện đã cung cấp một lá cờ để tôn vinh thẻ meta.

Cập nhật tháng 5 năm 2017: Tôi đã thay thế phương pháp 'kiểm tra độ dài chạm trên touchstart' cũ để vô hiệu hóa pinch-zoom bằng cách tiếp cận 'check event.scale trên touchmove' đơn giản hơn. Nên đáng tin cậy hơn cho mọi người.


3
Lưu ý rằng hack touchstart không nhất quán ... và nếu bạn cố gắng vượt qua nó, bạn sẽ bị mắc kẹt trong trạng thái rất khó chịu
Sam Saffron

5
Ví dụ. ứng dụng bản đồ toàn màn hình, có một tính năng thu phóng được mã hóa cứng trong ứng dụng bản đồ (Google Maps JS, Tờ rơi, v.v.). Google khuyên nên thêm thẻ meta <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />và nếu trình duyệt không tôn trọng thẻ meta thì đó là thiết kế trình duyệt rất tệ. Một thứ khác giống như thiết kế rất tệ là hành động lùi / tiến bằng cách trượt, điều này không thể ngăn chặn được trong iOS 9/10. Nó phá vỡ các hành động kéo nghiêm trọng bên trong ứng dụng web.
Timo Kähkönen

4
Nếu người dùng bắt đầu kéo bằng một ngón tay thì đặt ngón tay thứ hai lên màn hình sẽ có thể chụm lại. Bạn có thể vô hiệu hóa cả phóng to và cuộn với preventDefaultbật touchmove. Bạn không thể (hoàn toàn) vô hiệu hóa thu phóng mà không tắt cuộn.
Paolo

10
Ồ, phần này (tôi sẽ dán ở đây) cực kỳ hữu ích với tôi. Tôi chưa thấy điều này được đề cập bởi bất cứ ai khác MỌI NƠI trên internet. Tôi đã mất nhiều giờ để khắc phục vấn đề này. Tôi thực sự thất vọng về các lựa chọn thiết kế UX của Apple về điều này, trong đó hình thức tự động phóng to nhưng sau đó không thu nhỏ lại. If you don't set up your form elements right, focusing on an input will auto-zoom, and since you have mostly disabled manual zoom, it will now be almost impossible to unzoom. Make sure the input font size is >= 16px.
Ryan

6
Có vẻ như điều này không hoạt động trong iOS 12 nữa. Bất kỳ ý tưởng làm thế nào để làm cho điều này làm việc cho iOS 12?
TJR

78

Đây là một tính năng mới trong iOS 10.

Từ ghi chú phát hành iOS 10 beta 1:

  • Để cải thiện khả năng truy cập trên các trang web trong Safari, giờ đây người dùng có thể chụm lại để phóng to ngay cả khi một trang web đặt user-scalable=notrong chế độ xem.

Tôi hy vọng chúng ta sẽ sớm thấy một tiện ích bổ sung JS để vô hiệu hóa điều này theo một cách nào đó.


4
@Onza: Tôi không nghĩ nó tệ. Tôi nghĩ nó tốt. Vô hiệu hóa pinch / phóng to (hành vi người dùng mặc định) được coi là xấu và rất nhiều trang web di động làm điều đó. Trường hợp người dùng duy nhất được chấp nhận sẽ là một ứng dụng web thực sự trông giống như một ứng dụng.
đồ trang sức

6
Xấu .. Tôi thay đổi chế độ xem bằng js và chỉ thu phóng khối khi một số thành phần được chọn trên trang web bây giờ bị hỏng do "quyết định" này. Nếu ai đó quyết định chặn nó - có một lý do.
Zhenya

9
@Karlth thật tuyệt vời cho một nhà phát triển trò chơi
Sandeep

14
Tôi có iOS 10.0.2, người dùng có thể mở rộng = không không vô hiệu hóa thu phóng nữa trên trang web của chúng tôi ... Vấn đề chính của chúng tôi về thu phóng là với menu bên cố định của chúng tôi .. Nó chỉ phá vỡ bố cục .. Có ý tưởng hay giải pháp nào về điều này không? Tôi hiểu thu phóng tốt cho khả năng truy cập, chúng tôi đã thu phóng có sẵn trên các phần cụ thể của trang web của chúng tôi bằng cách sử dụng các sự kiện js (búa) & css .. Tôi không hiểu tại sao một quy tắc phải được áp đặt cho mọi người, có vẻ như Cảnh sát PC đang bắt đầu để chiếm lấy thế giới dev của chúng ta là tốt?!
webkit

49
"Trường hợp người dùng duy nhất được chấp nhận sẽ là một ứng dụng web thực sự trông giống như một ứng dụng." - và đây là, như bạn đã nói, một trường hợp sử dụng thực tế, có thể chấp nhận được, đó không phải hiếm ..
Florrie

21

Tôi đã có thể khắc phục điều này bằng cách sử dụng thuộc tính touch-actioncss trên các thành phần riêng lẻ. Hãy thử thiết lập touch-action: manipulation;trên các yếu tố thường được nhấp vào, như liên kết hoặc nút.


1
"Thao tác" không ngăn chặn thu phóng pinch, chỉ thu phóng hai lần.
Moos

4
Đây phải là câu trả lời được chấp nhận. bạn có thể sử dụng touch-action: none;để kiểm soát tất cả các cử chỉ của mình.
Guy Sopher

3
điều này thật tuyệt - vô hiệu hóa thu phóng hai lần trong khi thu phóng pinch, điều này NÊN được coi là một cử chỉ - không nên chạm hai lần. 1 con chó là một con chó. 1 con chó + 1 con chó không đưa đón không gian. Nó tạo ra 2 con chó và chúng làm những việc mà bạn mong đợi 2 con chó sẽ làm. Tôi chưa bao giờ mong đợi 2 con chó sẽ là một tàu con thoi. Không bao giờ.
Larry

5
@GuySopher iOS khôngtouch-action: none chỉ cung cấp manipulatoinmà còn gây ra sự cố phóng to thu nhỏ.
nhân

14

Có vẻ như hành vi này được cho là đã thay đổi trong phiên bản beta mới nhất, tại thời điểm viết là phiên bản beta 6.

Từ ghi chú phát hành cho iOS 10 Beta 6:

WKWebViewbây giờ mặc định tôn trọng user-scalable=notừ một khung nhìn. Khách hàng của WKWebViewcó thể cải thiện khả năng tiếp cận và cho phép người dùng pinch-to-zoom trên tất cả các trang bằng cách thiết lập các WKWebViewConfiguration tài sản ignoresViewportScaleLimitsđể YES.

Tuy nhiên, trong thử nghiệm (rất hạn chế) của tôi, tôi chưa thể xác nhận đây là trường hợp.

Chỉnh sửa: đã xác minh, user-scalable=nomặc định iOS 10 Beta 6 tôn trọng tôi.


11
10.0.1 ở đây. Không tôn trọng nó. Apple đã loại bỏ các tính năng mà mọi người cần ..
lifwanian

1
Điều này đề cập đến WKWebView không phải Safari. Nguồn: Một trong những ứng dụng bản đồ của chúng tôi đã bị hỏng và chúng tôi không biết cách khắc phục.
Fabio Poloni

Aha! Xin lỗi, tôi đã đến đây khi tìm kiếm giải pháp cho cùng một lỗi / tính năng WKWebViewvà loại giả định rằng câu hỏi ban đầu đã hỏi về WKWebViewkhi viết câu trả lời của tôi. Vì vậy, tôi cho rằng trong một trong những phiên bản beta đầu tiên, Apple đã thay đổi hành vi của cả WKWebViewSafari và di động, sau đó ở phiên bản beta 6, họ đã hoàn nguyên hành vi của WKWebViewnhưng vẫn giữ nó cho Safari di động.
Cellane

1
10.0.2 không tôn trọng user-scalable=no. Tôi không chắc tại sao họ lại hoàn tác việc này, chỉ để đưa nó trở lại, chỉ để xóa nó một lần nữa.
Aidan Hakimian

13

Cách giải quyết mà tác phẩm trong Mobile Safari tại thời điểm này trong văn bản, là phải có các đối số thứ ba trong addEventListenerbe { passive: false }, do đó vẻ workaround đầy đủ như thế này:

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

Bạn có thể muốn kiểm tra nếu các tùy chọn được hỗ trợ để vẫn tương thích ngược.


3
Bất cứ ai cũng đã thử điều này trên iOS 12? Tôi đã thêm mã ở trên và nó không làm gì cho ứng dụng web của tôi. Vẫn có thể phóng to Safari ngu ngốc này. Thẻ meta viewport của tôi trông như thế này btw : <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">.
Patrick DaVader

1
@PatrickDaVader Yep, không thể tìm thấy bất kỳ giải pháp hoạt động nào cho iOS 12 Safari. Bắt say sóng từ tất cả các phóng to không ngừng.
Jamie Birch

1
Cái này hoạt động trong iOS 13. Các thẻ <meta> của tôi bao gồm: <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" /><meta name="HandheldFriendly" content="true">
Sterling Bourne

1
@SterlingBourne Sao chép thiết lập của bạn. Có hoạt động, nhưng chỉ thích 90% thời gian. Không chắc chắn tại sao không phải tất cả các thời gian.
Hillcow

1
@SterlingBourne phản hồi làm việc cho tôi! Cảm ơn. Anh ta nên đăng nó dưới dạng câu trả lời thay vì bình luận để có thể bình chọn <meta name = "viewport" content = "width = device-width, init-scale = 1, Maximum-scale = 1, viewport-fit = cover, user-scalable = no, co-to-fit = no "/> và <meta name =" PortableFriendly "content =" true ">
Gene Black

8

Tôi đã dành khoảng một giờ để tìm kiếm một tùy chọn javascript mạnh mẽ hơn và không tìm thấy tùy chọn nào. Nó chỉ xảy ra rằng trong vài ngày qua, tôi đã loay hoay với búa.js (Hammer.js là một thư viện cho phép bạn thao tác dễ dàng với tất cả các loại sự kiện chạm) và hầu như không làm được những gì tôi đang cố gắng làm.

Với sự cảnh báo đó và hiểu tôi không phải là một chuyên gia javascript, đây là một giải pháp mà tôi đã đưa ra về cơ bản là tận dụng búa.js để ghi lại các sự kiện pinch-zoom và chạm hai lần, sau đó đăng nhập và loại bỏ chúng.

Hãy chắc chắn rằng bạn đã đưa búa.js vào trang của mình và sau đó thử dán javascript này vào đầu ở đâu đó:

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


Tôi cũng đã cố gắng giải quyết vấn đề này khi làm việc với búa.js và có thể xác nhận rằng tôi có thể ngăn việc thu phóng khung nhìn bằng cách thêm một .preventDefaultvào tất cả các trình xử lý cử chỉ búa. Tôi đang sử dụng vuốt / pinch / pan / tap với nhau, tôi đã thêm nó vào tất cả các trình xử lý, tôi không biết liệu có một công cụ cụ thể nào đó đang thực hiện công việc không.
Conan

6

Tôi đã thử câu trả lời trước về pinch-to-zoom

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

tuy nhiên đôi khi màn hình vẫn phóng to khi event.touches.length> 1 Tôi phát hiện ra cách tốt nhất là sử dụng sự kiện touchmove, để tránh bất kỳ ngón tay nào di chuyển trên màn hình. Mã sẽ giống như thế này:

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

Hy vọng nó sẽ giúp.


7
Điều này chỉ hoạt động nếu ứng dụng của bạn phù hợp hoàn hảo ... nếu bạn có nội dung có thể cuộn được thì nó không hoạt động ... vẫn tốt cho một số tình huống.
eljamz

8
Điều này thậm chí vô hiệu hóa cuộn trên trang web .. BAD
Gags

@eljamz cảm ơn vì đã cho tôi biết và vâng .. ứng dụng của tôi hoàn toàn phù hợp trên màn hình.
Chihying Wu

@Gags Tôi chưa kiểm tra chức năng cuộn, cảm ơn vì đã cho tôi biết.
Chihying Wu

6

Kiểm tra hệ số tỷ lệ trong sự kiện touchove sau đó ngăn sự kiện chạm.

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

2
iOS 13 thay đổi sai thành {thụ động: sai}
wayofthefuture 23/12/19

6

Chúng tôi có thể có được mọi thứ chúng tôi muốn bằng cách đưa vào một quy tắc kiểu và bằng cách chặn các sự kiện thu phóng:

$(function () {
  if (!(/iPad|iPhone|iPod/.test(navigator.userAgent))) return
  $(document.head).append(
    '<style>*{cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}</style>'
  )
  $(window).on('gesturestart touchmove', function (evt) {
    if (evt.originalEvent.scale !== 1) {
      evt.originalEvent.preventDefault()
      document.body.style.transform = 'scale(1)'
    }
  })
})

✔ Tắt thu phóng pinch.

✔ Tắt thu phóng hai lần.

✔ Cuộn không bị ảnh hưởng.

✔ Tắt tính năng tô sáng (được kích hoạt, trên iOS, theo quy tắc kiểu).

THÔNG BÁO: Tinh chỉnh phát hiện iOS theo ý thích của bạn. Thêm về điều đó ở đây .


Lời xin lỗi đến lukejacksonPiotr Kowalski , có câu trả lời xuất hiện dưới dạng sửa đổi trong đoạn mã trên.


Điều này hoạt động trên trình giả lập iPad của tôi đang chạy iOS 11.2. Trên iPad thực sự của tôi chạy iOS 11.3, nó không hoạt động. Tôi đã thêm một console.log để đảm bảo các sự kiện được kích hoạt và vì vậy chúng xuất hiện trong bảng điều khiển. Đó là một cái gì đó để làm với iOS 11.3? Hoặc với các thiết bị thực sự?
Mathieu R.

1
@MathieuR. Đây là một vấn đề iOS 11.3. Nó có thể được sửa chữa bằng cách sử dụng một trong các addEventListenercâu trả lời dựa trên và chuyển { passive: false }làm optionstham số thay vì false. Tuy nhiên, để tương thích ngược, bạn cần vượt qua falsetrừ khi trường passivetùy chọn được hỗ trợ. Xem developer.mozilla.org/en-US/docs/Web/API/EventTarget/
Kẻ

@JoshGallagher Bạn có thể cung cấp một ví dụ làm việc? Trên iOS11 không có câu trả lời nào phù hợp với tôi.
Mick

'Cử chỉ' -> notifyDefault hoạt động với tôi tại thời điểm viết trên iOS 12,2
Michael Camden

5

Tôi đã đưa ra một giải pháp khá ngây thơ, nhưng nó có vẻ hiệu quả. Mục tiêu của tôi là ngăn chặn các cú đúp ngẫu nhiên được hiểu là phóng to, trong khi giữ cho độ chụm để thu phóng hoạt động cho khả năng tiếp cận.

Ý tưởng là đo thời gian giữa lần đầu tiên touchstartvà lần thứ hai touchendtrong một lần chạm hai lần và sau đó diễn giải lần cuối touchendlà nhấp chuột nếu độ trễ quá nhỏ. Trong khi ngăn chặn thu phóng ngẫu nhiên, phương pháp này dường như giữ cho danh sách cuộn không bị ảnh hưởng, điều này thật tuyệt. Không chắc chắn nếu tôi không bỏ lỡ bất cứ điều gì mặc dù.

let preLastTouchStartAt = 0;
let lastTouchStartAt = 0;
const delay = 500;

document.addEventListener('touchstart', () => {
  preLastTouchStartAt = lastTouchStartAt;
  lastTouchStartAt = +new Date();
});
document.addEventListener('touchend', (event) => {
  const touchEndAt = +new Date();
  if (touchEndAt - preLastTouchStartAt < delay) {
    event.preventDefault();
    event.target.click();
  }
});

Lấy cảm hứng từ một ý chính từ mutewintercâu trả lời của Joseph .


5

Trong trường hợp cụ thể của tôi, tôi đang sử dụng Babylon.js để tạo cảnh 3D và toàn bộ trang của tôi bao gồm một khung hình toàn màn hình. Công cụ 3D có chức năng thu phóng riêng nhưng trên iOS, pinch-to-zoom can thiệp vào điều đó. Tôi đã cập nhật câu trả lời @Joseph để khắc phục vấn đề của mình. Để vô hiệu hóa nó, tôi nhận ra rằng tôi cần truyền {passive: false} làm tùy chọn cho người nghe sự kiện. Đoạn mã sau hoạt động với tôi:

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

Trường hợp sử dụng của tôi cũng là một cảnh 3d toàn trang với các điều khiển pinch tùy chỉnh. Tôi đã bị chìm đắm nếu không có cách giải quyết nào cho Apple rõ ràng bỏ qua quy mô người dùng: không có meta.
Nick Bilyk

1

Nghe có vẻ kỳ lạ, ít nhất là đối với Safari trong iOS 10.2, chạm hai lần để thu phóng bị vô hiệu hóa một cách kỳ diệu nếu thành phần của bạn hoặc bất kỳ tổ tiên nào của nó có một trong những điều sau đây:

  1. Trình nghe onClick - nó có thể là một noop đơn giản.
  2. Một cursor: pointerbộ trong CSS

Làm thế nào về độ chụm?
Sam Su

Thật không may, pinch để phóng to không được bao phủ bởi giải pháp này. Vì vậy, chúng tôi đã sử dụng giải pháp được đề xuất trong: stackoverflow.com/a/39594334/374196
mariomc

Không làm việc cho tôi. Tôi đang sử dụng 10.2.1 Beta 4 trên iPod Touch bằng trang thử nghiệm này và nhấn đúp vào bất kỳ zoom hình vuông màu xám nào: jsbin.com/kamuta/quiet
robocat

1
Tôi có điều này trên một nhịp trong một ứng dụng phản ứng và nó không hoạt động.
FMD

1

Thu phóng không chủ ý có xu hướng xảy ra khi:

  • Một người dùng chạm hai lần vào một thành phần của giao diện
  • Một người dùng tương tác với chế độ xem bằng hai hoặc nhiều chữ số (pinch)

Để ngăn chặn hành vi chạm hai lần, tôi đã tìm thấy hai cách giải quyết rất đơn giản:

<button onclick='event.preventDefault()'>Prevent Default</button>
<button style='touch-action: manipulation'>Touch Action Manipulation</button>

Cả hai điều này đều ngăn Safari (iOS 10.3.2) phóng to nút. Như bạn có thể thấy một cái chỉ là JavaScript, cái còn lại chỉ là CSS. Sử dụng hợp lý.

Đây là bản demo: https://codepen.io/lukejacksonn/pen/QMELXQ

Tôi đã không cố gắng ngăn chặn hành vi chèn ép (chủ yếu), vì tôi có xu hướng không tạo giao diện cảm ứng đa điểm cho web và thứ hai tôi đã làm tròn ý tưởng rằng có lẽ tất cả các giao diện bao gồm giao diện người dùng ứng dụng gốc phải là "pinch to zoom" -able ở những nơi. Tôi vẫn sẽ thiết kế để tránh người dùng phải làm điều này để làm cho giao diện người dùng của bạn có thể truy cập được bằng mọi giá.


1

Tìm thấy công việc đơn giản này xuất hiện để ngăn nhấp đúp để thu phóng:

    // Convert touchend events to click events to work around an IOS 10 feature which prevents
    // developers from using disabling double click touch zoom (which we don't want).
    document.addEventListener('touchend', function (event) {
        event.preventDefault();
        $(event.target).trigger('click');
    }, false);

1

Theo yêu cầu, tôi đã chuyển nhận xét của mình sang câu trả lời để mọi người có thể phản hồi lại:

Điều này hoạt động 90% thời gian cho iOS 13:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, viewport-fit=cover, user-scalable=no, shrink-to-fit=no" />

<meta name="HandheldFriendly" content="true">


0

Tôi đã kiểm tra tất cả các câu trả lời trên trong thực tế với trang của mình trên iOS (iPhone 6, iOS 10.0.2), nhưng không thành công. Đây là giải pháp làm việc của tôi:

$(window).bind('gesturestart touchmove', function(event) {
    event = event.originalEvent || event;
    if (event.scale !== 1) {
         event.preventDefault();
         document.body.style.transform = 'scale(1)'
    }
});

Thật không may, điều này chỉ hoạt động khi trang của bạn phù hợp hoàn hảo, không phải khi bạn có nội dung có thể cuộn
Giày

Hừm. Điều này hoạt động tốt với nội dung có thể cuộn, theo kinh nghiệm của tôi (iOS 10.3).
jeff_mcmahan

0

điều này làm việc cho tôi:

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

Tôi đã thử điều này, nó đã ngăn chặn việc phóng to pinch, tuy nhiên nó vô hiệu hóa cuộn cảm ứng của chế độ xem để bạn không thể cuộn trang lên và xuống nữa.
TGR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.