หกระดับของดาร์กโหมด (2024)
(cssence.com)- สรุปการแบ่งเป็น 8 ระดับ ที่ค่อย ๆ ขยายขอบเขตการทำดาร์กโหมด ตั้งแต่ความสามารถพื้นฐานของเบราว์เซอร์ไปจนถึง JavaScript media queries
- วิธีที่ง่ายที่สุดคือประกาศ
<meta name="color-scheme" content="light dark">หรือcolor-scheme: light darkเท่านั้น ก็สามารถตั้งค่าให้ทำงานตาม ความชอบด้านชุดสีของผู้ใช้ ได้ - ในระดับที่สูงขึ้น สามารถใช้ฟังก์ชัน
light-dark(),@media (prefers-color-scheme: dark), และ สไตล์ชีตแยกตามสคีม เพื่อปรับได้กว้าง ไม่ใช่แค่สี แต่รวมถึงรูปภาพและเงาด้วย - สามารถทำตัวสลับที่ไม่ได้ตามแค่ค่าระบบของผู้ใช้ โดยให้ตัวเลือก Automatic·light·dark ได้ 3 แบบ และใช้
:has()ร่วมกับ meta element จริงในการตรวจธีมได้ - ครอบคลุมทั้ง ข้อจำกัดด้านการเข้าถึงของ Safari และข้อสังเกตเกี่ยวกับการทำงานของ
prefers-color-schemeตอนสั่งพิมพ์ ซึ่งชี้ให้เห็นว่าปัจจุบันแค่ฟีเจอร์ CSS รุ่นใหม่ก็ทำให้รองรับโหมดสว่าง/มืดได้ง่ายขึ้นมาก
การทำดาร์กโหมดแบบแบ่งเป็นระดับ
-
Level 1: Barebone
- แม้ไม่มี CSS เลยก็เปิดใช้งานการแยก light/dark ได้ โดยเพียงเพิ่ม
<meta name="color-scheme" content="light dark">ใน head ของเอกสาร เบราว์เซอร์ก็จะเริ่มทำตาม ความชอบด้านชุดสี ของผู้ใช้ - ตามทฤษฎีแล้ว ลำดับของรายการในแอตทริบิวต์
contentมีความหมาย และผู้ใช้ที่ไม่ได้ระบุความชอบด้านชุดสีจะได้รับค่าตัวแรกในรายการที่คั่นด้วยช่องว่าง - แต่เนื่องจากการตั้งค่าของระบบปฏิบัติการในปัจจุบันไม่มีตัวเลือกไม่เลือกชุดสี สุดท้ายแล้วในทางปฏิบัติจึงมักลงเอยด้วยสคีมที่ตรงกับการตั้งค่าของระบบปฏิบัติการ
- สามารถระบุค่าเดียวใน
contentได้เช่นกัน ซึ่งในกรณีนั้นจะบังคับใช้สคีมนั้นโดยไม่คำนึงถึงความชอบของผู้ใช้ - meta tag นี้ทำหน้าที่เป็น วิธีฝั่ง HTML ที่สอดคล้องกับวิธีแบบ CSS ในระดับถัดไปพอสมควร
- แม้ไม่มี CSS เลยก็เปิดใช้งานการแยก light/dark ได้ โดยเพียงเพิ่ม
-
Level 2: Basic
- ใน CSS สามารถใช้
html { color-scheme: light dark; }เพื่อเปิดใช้การแยก โหมดสว่าง/มืด ได้ - หากมี meta tag อยู่ใน DOM แล้ว ก็ไม่จำเป็นต้องใช้ประกาศนี้ และหากควบคุม HTML ได้ แนะนำให้ใช้ meta tag เพราะเบราว์เซอร์จะรับรู้คำสั่งได้ตั้งแต่ก่อน parse CSS
- ทั้งสองวิธีช่วยให้ใช้ user agent default styles และ โหมดสว่าง/มืด ที่รวมอยู่ในนั้นได้
- หากเพิ่ม CSS เข้าไปอีก แต่จำกัดการใช้งานไว้กับ CSS system colors เป็นหลัก ก็ยังทำดีไซน์ที่ค่อนข้างเป็นระเบียบได้
- ต่างจาก meta tag ที่มีผลกับทั้งเอกสารเสมอ การประกาศ
color-schemeใน CSS สามารถกำหนดที่ตำแหน่งอื่นนอกจาก root element ได้ด้วย จึงมีช่องให้ประยุกต์ใช้งานเพิ่ม
- ใน CSS สามารถใช้
-
Level 3: Benign
- ใช้ ฟังก์ชันสี
light-dark()ของ CSS ซึ่งถูกเพิ่มเข้ามาไม่นานนัก เพื่อปรับโหมดสว่าง/มืดแบบง่าย ๆ ได้ - ตัวอย่างเช่น
background-color: light-dark(black, white);และcolor: light-dark(white, black);โดยอาร์กิวเมนต์ตัวแรกใช้กับโหมดสว่าง และตัวที่สองใช้กับโหมดมืด - จะใส่ค่าสีจริงโดยตรงก็ได้ หรือใส่ custom properties ที่ตีความเป็นสีก็ได้
- ตลอดทั้งบทความ ระดับนี้เป็นระดับเดียวที่ ณ เวลาที่เขียนยังมี การรองรับของเบราว์เซอร์ ไม่เพียงพอ
- ใช้ ฟังก์ชันสี
-
Level 4: Bold
- สามารถทำการสลับดาร์กโหมดด้วย media query แบบดั้งเดิม
@media (prefers-color-scheme: dark)ได้ - ไม่ว่าจะ query ฝั่ง
lightหรือdarkก็สามารถทำ การปรับแต่งได้เต็มที่ที่สุด และไม่ได้จำกัดแค่การเปลี่ยนสีอย่างเดียว - สามารถปรับอย่างการลดความสดของภาพด้วยฟิลเตอร์ในดาร์กโหมด หรือเปลี่ยน box shadow เป็นเส้นขอบได้ทั้งหมด
- สามารถทำการสลับดาร์กโหมดด้วย media query แบบดั้งเดิม
-
Level 5: Bisectional
- media query ใช้ใน HTML ได้เช่นกัน โดยใส่ในแอตทริบิวต์
mediaของlinkelement เพื่อแยก สไตล์ชีตตามสคีม ได้ - มีตัวอย่างการเชื่อม
light.cssและdark.cssเข้ากับprefers-color-scheme: lightและprefers-color-scheme: darkตามลำดับ - หากขอบเขตการปรับแต่งกว้าง การแยกเป็นไฟล์เฉพาะทางจะเหมาะกว่า และเบราว์เซอร์สามารถละเลยไฟล์ CSS ที่ไม่ตรงกับ query ได้ จึงอาจลดจำนวนไฟล์ที่ต้องดาวน์โหลดลงหนึ่งไฟล์
- media query ใช้ใน HTML ได้เช่นกัน โดยใส่ในแอตทริบิวต์
-
Level 6: Ballistic
- ใน JavaScript สามารถใช้ media query สำหรับชุดสี ผ่าน
window.matchMedia('(prefers-color-scheme:dark)')ได้ - สามารถ query ได้ว่ากำลังเป็นสคีมสว่างหรือมืดแบบเดียวกับ media query อื่น ๆ แล้วนำผลลัพธ์ไปทำงานตามต้องการ
- ในการใช้งานจริง ไม่จำเป็นต้องยึดวิธีจากระดับก่อนหน้าเพียงแบบเดียว แต่สามารถ ผสมหลายเทคนิค เข้าด้วยกันได้
- ใน JavaScript สามารถใช้ media query สำหรับชุดสี ผ่าน
ตัวสลับของผู้ใช้และแพตเทิร์นขั้นสูง
-
Level 7: Beyond
- ไม่จำเป็นต้องพึ่งแต่ค่าความชอบของระบบผู้ใช้เท่านั้น แต่สามารถสร้าง color scheme switcher ได้
- ตัวสลับนี้ไม่ใช่ค่าแบบบูลีนธรรมดา และควรมีโหมด Automatic ที่ใช้
prefers-color-schemeเป็นค่าเริ่มต้น - เมื่อวางตัวสลับทับลงไป ผู้ใช้จะเลือกได้หนึ่งใน สามโหมด คือ Automatic, light, dark
-
Level 8: Beguiling
- เวลาทำตัวสลับแบบ Level 7 โดยทั่วไปมักใช้วิธีเพิ่มคลาส
.darkหรือแอตทริบิวต์อย่างdata-theme="dark"ให้กับ HTML element - แต่อีกทางหนึ่งสามารถใช้
:has()เพื่อ query การมีอยู่ของ<meta name="color-scheme" content="dark">โดยตรงได้ - ในตัวอย่าง มีการตั้งค่า ตัวแปร CSS อย่าง
--color-bg,--color-textให้เป็นค่าของดาร์กโหมดภายใต้ selectorhtml:has(meta[name="color-scheme"][content="dark"]) - จึงสามารถตรวจธีมจาก meta element จริงได้โดยไม่ต้องมีคลาสหรือ data attribute แยกต่างหาก
- เวลาทำตัวสลับแบบ Level 7 โดยทั่วไปมักใช้วิธีเพิ่มคลาส
ประเด็นเพิ่มเติมและข้อสังเกต
-
ข้อสังเกตจาก CSS Naked Day
- หลังจากเอาสไตล์ออก พบว่าแทบทุกเว็บไซต์ที่เข้าไปยัง ไม่มีดาร์กโหมด ซึ่งกลายเป็นที่มาของการแบ่งระดับดาร์กโหมดนี้
- ผู้เขียนยังกล่าวด้วยว่า เมื่อสร้างเว็บไซต์ใหม่ตั้งแต่ต้นและเขียนสไตล์ใหม่ ฟีเจอร์ CSS สมัยใหม่ทำให้ การใส่โหมดสว่าง/มืดในตัว กลายเป็นเรื่องง่ายมาก
-
ปัญหาการเข้าถึงใน Safari
- มีการชี้ว่า จนกระทั่งไม่นานมานี้ Safari ยังไม่ให้ สีลิงก์ที่เข้าถึงได้ ในดาร์กโหมด
- ใน CSS Naked Day ครั้งก่อน ผู้เขียนเคยพบปัญหานี้และลบ meta tag ออก จากนั้นใช้เฉพาะชุดสีสว่าง
- ภายหลังจึงเพิ่ม meta tag กลับเข้าไป แต่ก็รับรู้ว่าผู้ใช้ Safari เวอร์ชันเก่าอาจเจอ การเข้าถึงที่แย่ลง
- ยังพบด้วยว่าในดาร์กโหมดของ Safari กล่องข้อความ ไม่มีเส้นขอบที่มองเห็นได้
- การพึ่งแค่ user agent styles อย่างเดียว ต่อให้ใช้ semantic HTML ถูกต้อง ก็ยังไม่อาจรับประกันการเข้าถึงได้สมบูรณ์ จึงมีการคิดต่อว่าจะคงสไตล์ไว้มากพอใน CSS Naked Day ครั้งถัดไปอย่างไร
-
การพิมพ์และเงื่อนไข
screen and- เหตุผลที่ใช้
screen and ...ในตัวอย่างของ Bisectional คือมีเจตนา ไม่รวมอุปกรณ์พิมพ์ - โดยตั้งสมมุติฐานว่ามี core stylesheet ที่ไม่ผูกกับธีม หรือมี stylesheet สำหรับงานพิมพ์แยกต่างหาก และมองว่าดาร์กโหมดบนเครื่องพิมพ์อาจใช้หมึกมาก จึงเลือกแยกออกอย่างปลอดภัย
- ในการทดสอบจริง ต่อให้เปิดดาร์กโหมดของระบบแล้วสั่งพิมพ์ ก็ยังได้แค่ตัวอักษรสีดำบนกระดาษขาว จึงสังเกตได้ว่าเบราว์เซอร์ไม่ได้ใช้สไตล์ดาร์กโหมดนั้นกับงานพิมพ์
- จากการทดสอบเพิ่ม ในหน้าตัวอย่างก่อนพิมพ์
prefers-color-schemeถูกรายงานเป็น light เสมอ โดยยืนยันใน Firefox และ Chromium - ปิดท้ายด้วยมุกว่าถ้ามีเครื่องพิมพ์ที่ใช้กระดาษสีดำกับหมึกสีขาวก็คงน่าเสียดายอยู่เหมือนกัน
- เหตุผลที่ใช้
1 ความคิดเห็น
ความเห็นจาก Hacker News
userContent.cssของ Firefox ก็ใช้ได้ดีนะ