การเปลี่ยนโหมดแสงและความมืดที่ราบรื่น: โทเค็น, CSS และการเคลื่อนไหว
วิธีสร้างสวิตช์ธีมสว่าง/มืดที่เคารพการตั้งค่าระบบ หลีกเลี่ยงการโหลดแฟลช จัดรูปแบบการควบคุมแบบเนทิฟ และเคลื่อนไหวโดยไม่กระทบต่อการเข้าถึง
หลัก Takeaway
สร้างธีมบนโทเค็นความหมาย ปฏิบัติตามการตั้งค่าระบบด้วยโครงร่างสีที่ต้องการตามค่าเริ่มต้น อนุญาตให้ผู้คนแทนที่มัน และตั้งค่าคุณสมบัติโครงร่างสีเพื่อให้ตัวควบคุมฟอร์มและแถบเลื่อนตรงกัน ใช้ธีมที่บันทึกไว้ก่อนที่เพจจะแสดงผลเพื่อหลีกเลี่ยงการกะพริบ ทำให้ภาพเคลื่อนไหวของสวิตช์สั้น เช่น การข้ามเฟดอย่างรวดเร็วหรือการเปลี่ยนมุมมอง และข้ามไปเมื่อเปิดการเคลื่อนไหวแบบลดขนาด
เริ่มจากการตั้งค่าระบบ
คุณลักษณะสื่อรูปแบบสีที่ต้องการจะบอกคุณว่าผู้ใช้ถามระบบปฏิบัติการของตนเกี่ยวกับธีมสีอ่อนหรือสีเข้ม ใช้เป็นค่าเริ่มต้น และเพิ่มสวิตช์ในแอปที่จะแทนที่และจดจำไว้
ธีมที่มีโทเค็น ไม่ใช่การแทนที่
กำหนดสีเป็นโทเค็นความหมาย (พื้นผิว ข้อความ เส้นขอบ การเน้นเสียง) และให้แต่ละธีมมีค่าเป็นของตัวเอง ซึ่งโดยปกติจะเป็นคุณสมบัติที่กำหนดเองของ CSS บนองค์ประกอบรูท ส่วนประกอบต่างๆ จะไม่เปลี่ยนแปลงระหว่างธีม เฉพาะค่าโทเค็นเท่านั้นที่ทำ นี่เป็นแนวทางโทเค็นสามระดับแบบเดียวกับที่ใช้สำหรับระบบการออกแบบหลายแบรนด์
อย่าลืมการควบคุมแบบเนทีฟ
MDN อธิบายว่าคุณสมบัติโทนสีจะบอกเบราว์เซอร์ว่าองค์ประกอบใดที่องค์ประกอบรองรับ ซึ่งจะเปลี่ยนสีเริ่มต้นของการควบคุมแบบฟอร์ม แถบเลื่อน และ UI ในตัวอื่นๆ หากไม่มีหน้ามืดก็สามารถแสดงอินพุตและแถบเลื่อนสีขาวสว่างได้
หลีกเลี่ยงแฟลชขณะโหลด
หาก JavaScript ใช้ธีมที่บันทึกไว้หลังจากที่เพจแสดงผล ผู้คนจะเห็นธีมที่ไม่ถูกต้อง ใช้โดยเร็วที่สุดโดยใช้สคริปต์อินไลน์ขนาดเล็กในส่วนหัวของเอกสารหรือแอตทริบิวต์ที่เซิร์ฟเวอร์เรนเดอร์ ก่อนที่สไตล์ชีตจะทาสี
เคลื่อนไหวสวิตช์อย่างระมัดระวัง
cross-fade สั้นๆ ประมาณ 150 ถึง 250 มิลลิวินาที ทำให้การเปลี่ยนแปลงมีเจตนา หลีกเลี่ยงการเปลี่ยนทุกคุณสมบัติสีในทุกองค์ประกอบ ซึ่งอาจช้าในหน้าขนาดใหญ่ สแนปชอต View Transition เดียวมักจะราบรื่นกว่า ทำให้ตัวสลับชัดเจนพร้อมป้ายกำกับหรือคำแนะนำเครื่องมือ และลบภาพเคลื่อนไหวเมื่อเปิดการลดการเคลื่อนไหว
ตัวอย่างการใช้งานการผลิต
/* Tokens per theme */
:root { color-scheme: light dark; --surface: #ffffff; --text: #121212; }
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) { --surface: #121212; --text: #f2f2f2; }
}
:root[data-theme="dark"] { color-scheme: dark; --surface: #121212; --text: #f2f2f2; }
:root[data-theme="light"] { color-scheme: light; }
body { background: var(--surface); color: var(--text); }
// Switch with a View Transition where supported, instantly otherwise
function setTheme(theme) {
const apply = () => { document.documentElement.dataset.theme = theme; localStorage.setItem('theme', theme); };
const reduce = matchMedia('(prefers-reduced-motion: reduce)').matches;
if (!document.startViewTransition || reduce) return apply();
document.startViewTransition(apply);
}คีย์ Principles ที่ต้องจำ
- ค่าเริ่มต้นเป็นแบบแผนสีที่ต้องการ ให้ผู้คนเข้ามาแทนที่และจดจำมัน
- ธีมที่มีโทเค็นความหมาย ไม่ใช่การแทนที่ต่อองค์ประกอบ
- ตั้งค่าโทนสีเพื่อให้การควบคุมแบบเนทิฟตรงกัน
- ใช้ธีมที่บันทึกไว้ก่อนทาสีครั้งแรก
- ทำให้ภาพเคลื่อนไหวของสวิตช์สั้นและเคารพการเคลื่อนไหวที่ลดลง
คำถามที่พบบ่อย
แหล่งที่มา
- prefers-color-scheme — MDN เว็บเอกสาร
- color-scheme — MDN เว็บเอกสาร
- View Transition API — MDN เว็บเอกสาร