คำค้นหาสื่อเคลื่อนไหวแบบลดความเร็วจะตรวจหาว่าผู้ใช้ได้ขอให้ระบบปฏิบัติการลดปริมาณภาพเคลื่อนไหวหรือการเคลื่อนไหวที่ใช้หรือไม่
ไม่ใช่ว่าทุกคนจะชอบภาพเคลื่อนไหวหรือการเปลี่ยนภาพการตกแต่ง ผู้ใช้บางคนอาจมีอาการวิงเวียน
เมื่อต้องเลื่อนผ่านพารัลแลกซ์ เอฟเฟกต์การซูม และอื่นๆ คำค้นหาสื่อค่ากำหนดของผู้ใช้ prefers-reduced-motion
ช่วยให้คุณออกแบบเว็บไซต์ตัวแปรที่ลดการเคลื่อนไหวได้สำหรับผู้ใช้ที่แสดงความต้องการนี้
มีการเคลื่อนไหวมากเกินไปในชีวิตจริงและบนเว็บ
เมื่อวันก่อน ผมเล่นสเก็ตน้ำแข็งกับลูกๆ วันนี้เป็นวันที่ดี มีแดดส่อง และลานสเก็ตน้ำแข็ง เต็มไปด้วยผู้คน ⛸ ปัญหาเดียวก็คือฉันไม่รับมือกับฝูงชน เป้าหมายที่เคลื่อนไหวได้มากมายขนาดนั้น ฉันเลยไม่โฟกัสกับอะไรเลย แต่สุดท้ายก็แพ้และรู้สึกว่าภาพมันเยอะเกินไป เหมือนจะจ้องมองเขากวางเลย 🐜
ในบางครั้ง กรณีเดียวกันนี้อาจเกิดขึ้นบนเว็บด้วย เช่น โฆษณากะพริบ เอฟเฟกต์พารัลแลกซ์สวยๆ ภาพเคลื่อนไหวที่เปิดเผยอย่างน่าประหลาดใจ การเล่นวิดีโออัตโนมัติ ฯลฯ บางครั้งเว็บอาจล้นเกินไป...
โชคดีที่เราก็พบวิธีแก้ปัญหานี้ ซึ่งต่างจากในชีวิตจริง คิวรี่สื่อของ CSS
prefers-reduced-motion
ช่วยให้นักพัฒนาซอฟต์แวร์สร้างตัวแปรของหน้าเว็บสำหรับผู้ใช้ที่ต้องการลดการเคลื่อนไหวได้ ซึ่งประกอบด้วยอะไรก็ได้ ตั้งแต่การละเว้นการเล่นวิดีโออัตโนมัติ การปิดใช้เอฟเฟ็กต์การตกแต่งเพียงอย่างเดียว ไปจนถึงการออกแบบหน้าเว็บใหม่สำหรับผู้ใช้บางรายโดยสมบูรณ์
ก่อนที่จะเจาะลึกรายละเอียดของฟีเจอร์นี้ เรามาย้อนกลับไป 1 ปัจจัยและคิดว่าภาพเคลื่อนไหวที่ใช้บนเว็บกันมีอะไรบ้าง หากต้องการ คุณสามารถข้ามข้อมูลพื้นฐานและข้ามไปที่รายละเอียดทางเทคนิคด้านล่างได้เลย
ภาพเคลื่อนไหวในเว็บ
ภาพเคลื่อนไหวมักใช้เพื่อให้ความคิดเห็นแก่ผู้ใช้ เช่น เพื่อให้ผู้ใช้ทราบว่าได้รับการดำเนินการแล้วและกำลังประมวลผลอยู่ ตัวอย่างเช่น บนเว็บไซต์ช็อปปิ้ง ผลิตภัณฑ์อาจแสดงเป็นภาพเคลื่อนไหวเพื่อให้ "บิน" ลงในรถเข็นช็อปปิ้งเสมือน ซึ่งแสดงเป็นไอคอนที่มุมขวาบนของเว็บไซต์
กรณีการใช้งานอีกกรณีหนึ่งคือการใช้การเคลื่อนไหวเพื่อแฮ็กการรับรู้ของผู้ใช้โดยใช้หน้าจอโครงกระดูก ข้อมูลเมตาตามบริบท และตัวอย่างรูปภาพคุณภาพต่ำเพื่อกินเวลาส่วนใหญ่ของผู้ใช้ และทำให้ประสบการณ์ทั้งหมดเร็วขึ้น แนวคิดคือการให้บริบทแก่ผู้ใช้เกี่ยวกับสิ่งที่จะเกิดขึ้น และให้การโหลดสิ่งต่างๆ โดยเร็วที่สุดเท่าที่จะเป็นไปได้แก่ผู้ใช้
ขั้นตอนสุดท้ายคือเอฟเฟกต์ตกแต่ง เช่น การไล่ระดับสีแบบเคลื่อนไหว, การเลื่อนพารัลแลกซ์, วิดีโอพื้นหลัง และอื่นๆ อีกมากมาย แม้ว่าผู้ใช้จำนวนมากจะชอบภาพเคลื่อนไหวเหล่านี้ แต่ผู้ใช้บางคนไม่ชอบเพราะรู้สึกว่า เสียสมาธิหรือรู้สึกว่าทำงานช้าลง ในกรณีเลวร้ายที่สุด ผู้ใช้อาจมีอาการวิงเวียนศีรษะราวกับว่าเป็นการใช้งานในชีวิตจริง ดังนั้นการลดภาพเคลื่อนไหวจึงเป็นสิ่งจำเป็นทางการแพทย์สำหรับผู้ใช้เหล่านี้
สเปกตรัมของเส้นเลือดสั่งการโดยการเคลื่อนไหว
ผู้ใช้บางรายอาจพบ สิ่งรบกวนหรือคลื่นไส้จากเนื้อหาที่เป็นภาพเคลื่อนไหว เช่น ภาพเคลื่อนไหวแบบเลื่อนอาจทำให้เกิดความผิดปกติของเส้นรอบวงเมื่อองค์ประกอบอื่นๆ ที่ไม่ใช่องค์ประกอบหลักที่เชื่อมโยงกับการเลื่อนไปรอบๆ เป็นจำนวนมาก เช่น ภาพเคลื่อนไหวแบบเลื่อนแบบพารัลแลกซ์อาจทำให้เกิดความผิดปกติของเส้นประสาทสั่งการ เนื่องจากองค์ประกอบพื้นหลังจะเคลื่อนไหวในอัตราที่แตกต่างจากองค์ประกอบพื้นหน้า ปฏิกิริยาของโรคหลอดเลือดสมอง (หูชั้นใน) ได้แก่ วิงเวียน คลื่นไส้ และปวดศีรษะไมเกรน และบางครั้งต้องนอนพักเพื่อฟื้นตัว
นำการเคลื่อนไหวในระบบปฏิบัติการออก
ระบบปฏิบัติการจำนวนมากมีการตั้งค่าการเข้าถึงสำหรับการระบุค่ากำหนดของการเคลื่อนไหวที่ลดลงเป็นเวลานาน ภาพหน้าจอด้านล่างแสดงค่ากำหนดลดการเคลื่อนไหวของ macOS Mojave และการตั้งค่านำภาพเคลื่อนไหวออกของ Android Pie เมื่อเลือก ค่ากำหนดเหล่านี้จะทำให้ระบบปฏิบัติการ ไม่ใช้เอฟเฟกต์ตกแต่ง เช่น การเปิดแอปภาพเคลื่อนไหว แอปพลิเคชันสามารถและควรดำเนินการตามการตั้งค่านี้ด้วย และนำภาพเคลื่อนไหวที่ไม่จำเป็นทั้งหมดออก
นำการเคลื่อนไหวออกจากเว็บ
คำค้นหาสื่อระดับ 5 ยังช่วยนำการตั้งค่าการเคลื่อนไหวของผู้ใช้ที่ลดลงมาสู่เว็บเช่นกัน คำค้นหาสื่อช่วยให้ผู้เขียนสามารถทดสอบและค้นหาค่าหรือฟีเจอร์ของ User Agent หรืออุปกรณ์ที่แสดงโดยไม่ขึ้นอยู่กับเอกสารที่แสดงผล คิวรี่สื่อ
prefers-reduced-motion
ใช้เพื่อ
ตรวจสอบว่าผู้ใช้ตั้งค่ากำหนดของระบบปฏิบัติการให้ลดจำนวนภาพเคลื่อนไหวหรือการเคลื่อนไหวที่ใช้
ค่าที่เป็นไปได้มี 2 ค่า ได้แก่
no-preference
: บ่งบอกว่าผู้ใช้ไม่มีค่ากำหนดในระบบปฏิบัติการที่สำคัญ ค่าคีย์เวิร์ดนี้จะประเมินเป็นfalse
ในบริบทของบูลีนreduce
: ระบุว่าผู้ใช้ตั้งค่ากำหนดระบบปฏิบัติการ โดยระบุว่าอินเทอร์เฟซควรลดการเคลื่อนไหวหรือภาพเคลื่อนไหวให้เหลือน้อยที่สุด โดยเฉพาะในจุดที่นำการเคลื่อนไหวที่ไม่จำเป็นออกทั้งหมด
การทำงานกับคิวรี่สื่อจากบริบท CSS และ JavaScript
สำหรับคำค้นหาสื่อทั้งหมด คุณจะตรวจสอบ prefers-reduced-motion
จากบริบท CSS และบริบท JavaScript ได้
เพื่อให้เห็นภาพทั้ง 2 อย่าง สมมติว่าฉันมีปุ่มลงชื่อสมัครใช้ที่สำคัญที่อยากให้ผู้ใช้คลิก ฉันสามารถกำหนดภาพเคลื่อนไหวแบบ "สั่น" ที่ดึงดูดความสนใจได้ดี แต่ในฐานะพลเมืองเว็บที่ดี ฉันจะเล่นเฉพาะสำหรับผู้ใช้ที่เห็นด้วยกับภาพเคลื่อนไหวอย่างชัดเจนเท่านั้น แต่ไม่ใช่คนอื่นๆ ซึ่งอาจเป็นผู้ใช้ที่เลือกไม่ใช้ภาพเคลื่อนไหว หรือผู้ใช้บนเบราว์เซอร์ที่ไม่เข้าใจคำค้นหาสื่อ
/*
If the user has expressed their preference for
reduced motion, then don't use animations on buttons.
*/
@media (prefers-reduced-motion: reduce) {
button {
animation: none;
}
}
/*
If the browser understands the media query and the user
explicitly hasn't set a preference, then use animations on buttons.
*/
@media (prefers-reduced-motion: no-preference) {
button {
/* `vibrate` keyframes are defined elsewhere */
animation: vibrate 0.3s linear infinite both;
}
}
เท่านั้น
ในการสาธิตวิธีทำงานกับ prefers-reduced-motion
กับ JavaScript สมมติว่าฉันได้กำหนดภาพเคลื่อนไหวที่ซับซ้อนด้วย Web Animations API ขณะที่กฎ CSS จะทริกเกอร์แบบไดนามิกโดยเบราว์เซอร์เมื่อค่ากำหนดของผู้ใช้เปลี่ยนไป สำหรับภาพเคลื่อนไหว JavaScript
ที่ฉันต้องคอยฟังการเปลี่ยนแปลงด้วยตนเอง แล้วหยุดภาพเคลื่อนไหวที่อาจกำลังดำเนินอยู่ด้วยตนเอง (หรือเริ่มใหม่หากผู้ใช้อนุญาต)
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
mediaQuery.addEventListener('change', () => {
console.log(mediaQuery.media, mediaQuery.matches);
// Stop JavaScript-based animations.
});
โปรดทราบว่าจะต้องมีวงเล็บล้อมรอบคำค้นหาสื่อจริงดังนี้
window.matchMedia('prefers-reduced-motion: reduce');
window.matchMedia('(prefers-reduced-motion: reduce)');
กำลังทำงานกับคิวรี่สื่อจาก <picture>
บริบท
กรณีการใช้งานที่น่าสนใจคือการเล่น AVIF, WebP หรือ GIF แบบเคลื่อนไหวที่ขึ้นอยู่กับแอตทริบิวต์ media
หาก (prefers-reduced-motion: no-preference)
ประเมินผลได้เป็น true
คุณก็แสดงเวอร์ชันภาพเคลื่อนไหวได้ หรือไม่ก็เวอร์ชันแบบคงที่:
<picture>
<!-- Animated versions. -->
<source
srcset="nyancat.avifs"
type="image/avif"
media="(prefers-reduced-motion: no-preference)"
/>
<source
srcset="nyancat.gif"
type="image/gif"
media="(prefers-reduced-motion: no-preference)"
/>
<!-- Static versions. -->
<img src="nyancat.png" alt="Nyan cat" width="250" height="250" />
</picture>
ดูตัวอย่างได้ด้านล่างนี้ ลองสลับค่ากำหนดการเคลื่อนไหวของอุปกรณ์เพื่อดูความแตกต่าง
ดูค่ากำหนดของผู้ใช้ ณ เวลาที่ส่งคำขอ
ส่วนหัวคำแนะนำไคลเอ็นต์ Sec-CH-Prefers-Reduced-Motion
ช่วยให้เว็บไซต์รับค่ากำหนดการเคลื่อนไหวของผู้ใช้ (ไม่บังคับ) ได้ในเวลาที่ขอ ทำให้เซิร์ฟเวอร์แทรก CSS ที่ถูกต้องได้ด้วยเหตุผลด้านประสิทธิภาพ
การสาธิต
ฉันได้สร้างการสาธิตเล็กๆ น้อยๆ โดยอิงจาก
🐈 แมวสถานะ HTTP สุดเจ๋งของ Rogério Vicente ก่อนอื่น ให้อยากชื่นชมมุกตลกก่อนนะ
มุกนี้ตลกดี ผมจะรอ เมื่อคุณกลับมาแล้ว ฉันจะขอแนะนำการสาธิต เมื่อคุณเลื่อนลง แมวสถานะ HTTP แต่ละแมวจะปรากฏขึ้นสลับกันทางขวาหรือซ้าย เกมนี้เป็นภาพเคลื่อนไหว 60 FPS ที่ลื่นไหลไม่มีสะดุด แต่อย่างที่กล่าวไปข้างต้น ผู้ใช้บางรายอาจไม่ชอบหรืออาจจะวิงเวียนศึกจากวิดีโอ การสาธิตนี้จึงมีการวางโปรแกรมไว้ตาม prefers-reduced-motion
โหมดนี้ยังทำงานแบบไดนามิก ผู้ใช้จึงเปลี่ยนค่ากำหนดได้ทันทีโดยไม่ต้องโหลดซ้ำ หากผู้ใช้ต้องการลดการเคลื่อนไหว ภาพเคลื่อนไหวแสดงส่วนที่ไม่จำเป็นจะหายไป และเหลือเพียงแค่การเลื่อนแบบปกติ Screencast ด้านล่างแสดงการสาธิตการใช้งาน
บทสรุป
การเคารพค่ากำหนดของผู้ใช้เป็นกุญแจสำคัญสำหรับเว็บไซต์สมัยใหม่ และเบราว์เซอร์ต่างๆ ต่างก็เปิดฟีเจอร์ที่ช่วยให้นักพัฒนาเว็บทำงานได้มากขึ้นเรื่อยๆ ตัวอย่างหนึ่งที่เปิดตัวใหม่คือ prefers-color-scheme
ซึ่งจะตรวจพบว่าผู้ใช้ชอบรูปแบบสีอ่อนหรือมืด คุณอ่านทุกอย่างเกี่ยวกับ prefers-color-scheme
ได้ในบทความ สวัสดี Darkness, My Old Friend 🌒
ขณะนี้คณะทำงานของ CSS กำลังทำให้คำค้นหาสื่อที่ต้องการของผู้ใช้เป็นไปตามมาตรฐานมากขึ้น เช่น
prefers-reduced-transparency
(ตรวจสอบว่าผู้ใช้ต้องการลดความโปร่งใสหรือไม่)
prefers-contrast
(ตรวจสอบว่าผู้ใช้ขอให้ระบบเพิ่มหรือลดปริมาณคอนทราสต์ระหว่างสีที่อยู่ติดกันหรือไม่) และ inverted-colors
(ตรวจสอบว่าผู้ใช้ต้องการสีที่สลับกันหรือไม่)
(โบนัส) การบังคับให้การเคลื่อนไหวลดลงในทุกเว็บไซต์
ไม่ใช่ทุกเว็บไซต์จะใช้ prefers-reduced-motion
หรืออาจไม่มากพอสำหรับรสนิยมของคุณ
แต่หากต้องการหยุดการเคลื่อนไหวในเว็บไซต์ทั้งหมดไม่ว่าจะด้วยเหตุผลใดก็ตาม คุณก็ทำได้ วิธีหนึ่งที่ทำได้คือการแทรกสไตล์ชีตที่มี CSS ต่อไปนี้ลงในทุกหน้าเว็บที่คุณเข้าชม มีส่วนขยายเบราว์เซอร์หลายอย่าง (ต้องรับความเสี่ยงเองนะ) ที่ทำให้เป็นเช่นนั้น
@media (prefers-reduced-motion: reduce) {
*,
::before,
::after {
animation-delay: -1ms !important;
animation-duration: 1ms !important;
animation-iteration-count: 1 !important;
background-attachment: initial !important;
scroll-behavior: auto !important;
transition-duration: 1ms !important;
transition-delay: 1ms !important;
}
}
วิธีการทำงานคือ CSS ข้างต้นจะลบล้างระยะเวลาของภาพเคลื่อนไหวและการเปลี่ยนทั้งหมดเป็นระยะเวลาสั้นๆ จนมองไม่เห็นอีกต่อไป เนื่องจากบางเว็บไซต์ต้องอาศัยภาพเคลื่อนไหวในการเรียกใช้เพื่อให้ทำงานได้อย่างถูกต้อง (อาจเป็นเพราะขั้นตอนหนึ่งขึ้นอยู่กับการเริ่มทำงานของเหตุการณ์ animationend
) ดังนั้นวิธีการ animation: none !important;
ที่รุนแรงมากขึ้นจึงใช้งานไม่ได้ แม้แต่การแฮ็กด้านบนก็ยังไม่รับประกันว่าจะประสบความสำเร็จในทุกเว็บไซต์ (เช่น ไม่สามารถหยุดการเคลื่อนไหวที่เริ่มต้นผ่าน Web Animations API) ดังนั้นอย่าลืมปิดใช้งานเมื่อพบความเสียหาย
ลิงก์ที่เกี่ยวข้อง
- ฉบับร่างล่าสุดของข้อกำหนดคำค้นหาสื่อระดับ 5
prefers-reduced-motion
ในสถานะ Chrome Platformprefers-reduced-motion
ข้อบกพร่องของ Chromium- กะพริบความตั้งใจที่จะใช้การโพสต์
ข้อความแสดงการยอมรับ
ขอขอบคุณ Stephen McGruer ที่ใช้งาน prefers-reduced-motion
ใน Chrome ร่วมกับ Rob Dodson ได้เช่นกันที่รีวิวบทความนี้
รูปภาพหลักโดย Hannah Cauhepe ใน Unsplash