กลับมารวมตัวกันอีกครั้งเป็นครั้งแรก
บทนำ
เกือบ 30 ปีที่ผ่านมา ประสบการณ์การประมวลผลบนเดสก์ท็อปมุ่งเน้นไปที่แป้นพิมพ์และเมาส์หรือแทร็กแพดเป็นอุปกรณ์หลักในการป้อนข้อมูลของผู้ใช้ อย่างไรก็ตาม ในช่วง 10 ปีที่ผ่านมา สมาร์ทโฟนและแท็บเล็ตได้นํารูปแบบการโต้ตอบแบบใหม่มาใช้ ซึ่งก็คือการสัมผัส ด้วยการเปิดตัวเครื่อง Windows 8 ที่เปิดใช้งานระบบสัมผัส และขณะนี้ได้เปิดตัว Chromebook Pixel รุ่นระบบสัมผัสที่ยอดเยี่ยม ระบบสัมผัสได้กลายเป็นส่วนหนึ่งของประสบการณ์บนเดสก์ท็อปที่คาดหวังไว้ หนึ่งในความท้าทายที่ยิ่งใหญ่ที่สุดคือการสร้างประสบการณ์ที่ใช้งานได้ทั้งบนอุปกรณ์แบบสัมผัสและอุปกรณ์เมาส์ รวมถึงบนอุปกรณ์เหล่านี้ที่ผู้ใช้จะใช้ทั้ง 2 วิธีในการป้อนข้อมูล ซึ่งบางครั้งอาจใช้พร้อมกัน
บทความนี้จะช่วยให้คุณเข้าใจว่าความสามารถในการสัมผัสนั้นมีอยู่ในเบราว์เซอร์ได้อย่างไร คุณจะผสานรวมกลไกของอินเทอร์เฟซใหม่นี้เข้ากับแอปที่มีอยู่แล้วได้อย่างไร และการแตะจะมีประสิทธิภาพอย่างไรเมื่อป้อนข้อมูลด้วยเมาส์
สถานะของ Touch ในแพลตฟอร์มเว็บ
iPhone เป็นแพลตฟอร์มยอดนิยมแพลตฟอร์มแรกที่มี API การแตะในตัวสำหรับเว็บเบราว์เซอร์โดยเฉพาะ ผู้ให้บริการเบราว์เซอร์รายอื่นๆ อีกหลายรายได้สร้างอินเทอร์เฟซ API ที่คล้ายกันซึ่งสร้างขึ้นเพื่อให้ใช้งานร่วมกับการใช้งาน iOS ได้ ซึ่งตอนนี้อธิบายไว้ในข้อกําหนด"เหตุการณ์การสัมผัสเวอร์ชัน 1" Chrome และ Firefox บนเดสก์ท็อป, Safari บน iOS และ Chrome รวมถึงเบราว์เซอร์ Android บน Android รวมถึงเบราว์เซอร์อื่นๆ ในอุปกรณ์เคลื่อนที่ เช่น เบราว์เซอร์ Blackberry รองรับเหตุการณ์การสัมผัส
เพื่อนร่วมงานของฉัน Boris Smus เขียนบทแนะนำ HTML5Rocks เกี่ยวกับเหตุการณ์การสัมผัสที่ยอดเยี่ยม ซึ่งยังคงเป็นวิธีที่ดีในการเริ่มต้นใช้งานหากคุณไม่เคยดูเหตุการณ์การสัมผัสมาก่อน จริงๆ แล้ว หากคุณไม่เคยใช้เหตุการณ์การสัมผัสมาก่อน โปรดอ่านบทความดังกล่าวก่อนดำเนินการต่อ ดำเนินการต่อได้เลย เราจะรอ
เรียบร้อยแล้วใช่ไหม เมื่อคุณเข้าใจพื้นฐานเกี่ยวกับเหตุการณ์การสัมผัสแล้ว ความท้าทายในการเขียนการโต้ตอบที่เปิดใช้ด้วยการสัมผัสคือการโต้ตอบด้วยการสัมผัสจะแตกต่างจากเหตุการณ์ของเมาส์ (และแทร็กแพดและแทร็กบอลที่เลียนแบบเมาส์) เล็กน้อย และแม้ว่าอินเทอร์เฟซแบบสัมผัสมักจะพยายามจำลองเมาส์ แต่การจำลองนั้นไม่สมบูรณ์หรือสมบูรณ์ คุณจำเป็นต้องใช้การโต้ตอบทั้ง 2 สไตล์และอาจต้องรองรับอินเทอร์เฟซแต่ละรายการแยกกัน
สำคัญที่สุด: ผู้ใช้อาจมีแท็บเล็ตและเม้าส์
นักพัฒนาซอฟต์แวร์จำนวนมากได้สร้างเว็บไซต์ที่ตรวจหาแบบคงที่ว่าสภาพแวดล้อมรองรับกิจกรรมการสัมผัสหรือไม่ แล้วตั้งสันนิษฐานว่าจะต้องรองรับเหตุการณ์การสัมผัสเท่านั้น (ไม่ใช่เมาส์) แต่ตอนนี้เป็นความเข้าใจผิดแล้ว การที่เหตุการณ์การแตะปรากฏขึ้นไม่ได้หมายความว่าผู้ใช้กําลังใช้อุปกรณ์อินพุตการสัมผัสนั้นเป็นหลัก อุปกรณ์อย่าง Chromebook Pixel และแล็ปท็อป Windows 8 บางรุ่นรองรับทั้งวิธีการป้อนข้อมูลด้วยเมาส์และการสัมผัสแล้ว และอุปกรณ์อื่นๆ จะรองรับด้วยเช่นกันในอนาคตอันใกล้ ในอุปกรณ์เหล่านี้ ผู้ใช้อาจใช้ทั้งเมาส์และหน้าจอสัมผัสเพื่อโต้ตอบกับแอปพลิเคชันอย่างเป็นธรรมชาติ ดังนั้น "รองรับการสัมผัส" จึงไม่ได้หมายความว่า "ไม่จําเป็นต้องรองรับเมาส์" คุณไม่สามารถคิดว่าปัญหาคือ "ฉันต้องเขียนรูปแบบการโต้ตอบ 2 แบบที่แตกต่างกันและสลับใช้" แต่ต้องพิจารณาว่าทั้ง 2 รูปแบบการโต้ตอบจะทํางานร่วมกันและทำงานแยกกันได้อย่างไร ใน Chromebook Pixel ฉันใช้แทร็กแพดบ่อยครั้ง แต่บางครั้งก็ใช้มือแตะหน้าจอด้วย ในแอปพลิเคชันหรือหน้าเว็บเดียวกัน ฉันจะใช้วิธีใดก็ได้ที่รู้สึกเป็นธรรมชาติที่สุดในขณะนั้น ในทางตรงกันข้าม ผู้ใช้แล็ปท็อปแบบหน้าจอสัมผัสบางรายจะไม่ค่อยเคยใช้หน้าจอสัมผัสเลย ดังนั้นการแสดงการป้อนข้อมูลด้วยการสัมผัสไม่ควรปิดใช้งานหรือขัดขวางการควบคุมเมาส์
ขออภัย เป็นเรื่องยากที่จะทราบว่าสภาพแวดล้อมเบราว์เซอร์ของผู้ใช้รองรับอินพุตการสัมผัสหรือไม่ โดยปกติแล้ว เบราว์เซอร์ในเครื่องเดสก์ท็อปจะระบุการรองรับเหตุการณ์การสัมผัสเสมอเพื่อให้สามารถต่อจอแสดงผลแบบสัมผัสได้ทุกเมื่อ (เช่น หากจอสัมผัสที่ต่อผ่าน KVM พร้อมใช้งาน) ด้วยเหตุนี้ แอปพลิเคชันของคุณจึงไม่ควรสลับระหว่างการสัมผัสกับเมาส์ แต่ควรรองรับทั้ง 2 อย่าง
การรองรับเมาส์และหน้าจอสัมผัสร่วมกัน
#1 - การคลิกและแตะ - ลำดับของสิ่งต่างๆ "ธรรมชาติ"
ปัญหาแรกคืออินเทอร์เฟซการสัมผัสมักจะพยายามเลียนแบบการคลิกเมาส์ ซึ่งก็เป็นเรื่องปกติ เนื่องจากอินเทอร์เฟซการสัมผัสต้องทํางานในแอปพลิเคชันที่โต้ตอบกับเหตุการณ์เมาส์เท่านั้นก่อนหน้านี้ คุณสามารถใช้รายการนี้เป็นทางลัดได้ เนื่องจากกิจกรรม "คลิก" จะยังคงเริ่มทำงาน ไม่ว่าผู้ใช้จะคลิกด้วยเมาส์หรือแตะนิ้วบนหน้าจอก็ตาม อย่างไรก็ตาม มีปัญหาบางประการกับทางลัดนี้
ประการแรก คุณต้องระมัดระวังเมื่อออกแบบการโต้ตอบด้วยการสัมผัสขั้นสูงขึ้น เมื่อผู้ใช้ใช้เมาส์ ระบบจะตอบสนองผ่านเหตุการณ์คลิก แต่เมื่อผู้ใช้สัมผัสหน้าจอ เหตุการณ์ทั้งการสัมผัสและการคลิกจะเกิดขึ้น ลำดับของเหตุการณ์สำหรับการคลิกเพียงครั้งเดียวคือ
- touchstart
- touchmove
- touchend
- เมาส์โอเวอร์
- mousemove
- mousedown
- mouseup
- click
ซึ่งหมายความว่าหากคุณประมวลผลเหตุการณ์การสัมผัส เช่น touchstart คุณต้องตรวจสอบว่าคุณไม่ได้ประมวลผลเหตุการณ์ mousedown และ/หรือ click ที่เกี่ยวข้องด้วย หากคุณยกเลิกเหตุการณ์การแตะได้ (เรียกใช้ preventDefault() ภายในเครื่องจัดการเหตุการณ์) จะไม่มีการสร้างเหตุการณ์เมาส์สำหรับการสัมผัส กฎข้อสําคัญที่สุดอย่างหนึ่งของตัวแฮนเดิลการสัมผัสคือ
อย่างไรก็ตาม การดำเนินการนี้ยังป้องกันลักษณะการทํางานเริ่มต้นอื่นๆ ของเบราว์เซอร์ด้วย (เช่น การเลื่อน) แม้ว่าปกติแล้วคุณจะจัดการเหตุการณ์การสัมผัสทั้งหมดในตัวจัดการ และต้องการปิดใช้การดําเนินการเริ่มต้น โดยทั่วไปคุณอาจต้องจัดการและยกเลิกเหตุการณ์การแตะทั้งหมด หรือหลีกเลี่ยงการใช้เครื่องจัดการสำหรับกิจกรรมนั้น
ประการที่ 2 เมื่อผู้ใช้แตะองค์ประกอบในหน้าเว็บบนอุปกรณ์เคลื่อนที่ หน้าเว็บที่ไม่ได้ออกแบบมาเพื่อการโต้ตอบบนอุปกรณ์เคลื่อนที่จะมีความล่าช้าอย่างน้อย 300 มิลลิวินาทีระหว่างเหตุการณ์ touchstart กับการประมวลผลเหตุการณ์เมาส์ (mousedown) ทำได้โดยใช้ Chrome โดยเปิด"จําลองเหตุการณ์การสัมผัส" ในเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์ Chrome เพื่อช่วยทดสอบอินเทอร์เฟซการสัมผัสในระบบที่ไม่ใช่ระบบสัมผัส
การหน่วงเวลานี้เพื่อให้เวลาเบราว์เซอร์สามารถระบุได้ว่าผู้ใช้ทำท่าทางสัมผัสอื่นหรือไม่ โดยเฉพาะอย่างยิ่งเมื่อซูม 2 ครั้ง ซึ่งอาจทำให้เกิดปัญหาในกรณีที่คุณต้องการให้มีการตอบสนองทันทีเมื่อนิ้วแตะ เรากำลังดำเนินการอย่างต่อเนื่องเพื่อพยายามจำกัดสถานการณ์ที่ความล่าช้านี้จะเกิดขึ้นโดยอัตโนมัติ
วิธีแรกและง่ายที่สุดในการหลีกเลี่ยงความล่าช้านี้คือการ "บอก" เบราว์เซอร์ในอุปกรณ์เคลื่อนที่ว่าหน้าเว็บไม่จำเป็นต้องมีการซูม ซึ่งทำได้โดยใช้วิวพอร์ตแบบคงที่ เช่น โดยการแทรกข้อมูลต่อไปนี้ลงในหน้าเว็บ
<meta name="viewport" content="width=device-width,user-scalable=no">
แน่นอนว่าวิธีนี้ไม่เหมาะเสมอไป เนื่องจากจะปิดใช้การซูมด้วยการบีบนิ้ว ซึ่งอาจจำเป็นเพื่อการช่วยเหลือพิเศษ ดังนั้นโปรดใช้วิธีนี้อย่างจำกัด (หากปิดใช้การปรับขนาดของผู้ใช้ คุณอาจต้องระบุวิธีอื่นเพื่อเพิ่มความสามารถในการอ่านข้อความในแอปพลิเคชัน) นอกจากนี้ การเลื่อนช้านี้จะไม่มีผลกับ Chrome ในอุปกรณ์ระดับเดสก์ท็อปที่รองรับการสัมผัส และเบราว์เซอร์อื่นๆ ในแพลตฟอร์มอุปกรณ์เคลื่อนที่เมื่อหน้าเว็บมีวิวพอร์ตที่ปรับขนาดไม่ได้
#2: เหตุการณ์การเลื่อนเมาส์ไม่ทริกเกอร์ด้วยการสัมผัส
สิ่งสำคัญที่ต้องทราบในตอนนี้คือการจำลองเหตุการณ์เมาส์ในอินเทอร์เฟซแบบสัมผัสมักจะไม่ครอบคลุมถึงการเลียนแบบเหตุการณ์เมาส์ ดังนั้นหากคุณสร้างการควบคุมที่ขับเคลื่อนโดยเมาส์ที่สวยงามซึ่งใช้เหตุการณ์การเลื่อนเมาส์ ก็มักจะใช้ไม่ได้กับอุปกรณ์ระบบสัมผัส เว้นแต่คุณจะเพิ่มตัวแฮนเดิลแบบสัมผัสย้ายไว้ด้วย
โดยทั่วไปเบราว์เซอร์จะใช้การโต้ตอบที่เหมาะสมกับการโต้ตอบด้วยการสัมผัสในการควบคุม HTML โดยอัตโนมัติ เช่น การควบคุมช่วง HTML5 จะใช้งานได้เมื่อคุณใช้การโต้ตอบด้วยการสัมผัส อย่างไรก็ตาม หากคุณใช้ตัวควบคุมของคุณเอง ตัวควบคุมเหล่านั้นอาจไม่ทำงานกับการโต้ตอบแบบคลิกและลาก อันที่จริงแล้ว ไลบรารีที่ใช้กันโดยทั่วไปบางรายการ (เช่น jQueryUI) ยังไม่รองรับการโต้ตอบด้วยการสัมผัสในลักษณะนี้โดยกำเนิด (แม้ว่า jQueryUI จะมีวิธีแก้ไขแบบ Monkey Patch หลายวิธีสำหรับปัญหานี้) นี่เป็นปัญหาแรกที่เจอเมื่ออัปเกรดแอปพลิเคชัน Web Audio Playground ให้สามารถสัมผัสได้ แถบเลื่อนเป็นแบบ jQueryUI ทำให้ใช้กับการโต้ตอบแบบคลิกแล้วลากไม่ได้ ฉันเปลี่ยนไปใช้ตัวควบคุมช่วง HTML5 แล้วและใช้งานได้ หรือจะเพิ่มตัวแฮนเดิลการแตะเพื่ออัปเดตแถบเลื่อนก็ได้ แต่วิธีนี้มีข้อเสียอยู่อย่างหนึ่ง
#3: Touchmove และ MouseMove ไม่ใช่สิ่งเดียวกัน
ข้อผิดพลาดที่เราเห็นว่านักพัฒนาแอปบางรายพบคือแฮนเดิล touchmove และ mousemove เรียกใช้เส้นทางโค้ดเดียวกัน ลักษณะการทํางานของเหตุการณ์เหล่านี้คล้ายกันมาก แต่แตกต่างกันเล็กน้อย โดยเฉพาะอย่างยิ่งเหตุการณ์การแตะจะกําหนดเป้าหมายไปยังองค์ประกอบที่การแตะนั้นเริ่มต้นเสมอ ขณะที่เหตุการณ์เมาส์จะกําหนดเป้าหมายไปยังองค์ประกอบที่อยู่ใต้เคอร์เซอร์เมาส์ในขณะนี้ ด้วยเหตุนี้ เราจึงมีเหตุการณ์ mouseover และ mouseout แต่ไม่มีเหตุการณ์ touchover และ touchout ที่เกี่ยวข้อง มีเพียง touchend เท่านั้น
ปัญหาที่พบบ่อยที่สุดคือกรณีที่คุณนําองค์ประกอบที่ผู้ใช้เริ่มแตะออก (หรือย้ายตำแหน่ง) ตัวอย่างเช่น สมมติว่าภาพสไลด์มีตัวแฮนเดิลการสัมผัสในภาพสไลด์ทั้งภาพเพื่อรองรับลักษณะการเลื่อนที่กำหนดเอง เมื่อรูปภาพที่มีอยู่เปลี่ยนแปลง ระบบจะนำองค์ประกอบ <img>
บางรายการออกและเพิ่มองค์ประกอบอื่นๆ หากผู้ใช้เริ่มแตะรูปภาพภาพใดภาพหนึ่งเหล่านั้นแล้วคุณนำออก เครื่องจัดการของคุณ (ซึ่งอยู่บนองค์ประกอบระดับบนขององค์ประกอบ img) จะหยุดรับกิจกรรมการแตะเท่านั้น (เนื่องจากมีการส่งไปยังเป้าหมายที่ไม่ได้อยู่ในโครงสร้างแล้ว) ซึ่งจะทำให้ดูเหมือนว่าผู้ใช้กำลังจับนิ้วของพวกเขาในตำแหน่งเดียว แม้ว่าพวกเขาอาจย้ายที่และเอาออกในที่สุด
แน่นอนว่าคุณสามารถหลีกเลี่ยงปัญหานี้ได้ด้วยการหลีกเลี่ยงการนำองค์ประกอบที่มี (หรือมีบรรพบุรุษที่มี) แฮนเดิลการแตะออกขณะที่การแตะทำงานอยู่ หรือคำแนะนำที่ดีที่สุดคือ แทนที่จะลงทะเบียนเครื่องจัดการ Touchend/touchmove แบบคงที่ ให้รอจนกว่าจะได้รับเหตุการณ์ touchstart แล้วเพิ่มตัวแฮนเดิล touchmove/touchend/touchcancel ลงในtargetของเหตุการณ์แบบสัมผัส (และนำออกเมื่อจบ/ยกเลิก) วิธีนี้จะช่วยให้คุณได้รับเหตุการณ์การแตะต่อไปแม้ว่าจะมีการย้าย/นําองค์ประกอบเป้าหมายออก คุณลองเล่นกับสิ่งนี้ได้ที่นี่ - แตะกล่องสีแดงและกดแป้น Escape ค้างไว้เพื่อนำออกจาก DOM
#4: แตะและวางเมาส์เหนือ
การเปรียบเทียบเคอร์เซอร์เมาส์จะแยกตำแหน่งเคอร์เซอร์ออกจากการเลือก และทำให้นักพัฒนาซอฟต์แวร์สามารถใช้สถานะวางเมาส์เหนือเพื่อซ่อนและแสดงข้อมูลที่อาจเกี่ยวข้องกับผู้ใช้ อย่างไรก็ตาม อินเทอร์เฟซระบบสัมผัสส่วนใหญ่ขณะนี้ตรวจไม่พบนิ้วที่ "เลื่อน" เหนือเป้าหมาย ดังนั้นการให้ข้อมูลที่สำคัญเชิงความหมาย (เช่น การระบุป๊อปอัป "การควบคุมนี้คืออะไร") โดยพิจารณาว่าการวางเมาส์เหนือโฆษณาไม่ใช่ ไม่ เว้นแต่คุณจะให้วิธีการเข้าถึงข้อมูลนี้ได้ง่ายด้วยการสัมผัส คุณต้องระมัดระวังในการใช้การวางเมาส์เหนือเพื่อส่งต่อข้อมูลไปยังผู้ใช้
แต่ที่น่าสนใจคืออินเทอร์เฟซการสัมผัสอาจทริกเกอร์คลาสจำลอง :hover ของ CSS ได้ ในบางกรณี การแตะองค์ประกอบจะทำให้องค์ประกอบนั้นอยู่ในสถานะ :active ขณะที่นิ้วกดอยู่ และรับสถานะ :hover ด้วย (ใน Internet Explorer :hover จะมีผลเฉพาะในขณะที่นิ้วของผู้ใช้กดลงอยู่ ส่วนเบราว์เซอร์อื่นๆ จะใช้ :hover จนกว่าจะเกิดการแตะหรือเมาส์เลื่อนครั้งถัดไป) วิธีนี้เป็นวิธีที่ดีในการทำให้เมนูแบบเด้งออกมาใช้งานได้บนอินเทอร์เฟซระบบสัมผัส ผลข้างเคียงจากการทำให้องค์ประกอบใช้งานได้คือจะมีการใช้สถานะ :เมื่อวางเมาส์ด้วย เช่น
<style>
img ~ .content {
display:none;
}
img:hover ~ .content {
display:block;
}
</style>
<img src="/awesome.png">
<div class="content">This is an awesome picture of me</div>
เมื่อแตะองค์ประกอบอื่น องค์ประกอบนั้นจะไม่ทำงานอีกต่อไป และสถานะการวางเมาส์เหนือจะหายไป เหมือนกับว่าผู้ใช้ใช้เคอร์เซอร์เมาส์แล้วเลื่อนออกจากองค์ประกอบ คุณอาจต้องตัดเนื้อหาในองค์ประกอบ <a>
เพื่อให้เป็นจุดสิ้นสุดการแท็บด้วย วิธีนี้จะช่วยให้ผู้ใช้สลับดูข้อมูลเพิ่มเติมได้เมื่อวางเมาส์เหนือหรือคลิก การแตะด้วยนิ้ว หรือกดแป้นพิมพ์ โดยไม่จำเป็นต้องใช้ JavaScript เรารู้สึกประหลาดใจอย่างยินดีเมื่อเริ่มทําให้ Web Audio Playground ทํางานได้ดีกับอินเทอร์เฟซแบบสัมผัสเนื่องจากเมนูแบบป๊อปอัปทํางานได้ดีกับการสัมผัสอยู่แล้ว เนื่องจากเราใช้โครงสร้างประเภทนี้
วิธีการข้างต้นทำงานได้ดีสำหรับอินเทอร์เฟซที่ใช้เคอร์เซอร์เมาส์และอินเทอร์เฟซแบบสัมผัส ซึ่งแตกต่างจากการใช้แอตทริบิวต์ "title" เมื่อวางเมาส์เหนือ ซึ่งจะไม่แสดงเมื่อเปิดใช้งานองค์ประกอบ
<img src="/awesome.png" title="this doesn't show up in touch">
#5: ความแม่นยำของหน้าจอสัมผัสเทียบกับเมาส์
แม้ว่าเมาส์จะมีความไม่เชื่อมโยงทางความคิดกับความเป็นจริง แต่ปรากฏว่าเมาส์มีความถูกต้องมากที่สุด เนื่องจากระบบปฏิบัติการเบื้องหลังโดยทั่วไปจะติดตามความแม่นยําของพิกเซลที่แม่นยำของเคอร์เซอร์ ในทางกลับกัน นักพัฒนาแอปบนอุปกรณ์เคลื่อนที่ได้เรียนรู้ว่าการแตะด้วยนิ้วบนหน้าจอสัมผัสนั้นไม่แม่นยำนัก โดยส่วนใหญ่เป็นเพราะขนาดของพื้นที่ผิวของนิ้วเมื่อสัมผัสกับหน้าจอ (และส่วนหนึ่งเป็นเพราะนิ้วบดบังหน้าจอ)
บุคคลและบริษัทจํานวนมากได้ทําการวิจัยผู้ใช้อย่างละเอียดเกี่ยวกับวิธีออกแบบแอปพลิเคชันและเว็บไซต์ที่รองรับการโต้ตอบด้วยนิ้ว และมีการเขียนหนังสือเกี่ยวกับหัวข้อนี้มากมาย คำแนะนำพื้นฐานคือให้เพิ่มขนาดของเป้าหมายการสัมผัสโดยการเพิ่มระยะห่างจากขอบ และลดโอกาสที่การแตะจะผิดพลาดด้วยการเพิ่มระยะห่างระหว่างองค์ประกอบ (ระยะขอบจะไม่รวมอยู่ในการจัดการการตรวจจับ Hit ของเหตุการณ์การแตะและการคลิก ส่วนระยะห่างจากขอบ) การแก้ไขหลักอย่างหนึ่งที่ฉันต้องทำกับ Web Audio Playground คือการเพิ่มขนาดของจุดเชื่อมต่อเพื่อให้แตะได้อย่างแม่นยำมากขึ้น
ผู้ให้บริการเบราว์เซอร์จํานวนมากที่จัดการอินเทอร์เฟซแบบสัมผัสได้นําตรรกะมาไว้ในเบราว์เซอร์เพื่อช่วยกําหนดเป้าหมายองค์ประกอบที่ถูกต้องเมื่อผู้ใช้สัมผัสหน้าจอและลดโอกาสที่การคลิกจะไม่ถูกต้องด้วย แม้ว่าโดยปกติแล้วการแก้ไขนี้จะแก้ไขเฉพาะเหตุการณ์การคลิก ไม่ใช่การเคลื่อนไหว (แม้ว่า Internet Explorer จะแก้ไขเหตุการณ์ mousedown/mousemove/mouseup ด้วยก็ตาม)
#6: ควบคุมตัวแฮนเดิลการสัมผัสให้อยู่ภายในขอบเขต ไม่เช่นนั้นการเลื่อนจะกระตุก
นอกจากนี้ ยังควรให้เครื่องจัดการแบบสัมผัสจำกัดอยู่เฉพาะองค์ประกอบที่คุณต้องการเท่านั้น เนื่องจากองค์ประกอบการแตะอาจมีแบนด์วิดท์สูงมาก ดังนั้นสิ่งสำคัญคือต้องหลีกเลี่ยงตัวแฮนเดิลแบบสัมผัสในองค์ประกอบที่เลื่อน (เนื่องจากการประมวลผลของคุณอาจรบกวนการเพิ่มประสิทธิภาพเบราว์เซอร์เพื่อให้การเลื่อนสัมผัสที่ไม่รบกวนอย่างรวดเร็ว เบราว์เซอร์สมัยใหม่จะพยายามเลื่อนบนเทรด GPU แต่จะเป็นไปไม่ได้หากต้องตรวจสอบด้วย JavaScript ก่อนเพื่อดูว่าแอปจะต้องตรวจสอบด้วย JavaScript ก่อนหรือไม่) คุณสามารถดูตัวอย่างลักษณะการทํางานนี้
คำแนะนำอย่างหนึ่งที่ควรปฏิบัติตามเพื่อหลีกเลี่ยงปัญหานี้คือ ตรวจสอบว่าหากคุณจัดการการโต้ตอบการสัมผัสในส่วนเล็กๆ ของ UI เท่านั้น คุณก็แค่แนบตัวแฮนเดิลแบบสัมผัสในส่วนนั้นเท่านั้น (ไม่ใช่ใน <body>
ของหน้าเว็บ) กล่าวโดยสรุปคือ จำกัดขอบเขตของตัวแฮนเดิลแบบสัมผัสให้ได้มากที่สุด
#7: มัลติทัช
ปัญหาที่น่าสนใจอีกอย่างหนึ่งคือ แม้ว่าเราจะเรียกอินเทอร์เฟซผู้ใช้นี้ว่า "การสัมผัส" แต่เกือบทั้งหมดแล้วที่รองรับการสัมผัสแบบหลายจุด กล่าวคือ API ให้อินพุตการสัมผัสมากกว่า 1 ครั้งพร้อมกัน เมื่อเริ่มรองรับการแตะในแอปพลิเคชันของคุณ คุณควรพิจารณาการใช้การแตะหลายครั้งอาจมีผลต่อแอปพลิเคชันของคุณอย่างไร
หากคุณสร้างแอปที่ใช้เมาส์เป็นหลักอยู่แล้ว คุณคุ้นเคยกับการสร้างโดยใช้จุดเคอร์เซอร์ไม่เกิน 1 จุด โดยทั่วไประบบจะไม่รองรับเคอร์เซอร์เมาส์หลายตัว สําหรับแอปพลิเคชันจํานวนมาก คุณจะแมปเหตุการณ์การสัมผัสกับอินเทอร์เฟซเคอร์เซอร์เดียวเท่านั้น แต่ฮาร์ดแวร์ส่วนใหญ่ที่เราเห็นสําหรับอินพุตการสัมผัสบนเดสก์ท็อปสามารถจัดการอินพุตพร้อมกันได้อย่างน้อย 2 รายการ และฮาร์ดแวร์ใหม่ส่วนใหญ่ดูเหมือนว่าจะรองรับอินพุตพร้อมกันได้อย่างน้อย 5 รายการ สำหรับการพัฒนาแป้นพิมพ์เปียโนบนหน้าจอ แน่นอนว่าคุณจะต้องรองรับการป้อนข้อมูลด้วยการสัมผัสหลายรายการพร้อมกัน
W3C Touch API ที่ใช้งานอยู่ในปัจจุบันไม่มี API เพื่อระบุจํานวนจุดสัมผัสที่ฮาร์ดแวร์รองรับ คุณจึงต้องใช้การประมาณที่ดีที่สุดเกี่ยวกับจํานวนจุดสัมผัสที่ผู้ใช้ต้องการ หรืออาจสังเกตจํานวนจุดสัมผัสที่เห็นในทางปฏิบัติและปรับให้เหมาะสม ตัวอย่างเช่น ในแอปพลิเคชันเปียโน หากไม่เคยเห็นจุดสัมผัสมากกว่า 2 จุด คุณอาจต้องเพิ่ม UI "คอร์ด" PointerEvents API มี API ในการระบุความสามารถของอุปกรณ์
การแก้ไข
เราหวังว่าบทความนี้จะให้คำแนะนำบางอย่างเกี่ยวกับปัญหาที่พบบ่อยในการใช้การสัมผัสควบคู่กับการโต้ตอบด้วยเมาส์ สิ่งสําคัญกว่าคําแนะนําอื่นๆ คือการทดสอบแอปในอุปกรณ์เคลื่อนที่ แท็บเล็ต และสภาพแวดล้อมเดสก์ท็อปที่ใช้ทั้งเมาส์และการสัมผัส หากไม่มีฮาร์ดแวร์การสัมผัส+เมาส์ ให้ใช้ "จำลองเหตุการณ์การสัมผัส" ของ Chrome เพื่อช่วยทดสอบสถานการณ์ต่างๆ
การสร้างประสบการณ์การใช้งานแบบอินเทอร์แอกทีฟที่น่าสนใจซึ่งทำงานได้ดีกับอินพุตการสัมผัส อินพุตเมาส์ และแม้แต่อินเทอร์แอกทีฟทั้ง 2 รูปแบบพร้อมกันนั้นเป็นไปได้และค่อนข้างง่ายเมื่อทำตามคำแนะนำเหล่านี้