ปิดใช้งานการซูม viewport ใน iOS 10+ ซาฟารีหรือไม่


164

ฉันได้อัปเดต iPhone ของฉัน 6 บวกเป็น iOS 10 รุ่นเบต้าและก็พบว่าในซาฟารีมือถือคุณสามารถซูมหน้าเว็บใด ๆ โดยการแตะหรือจับIGNOREuser-scalable=noรหัสในเมตาแท็ก ฉันไม่รู้ว่ามันเป็นบั๊กหรือฟีเจอร์ หากถือเป็นฟีเจอร์เราจะปิดการใช้งาน viewport zoom iOS 10 safari ได้อย่างไร


อัปเดตในรุ่น iOS 11/12, iOS 11 และ iOS 12 ซาฟารียังคงไม่เคารพuser-scalable=noเมตาแท็ก

เว็บไซต์ GitHub มือถือบน Safari


2
คุณลักษณะการช่วยสำหรับการเข้าถึง: โน้ตใน Safari บน iOS 10 twitter.com/thomasfuchs/status/742531231007559680/photo/1
ErikE

87
ไม่มันไม่ใช่ เป็นการปฏิบัติที่ไม่ดีสำหรับเนื้อหาเว็บปกติ สำหรับเว็บแอปพฤติกรรมการซูมเริ่มต้นสามารถทำลายการใช้งานได้อย่างสมบูรณ์ ตัวอย่างเช่นไม่มีใครต้องการซูมปุ่มขึ้นช่องเพราะพวกเขาเคาะมันสองครั้งหรือซูมเข้าที่ส่วนหนึ่งของวิดีโอเกมเพราะพวกเขาแตะปุ่มกระโดดสองครั้ง มีเหตุผลที่คุณสมบัตินี้ถูกเพิ่มเข้ามาในตอนแรกและมันก็ไม่มีเหตุผลที่จะทำลายการใช้งานสำหรับทุกคนเพียงเพราะ "นักออกแบบเว็บไซต์" สองสามคนไม่ทราบว่าพวกเขากำลังทำอะไรอยู่ ไปกรีดร้องที่นักออกแบบเว็บไซต์และเลิกทำลายเบราว์เซอร์
dgatwood

36
การกล่าวว่าเป็น "การปฏิบัติที่ไม่ดี" เป็นความคิดเห็นและไม่เปลี่ยนความจริงที่ว่า Apple ยึดมั่นในการใช้มาตรฐานเว็บที่ชุมชนใช้เวลาเป็นเดือน / ปี / ทศวรรษในการติดตั้งข้ามแพลตฟอร์ม ทำไม Apple จึงบอกให้ผู้ออกแบบเว็บไซต์ไม่รู้ว่ากำลังทำอะไรอยู่ อาร์กิวเมนต์แย่มาก
samrap

2
โดยส่วนตัวฉันคิดว่าสิ่งนี้เกิดจากรหัสสำเร็จรูปออนไลน์ที่ซึ่ง devs เพียงคัดลอกและวางสุ่มสี่สุ่มห้าโดยไม่ทราบว่าจุดประสงค์ของรหัสคืออะไร
William Isted

7
คำตอบนั้นง่าย Apple ทำให้การปิดใช้งานเมตาแท็กเป็นการตั้งค่าการช่วยสำหรับการเข้าถึงเริ่มต้น ผู้ที่ต้องการมันจะได้โดยไม่ต้องลงโทษผู้ที่ไม่ต้องการ
Ruben Martinez Jr.

คำตอบ:


94

เป็นไปได้ที่จะป้องกันการปรับขนาดหน้าเว็บในซาฟารีบน iOS 10 แต่จะมีส่วนร่วมกับคุณมากขึ้น ฉันเดาว่าเหตุผลคือระดับของความยากลำบากควรหยุด devs ผู้ขนส่งสินค้าไม่ให้วาง "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);

หากคุณไม่ตั้งค่าองค์ประกอบแบบฟอร์มของคุณให้ถูกต้องการโฟกัสไปที่อินพุตจะเป็นการซูมอัตโนมัติและเนื่องจากคุณปิดใช้งานการซูมด้วยตนเองเป็นส่วนใหญ่ตอนนี้จะเป็นไปไม่ได้ที่จะเลิกซูม ตรวจสอบให้แน่ใจว่าขนาดแบบอักษรที่ป้อนคือ> = 16px

ถ้าคุณกำลังพยายามที่จะแก้ปัญหานี้ใน WKWebView ใน app พื้นเมือง, การแก้ปัญหาดังกล่าวข้างต้นจะทำงานได้ แต่นี้เป็นทางออกที่ดีกว่า: https://stackoverflow.com/a/31943976/661418 และดังที่กล่าวไว้ในคำตอบอื่น ๆ ใน iOS 10 เบต้า 6 ตอนนี้ Apple ได้จัดทำธงเพื่อเป็นเกียรติแก่เมตาแท็ก

อัปเดตพฤษภาคม 2560:ฉันแทนที่ 'การตรวจสอบความยาวสัมผัสบน touchstart' แบบเก่าของการปิดใช้งานการซูมด้วยการบีบด้วยการตรวจสอบเหตุการณ์ที่ง่ายขึ้น น่าเชื่อถือมากขึ้นสำหรับทุกคน


3
โปรดทราบว่าการแฮ็คหน้าจอสัมผัสนั้นไม่สอดคล้อง ... และหากคุณจัดการเพื่อก้าวเท้าเลี่ยงมันคุณจะติดอยู่ในสถานะที่อึดอัดมาก
Sam Saffron

5
เช่น. แอพการทำแผนที่เต็มหน้าจอมีคุณสมบัติการซูมอย่างหนักในแอปพลิเคชั่นการทำแผนที่ (Google Maps JS, Leaflet เป็นต้น) Google แนะนำให้เพิ่มเมตาแท็ก<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />และหากเบราว์เซอร์ไม่เคารพเมตาแท็กมันเป็นการออกแบบเบราว์เซอร์ที่แย่มาก การออกแบบที่ไม่ดีเช่นนี้คือการย้อนกลับ / ไปข้างหน้าโดยการเลื่อนซึ่งไม่สามารถป้องกันได้ใน iOS 9/10 มันแบ่งการกระทำที่ลากอย่างรุนแรงภายในเว็บแอพพลิเคชัน
Timo Kähkönen

4
หากผู้ใช้เริ่มลากด้วยนิ้วเดียวแล้ววางนิ้วที่สองบนหน้าจอจะสามารถซูม - บีบนิ้วได้ คุณสามารถปิดการใช้งานทั้งการซูมและเลื่อนที่มีในpreventDefault touchmoveคุณไม่สามารถปิดใช้งานการซูมได้อย่างสมบูรณ์โดยไม่ต้องปิดการใช้งานการเลื่อน
เปาโล

10
ว้าวส่วนนี้ (ฉันจะวางที่นี่) เป็นประโยชน์กับฉันอย่างยิ่ง ฉันไม่เคยเห็นใครพูดถึงสิ่งนี้บนอินเทอร์เน็ต ฉันใช้เวลาหลายชั่วโมงเพื่อแก้ไขปัญหานี้ ฉันผิดหวังในตัวเลือกการออกแบบ UX ของ Apple เกี่ยวกับสิ่งนี้ซึ่งเป็นรูปแบบการซูมอัตโนมัติ แต่ไม่ย่อกลับ 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
ดูเหมือนว่านี่จะไม่ทำงานใน iOS 12 อีกต่อไป มีความคิดใดที่จะทำให้ iOS 12 ทำงานได้อย่างไร
TJR

78

นี่คือคุณสมบัติใหม่ใน iOS 10

จากบันทึกประจำรุ่น iOS 10 เบต้า 1:

  • เพื่อปรับปรุงการช่วยสำหรับการเข้าถึงเว็บไซต์ใน Safari ผู้ใช้สามารถกดเพื่อซูมได้แม้ในขณะที่เว็บไซต์กำหนดuser-scalable=noในวิวพอร์ต

ฉันคาดหวังว่าเราจะเห็นส่วนเสริม JS ในไม่ช้าเพื่อปิดการใช้งานในทางใดทางหนึ่ง


4
@Onza: ฉันไม่คิดว่ามันจะไม่ดี ฉันคิดว่ามันดี การปิดใช้งานการบีบนิ้ว / ซูม (พฤติกรรมผู้ใช้เริ่มต้น) ถือว่าไม่ดีและเว็บไซต์มือถือจำนวนมากทำ กรณีผู้ใช้ที่ยอมรับได้เพียงอย่างเดียวจะเป็นเว็บแอพตัวจริงที่มีลักษณะและความรู้สึกเหมือนแอพ
wouterds

6
ไม่ดี .. ฉันเปลี่ยนวิวพอร์ตโดยใช้ js และบล็อคซูมเฉพาะเมื่อมีการเลือกองค์ประกอบบางอย่างในเว็บไซต์ตอนนี้มันเสียเนื่องจาก "การตัดสินใจ" นี้ หากมีคนตัดสินใจปิดกั้น - มีเหตุผล
Zhenya

9
@Karlth เป็นเตียงสำหรับนักพัฒนาเกม
Sandeep

14
ฉันมี IOS 10.0.2 ผู้ใช้สามารถปรับขนาดได้ = ไม่ไม่ปิดการใช้งานการซูมบนเว็บไซต์ของเราอีกต่อไป ... ปัญหาหลักของเราคือการซูมด้วยเมนูด้านคงที่ของเรา .. มันแค่เลย์เอาต์เค้าโครง .. ฉันเข้าใจว่าการซูมนั้นดีสำหรับการเข้าถึงเราทำให้การซูมสามารถใช้ได้ในบางส่วนของเว็บไซต์ของเราโดยใช้ js events (hammer) & css .. ฉันไม่เห็นว่าทำไมต้องมีกฎบังคับสำหรับทุกคนดูเหมือนว่าพีซีกำลังเริ่มตำรวจ ที่จะครอบครองโลก dev ของเราด้วย!
webkit

50
"กรณีผู้ใช้ที่ยอมรับได้เพียงอย่างเดียวคือแอปพลิเคชันเว็บจริงที่มีลักษณะและความรู้สึกเหมือนแอพ" - และนี่คือกรณีที่คุณใช้งานจริงและยอมรับได้ซึ่งไม่ได้เป็นสิ่งที่หายาก ..
Florrie

21

ฉันสามารถแก้ไขได้โดยใช้touch-actionคุณสมบัติ css ในแต่ละองค์ประกอบ ลองตั้งค่าtouch-action: manipulation;องค์ประกอบที่มีการคลิกทั่วไปเช่นลิงก์หรือปุ่ม


1
"การจัดการ" ไม่ได้ป้องกันการซูมด้วยนิ้วเพียงซูมสองครั้งเท่านั้น
Moos

4
นี่ควรเป็นคำตอบที่ยอมรับได้ คุณสามารถใช้touch-action: none;เพื่อควบคุมท่าทางทั้งหมดด้วยตัวคุณเอง
Guy Sopher

4
นี่เป็นสิ่งที่ดี - ปิดการใช้งานการซูมด้วยการแตะสองครั้งในขณะที่ออกจากการซูมด้วยนิ้วซึ่งควรถือว่าเป็นท่าทาง - การแตะสองครั้งไม่ควร สุนัข 1 ตัวเป็นสุนัข สุนัข 1 ตัว + สุนัข 1 ตัวไม่ได้ทำกระสวยอวกาศ มันทำให้สุนัข 2 ตัวและพวกเขาทำสิ่งต่าง ๆ ที่คุณคาดหวังว่าจะได้สุนัข 2 ตัว ฉันไม่เคยคาดหวังว่าสุนัข 2 ตัวจะเป็นกระสวยอวกาศ ไม่เคย
Larry

5
@GuySopher iOS ไม่ได้ให้บริการtouch-action: noneเพียงอย่างเดียวmanipulatoinซึ่งทำให้เกิดปัญหาการบีบนิ้วซูมเหมือนเดิม
humanityANDpeace

14

ปรากฏว่าพฤติกรรมนี้มีการเปลี่ยนแปลงที่คาดคะเนในเบต้าล่าสุดซึ่งในขณะที่เขียนเป็นเบต้า 6

จากบันทึกประจำรุ่นสำหรับ iOS 10 Beta 6:

WKWebViewตอนนี้เริ่มต้นที่จะเคารพuser-scalable=noจากวิวพอร์ต ลูกค้าWKWebViewสามารถปรับปรุงการเข้าถึงและให้ผู้ใช้สามารถหยิกเพื่อซูมเข้าบนหน้าเว็บทั้งหมดโดยการตั้งค่าWKWebViewConfiguration คุณสมบัติการignoresViewportScaleLimitsYES

อย่างไรก็ตามในการทดสอบของฉัน (มี จำกัด มาก) ฉันยังไม่สามารถยืนยันได้ว่าเป็นกรณีนี้

แก้ไข: ยืนยันแล้ว, iOS 10 Beta 6 เคารพuser-scalable=noตามค่าเริ่มต้นสำหรับฉัน


11
10.0.1 ที่นี่ ไม่เคารพมัน เป็นอะไรกับแอปเปิ้ลได้รับการกำจัดของคุณลักษณะที่ทุกคนต้องการ ..
lifwanian

1
นี่หมายถึงWKWebView ไม่ให้กับ Safari แหล่งที่มา: หนึ่งในปพลิเคชันแผนที่ของเรายากจนและเรามีไม่มีความคิดวิธีการที่จะแก้ไขได้
Fabio Poloni

Aha! ขอโทษฉันมาที่นี่เมื่อค้นหาวิธีแก้ปัญหาข้อบกพร่อง / คุณสมบัติเดียวกันWKWebViewและคิดว่าคำถามเดิมถามWKWebViewเมื่อเขียนคำตอบของฉัน ดังนั้นฉันจึงคิดว่าในช่วงหนึ่งในรุ่นเบต้าแรก Apple เปลี่ยนพฤติกรรมของทั้งสองWKWebViewและ Safari มือถือจากนั้นในรุ่น 6 พวกเขากลับพฤติกรรมของWKWebViewแต่เก็บไว้สำหรับ Safari มือถือ
Cellane

1
10.0.2 user-scalable=noไม่เคารพ ฉันไม่แน่ใจว่าทำไมพวกเขาจะยกเลิกการทำเช่นนี้เพียงเพื่อนำมันกลับมาเท่านั้นเพื่อลบออกอีกครั้ง
Aidan Hakimian

13

วิธีแก้ปัญหาที่ทำงานใน Mobile Safari ในขณะที่เขียนนี้คือต้องมีอาร์กิวเมนต์ที่สามaddEventListenerเป็น{ passive: false }ดังนั้นวิธีแก้ไขปัญหาทั้งหมดจะมีลักษณะดังนี้:

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

คุณอาจต้องการตรวจสอบว่าตัวเลือกได้รับการสนับสนุนให้ใช้งานร่วมกันได้หรือไม่


3
ทุกคนลองสิ่งนี้ใน iOS 12 หรือไม่? ฉันเพิ่มโค้ดด้านบนและไม่ได้ทำอะไรกับ webapp ของฉัน ยังสามารถซูมใน Safari ที่โง่นี้ ฉันเมตาแท็ก viewport <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">ลักษณะเช่นนี้ครับ:
Patrick DaVader

1
@PatrickDaVader ใช่ไม่สามารถหาโซลูชันการทำงานใด ๆ สำหรับ iOS 12 Safari การเมาเรือจากการซูมไม่หยุดหย่อน
Jamie Birch

1
อันนี้ใช้ได้ใน iOS 13 แท็ก <meta> ของฉันประกอบด้วย: <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 คัดลอกการตั้งค่าของคุณ ทำงานได้ แต่เหมือน 90% ของเวลา ไม่แน่ใจว่าทำไมไม่ตลอดเวลา
Hillcow

1
@SterlingBourne ตอบสนองได้ดีสำหรับฉัน! ขอบคุณ เขาควรโพสต์ไว้เป็นคำตอบแทนที่จะแสดงความคิดเห็นเพื่อให้สามารถลงคะแนน <meta name = "viewport" content = "width = ความกว้างของอุปกรณ์, ขนาดเริ่มต้น = 1, ขนาดสูงสุด = 1, viewport-fit = cover, user-scalable = no, หดตัวเพื่อให้พอดี = no "/> และ <meta name =" HandheldFriendly "content =" true ">
Gene Black

8

ฉันใช้เวลาประมาณหนึ่งชั่วโมงเพื่อค้นหาตัวเลือกจาวาสคริปต์ที่มีประสิทธิภาพยิ่งขึ้นและไม่พบ มันเกิดขึ้นเพียงไม่กี่วันที่ผ่านมาฉันเล่นซอกับhammer.js (Hammer.js เป็นห้องสมุดที่ให้คุณจัดการกิจกรรมการสัมผัสทุกประเภทได้อย่างง่ายดาย) และส่วนใหญ่ล้มเหลวในสิ่งที่ฉันพยายามทำ

ด้วยข้อแม้นั้นและการทำความเข้าใจฉันไม่ได้เป็นผู้เชี่ยวชาญจาวาสคริปต์นี่เป็นวิธีแก้ปัญหาที่ฉันใช้กับ hammer.js ในการจับการซูมและการแตะสองครั้งจากนั้นบันทึกและทิ้งพวกมัน

ตรวจสอบให้แน่ใจว่าคุณใส่ 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>


ฉันยังพยายามแก้ไขปัญหานี้เมื่อทำงานกับ hammer.js และสามารถยืนยันได้ว่าฉันสามารถป้องกันการซูมวิวพอร์ตโดยเพิ่มตัว.preventDefaultจัดการท่าทางท่าทางค้อนทั้งหมด ฉันกำลังใช้ swipe / pinch / pan / tap ร่วมกันฉันได้เพิ่มไปยังตัวจัดการทั้งหมดฉันไม่ทราบว่ามีเฉพาะรายการที่ทำงานอยู่หรือไม่
โคนัน

6

ฉันลองคำตอบก่อนหน้าเกี่ยวกับการบีบนิ้วเพื่อซูม

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

แต่บางครั้งหน้าจอยังคงซูมเมื่อเหตุการณ์ สัมผัสความยาว> 1 ฉันค้นพบวิธีที่ดีที่สุดคือการใช้เหตุการณ์ touchmove เพื่อหลีกเลี่ยงการใช้นิ้วเคลื่อนบนหน้าจอ รหัสจะเป็นดังนี้:

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

หวังว่ามันจะช่วย


7
สิ่งนี้ใช้ได้เฉพาะในกรณีที่แอปของคุณสมบูรณ์แบบ ... หากคุณมีเนื้อหาที่เลื่อนได้มันจะไม่ทำงาน ... ยังคงแฮ็คที่ดีสำหรับบางสถานการณ์
eljamz

8
แม้จะเป็นการปิดการใช้งานการเลื่อนบนเว็บไซต์ .. BAD
Gags

@eljamz ขอบคุณที่แจ้งให้เราทราบและใช่.. แอพของฉันพอดีกับหน้าจอ
Chihying Wu

@Gags ฉันยังไม่ได้ทดสอบฟังก์ชั่นการเลื่อนขอบคุณที่แจ้งให้เราทราบ
Chihying Wu

6

ตรวจสอบสเกลแฟคเตอร์ในเหตุการณ์ touchove จากนั้นป้องกันเหตุการณ์การสัมผัส

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

2
iOS 13 เปลี่ยน false เป็น {passive: false}
wayofthefuture

6

เราสามารถรับทุกสิ่งที่เราต้องการโดยการฉีดกฏสไตล์เดียวและขัดขวางการซูมเหตุการณ์:

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

✔ปิดใช้งานการซูมหยิก

✔ปิดใช้งานการซูมสองครั้ง

✔เลื่อนไม่ได้รับผลกระทบ

✔ปิดใช้งานการไฮไลต์การแตะ (ซึ่งถูกเรียกใช้บน iOS ตามกฎสไตล์)

ประกาศ: ปรับการตรวจจับ iOS ตามความต้องการของคุณ เพิ่มเติมเกี่ยวกับที่นี่


ขออภัยที่lukejacksonและPiotr Kowalskiซึ่งคำตอบปรากฏในแบบฟอร์มที่แก้ไขในโค้ดด้านบน


ใช้งานได้กับเครื่องจำลอง iPad ของฉันซึ่งใช้ iOS 11.2 บน iPad จริงของฉันที่ใช้ iOS 11.3 มันไม่ทำงาน ฉันเพิ่ม console.log เพื่อให้แน่ใจว่าเหตุการณ์ถูกเปิดใช้งานและเพื่อให้ปรากฏในคอนโซล เป็นสิ่งที่ต้องทำกับ iOS 11.3? หรือกับอุปกรณ์จริง?
Mathieu R.

1
@MathieuR มันเป็นปัญหา iOS 11.3 มันสามารถแก้ไขได้โดยใช้หนึ่งในaddEventListenerคำตอบตามและผ่าน{ passive: false }เป็นพารามิเตอร์แทนoptions falseอย่างไรก็ตามสำหรับความเข้ากันได้แบบย้อนหลังคุณจะต้องผ่านfalseเว้นแต่passiveจะได้รับการสนับสนุนฟิลด์ตัวเลือก ดูdeveloper.mozilla.org/en-US/docs/Web/API/EventTarget/
......

@JoshGallagher คุณช่วยยกตัวอย่างการทำงานได้ไหม? บน iOS11 ไม่มีคำตอบใดที่เหมาะกับฉัน
มิก

'gesturestart' -> preventDefault ใช้งานได้สำหรับฉันตอนเขียนบน iOS 12,2
Michael Camden

5

ฉันคิดวิธีแก้ปัญหาที่ไร้เดียงสา แต่ดูเหมือนว่าจะใช้งานได้ เป้าหมายของฉันคือการป้องกันไม่ให้แตะสองครั้งโดยไม่ตั้งใจเพื่อเป็นการตีความขณะซูมเข้าหากันเพื่อให้สามารถใช้งานได้

แนวคิดอยู่ในการวัดเวลาระหว่างที่หนึ่งtouchstartและที่สองtouchendในการแตะสองครั้งแล้วตีความสุดท้ายtouchendเป็นคลิกถ้าความล่าช้ามีขนาดเล็กเกินไป ในขณะที่ป้องกันการซูมโดยไม่ตั้งใจวิธีนี้ดูเหมือนว่าจะทำให้การเลื่อนรายการไม่ได้รับผลกระทบซึ่งเป็นสิ่งที่ดี ไม่แน่ใจว่าฉันไม่ได้พลาดอะไร

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

แรงบันดาลใจจากสรุปสาระสำคัญจาก mutewinterและคำตอบของโยเซฟ


5

ในกรณีเฉพาะของฉันฉันใช้ Babylon.js เพื่อสร้างฉาก 3 มิติและทั้งหน้าของฉันประกอบด้วยผ้าใบเต็มหน้าจอเดียว เอ็นจิ้น 3 มิติมีฟังก์ชั่นการซูมของตัวเอง แต่ใน iOS การบีบนิ้วเพื่อซูมจะรบกวนสิ่งนั้น ฉันอัปเดตคำตอบ @Joseph เพื่อแก้ไขปัญหาของฉัน หากต้องการปิดการใช้งานฉันคิดว่าฉันต้องส่ง {passive: false} เป็นตัวเลือกให้กับผู้ฟังเหตุการณ์ รหัสต่อไปนี้ใช้งานได้สำหรับฉัน:

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

กรณีการใช้งานของฉันยังเป็นฉาก 3 มิติแบบเต็มหน้าพร้อมปุ่มควบคุมแบบกำหนดเอง ฉันคงจะจมถ้าไม่มีวิธีแก้ปัญหาให้ Apple เพิกเฉยต่อสเกลของผู้ใช้อย่างชัดเจน: ไม่มีเมตาดาต้า
Nick Bilyk

1

ฟังดูแปลกอย่างน้อย Safari สำหรับ iOS 10.2 การแตะสองครั้งเพื่อซูมถูกปิดการใช้งานอย่างน่าอัศจรรย์หากองค์ประกอบหรือบรรพบุรุษของคุณมีสิ่งใดสิ่งหนึ่งดังต่อไปนี้:

  1. ผู้ฟัง onClick - มันสามารถเป็น noop ง่าย ๆ
  2. cursor: pointerชุดใน CSS

วิธีการเกี่ยวกับการจับ?
Sam Su

น่าเสียดายที่โซลูชันนี้ไม่สามารถบีบนิ้วเพื่อซูมได้ ด้วยเหตุนี้เราจึงใช้โซลูชันที่เสนอใน: stackoverflow.com/a/39594334/374196
mariomc

ไม่ได้ผลสำหรับฉัน ฉันใช้ 10.2.1 Beta 4 ใน iPod Touch โดยใช้หน้าทดสอบนี้แล้วแตะสองครั้งที่สี่เหลี่ยมสีเทาใด ๆ : jsbin.com/kamuta/quiet
robocat

1
ฉันมีสิ่งนี้ในแอพที่ตอบสนองและมันไม่ทำงาน
FMD

1

การซูมโดยไม่ตั้งใจจะเกิดขึ้นเมื่อ:

  • ผู้ใช้สองคนแตะที่ส่วนประกอบของอินเทอร์เฟซ
  • ผู้ใช้โต้ตอบกับวิวพอร์ตโดยใช้หลักสองหลักขึ้นไป (หยิก)

เพื่อป้องกันพฤติกรรมการแตะสองครั้งฉันพบวิธีแก้ไขปัญหาง่าย ๆ สองวิธี:

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

ทั้งสองอย่างนี้ขัดขวาง Safari (iOS 10.3.2) จากการซูมเข้าที่ปุ่ม ในขณะที่คุณเห็นหนึ่งคือ JavaScript เท่านั้นอื่น ๆ เป็น CSS เท่านั้น ใช้อย่างเหมาะสม

นี่คือตัวอย่าง: https://codepen.io/lukejacksonn/pen/QMELXQ

ฉันยังไม่ได้พยายามป้องกันพฤติกรรมการบีบ (แต่) ส่วนใหญ่เป็นเพราะฉันมักจะไม่สร้างอินเทอร์เฟซแบบมัลติทัชสำหรับเว็บและอย่างที่สองฉันมาถึงความคิดที่ว่าอินเทอร์เฟซทั้งหมด - ใช้ได้ในสถานที่ต่างๆ ฉันยังคงออกแบบเพื่อหลีกเลี่ยงผู้ใช้ที่ต้องทำสิ่งนี้เพื่อให้ UI ของคุณสามารถเข้าถึงได้โดยไม่ต้องเสียค่าใช้จ่าย


1

พบการทำงานที่เรียบง่ายซึ่งดูเหมือนจะป้องกันไม่ให้ดับเบิลคลิกเพื่อซูม:

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

ตามที่ร้องขอฉันได้โอนความคิดเห็นของฉันไปยังคำตอบเพื่อให้ผู้คนสามารถโหวตได้:

ใช้งานได้ 90% ของเวลาสำหรับ 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

ฉันตรวจสอบคำตอบทั้งหมดข้างต้นในทางปฏิบัติกับหน้าของฉันบน iOS (iPhone 6, iOS 10.0.2) แต่ไม่ประสบความสำเร็จ นี่เป็นวิธีแก้ปัญหาการทำงานของฉัน:

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

น่าเสียดายที่นี่ใช้งานได้เฉพาะเมื่อหน้าเว็บของคุณมีขนาดพอดีไม่ใช่เมื่อคุณมีเนื้อหาที่เลื่อนได้
รองเท้า

อืมมม ใช้งานได้ดีกับเนื้อหาที่เลื่อนได้ในประสบการณ์ของฉัน (iOS 10.3)
jeff_mcmahan

0

สิ่งนี้ใช้ได้กับฉัน:

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

ฉันลองสิ่งนี้มันป้องกันการซูมหยิก แต่ปิดการใช้งานการเลื่อนดูวิวของวิวพอร์ตดังนั้นคุณจึงไม่สามารถเลื่อนหน้าขึ้นและลงได้อีก
TGR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.