ตามที่คำตอบอื่น ๆ ระบุไว้ iOS Safari จะไม่เรียก:active
ใช้คลาสหลอกเว้นแต่ว่าจะมีการเชื่อมต่อเหตุการณ์การสัมผัสเข้ากับองค์ประกอบ แต่จนถึงขณะนี้พฤติกรรมนี้ "วิเศษ" ฉันเจอคำประกาศเล็กน้อยนี้ในไลบรารีนักพัฒนา Safariที่อธิบายไว้ (เน้นของฉัน):
คุณยังสามารถใช้-webkit-tap-highlight-color
คุณสมบัติ CSS ร่วมกับการตั้งค่าเหตุการณ์การสัมผัสเพื่อกำหนดค่าปุ่มต่างๆให้ทำงานคล้ายกับเดสก์ท็อป ใน iOS เหตุการณ์ของเมาส์จะถูกส่งไปอย่างรวดเร็วจนไม่ได้รับสถานะการหยุดทำงานหรือสถานะแอ็คทีฟ ดังนั้น:active
สถานะหลอกจะถูกทริกเกอร์ก็ต่อเมื่อมีการตั้งค่าเหตุการณ์การสัมผัสบนองค์ประกอบ HTML ตัวอย่างเช่นเมื่อตั้งค่า ontouchstart บนองค์ประกอบดังนี้:
<button class="action" ontouchstart=""
style="-webkit-tap-highlight-color: rgba(0,0,0,0);">
Testing Touch on iOS
</button>
ตอนนี้เมื่อแตะปุ่มค้างไว้บน iOS ปุ่มจะเปลี่ยนเป็นสีที่ระบุโดยไม่มีสีเทาโปร่งใสโดยรอบปรากฏขึ้น
กล่าวอีกนัยหนึ่งคือการตั้งค่าontouchstart
เหตุการณ์ (แม้ว่าจะว่างเปล่า) เป็นการบอกให้เบราว์เซอร์ตอบสนองต่อเหตุการณ์การสัมผัสอย่างชัดเจน
ในความคิดของฉันนี่เป็นพฤติกรรมที่มีข้อบกพร่องและอาจย้อนกลับไปในช่วงเวลาที่เว็บ "มือถือ" ไม่มีอยู่จริง (ดูภาพหน้าจอเหล่านั้นในหน้าที่เชื่อมโยงเพื่อดูว่าฉันหมายถึงอะไร) และทุกอย่างเน้นที่เมาส์ เป็นที่น่าสนใจที่จะทราบว่าเบราว์เซอร์มือถืออื่น ๆ ที่ใหม่กว่าเช่นบน Android แสดงสถานะหลอก `` ใช้งาน 'เมื่อสัมผัสได้ดีโดยไม่ต้องแฮ็กใด ๆ เช่นสิ่งที่จำเป็นสำหรับ iOS
(หมายเหตุด้านข้าง: หากคุณต้องการใช้สไตล์ที่กำหนดเองบน iOS คุณสามารถปิดใช้งานกล่องโปร่งแสงสีเทาเริ่มต้นที่ iOS ใช้แทนสถานะ:active
หลอกโดยใช้-webkit-tap-highlight-color
คุณสมบัติ CSS ตามที่อธิบายไว้ในหน้าที่เชื่อมโยงเดียวกันด้านบน .)
หลังจากการทดลองบางครั้งวิธีแก้ปัญหาที่คาดไว้ในการตั้งค่าontouchstart
เหตุการณ์ใน<body>
องค์ประกอบที่เหตุการณ์สัมผัสทั้งหมดแล้วฟองจะทำงานได้ไม่เต็มที่ หากองค์ประกอบสามารถมองเห็นได้ในวิวพอร์ตเมื่อหน้าโหลดแสดงว่าทำงานได้ดี แต่การเลื่อนลงและแตะองค์ประกอบที่อยู่นอกวิวพอร์ตจะไม่ทำให้เกิดสถานะ:active
หลอกอย่างที่ควรจะเป็น ดังนั้นแทนที่จะเป็น
<!DOCTYPE html>
<html><body ontouchstart></body></html>
แนบเหตุการณ์กับองค์ประกอบทั้งหมดแทนที่จะอาศัยเหตุการณ์ที่เกิดขึ้นกับร่างกาย (โดยใช้ jQuery):
$('body *').on('touchstart', function (){});
อย่างไรก็ตามฉันไม่ทราบถึงผลกระทบด้านประสิทธิภาพของสิ่งนี้ดังนั้นโปรดระวัง
แก้ไข:มีข้อบกพร่องร้ายแรงอย่างหนึ่งในการแก้ปัญหานี้: แม้แต่การสัมผัสองค์ประกอบในขณะที่เลื่อนหน้าจะเปิดใช้งาน:active
สถานะหลอก ความอ่อนไหวนั้นแข็งแกร่งเกินไป Android แก้ปัญหานี้ได้โดยแนะนำการหน่วงเวลาเล็กน้อยก่อนที่สถานะจะแสดงซึ่งจะถูกยกเลิกหากมีการเลื่อนหน้า ด้วยเหตุนี้ฉันขอแนะนำให้ใช้สิ่งนี้กับองค์ประกอบที่เลือกเท่านั้น ในกรณีของฉันฉันกำลังพัฒนาเว็บแอปสำหรับใช้งานในฟิลด์ซึ่งโดยพื้นฐานแล้วจะเป็นรายการปุ่มสำหรับนำทางหน้าและส่งการดำเนินการ เนื่องจากทั้งหน้ามีปุ่มค่อนข้างมากในบางกรณีสิ่งนี้จึงใช้ไม่ได้กับฉัน อย่างไรก็ตามคุณสามารถตั้งค่าสถานะ:hover
หลอกเพื่อกรอกข้อมูลนี้แทนได้ หลังจากปิดใช้งานกล่องสีเทาเริ่มต้นสิ่งนี้จะทำงานได้อย่างสมบูรณ์
ontouchstart
โดยไม่ต้อง=""
? (HTML5)