สำรวจ CSS @when rule ฟีเจอร์ทรงพลังที่ช่วยให้สามารถใช้สไตล์ตามเงื่อนไข เช่น การรองรับของเบราว์เซอร์ ขนาดหน้าจอ และอื่นๆ พร้อมเรียนรู้ผ่านตัวอย่างการใช้งานจริง
CSS @when Rule: การประยุกต์ใช้สไตล์แบบมีเงื่อนไขอย่างเชี่ยวชาญ
โลกของ CSS มีการพัฒนาอย่างต่อเนื่อง เพื่อนำเสนอวิธีการที่ทรงพลังและยืดหยุ่นมากขึ้นสำหรับนักพัฒนาในการจัดสไตล์หน้าเว็บ หนึ่งในฟีเจอร์ที่กำลังได้รับความนิยมคือ @when
rule หรือที่รู้จักในชื่อ CSS Conditional Rules Module Level 1 กฎนี้ช่วยให้คุณสามารถใช้สไตล์ CSS ตามเงื่อนไขที่กำหนดได้ ซึ่งเป็นเครื่องมือที่ทรงพลังสำหรับ responsive design, การตรวจจับฟีเจอร์ และการสร้าง stylesheet ที่แข็งแกร่งและปรับเปลี่ยนได้มากขึ้น
CSS @when Rule คืออะไร?
@when
rule เป็น at-rule แบบมีเงื่อนไขใน CSS ที่ช่วยให้คุณสามารถกำหนดสไตล์ที่จะถูกนำไปใช้ก็ต่อเมื่อเงื่อนไขบางอย่างเป็นจริงเท่านั้น ลองนึกถึงมันว่าเป็นคำสั่ง if
สำหรับ CSS ของคุณ ซึ่งแตกต่างจาก media queries ที่เน้นไปที่ลักษณะของ viewport เป็นหลัก (เช่น ขนาดหน้าจอ, การวางแนว) @when
ให้วิธีการจัดการสไตล์แบบมีเงื่อนไขที่ทั่วไปและขยายขีดความสามารถได้มากกว่า มันเป็นการขยายขีดความสามารถของ at-rules แบบมีเงื่อนไขที่มีอยู่แล้วอย่าง @supports
และ @media
ข้อดีที่สำคัญของการใช้ @when
- ปรับปรุงความสามารถในการอ่านโค้ด (Code Readability): การห่อหุ้มตรรกะแบบมีเงื่อนไขไว้ในบล็อก
@when
ทำให้ CSS ของคุณเข้าใจและบำรุงรักษาได้ง่ายขึ้น ความตั้งใจเบื้องหลังการใช้สไตล์ที่เฉพาะเจาะจงจะชัดเจนยิ่งขึ้น - เพิ่มความยืดหยุ่น:
@when
สามารถจัดการกับเงื่อนไขที่ซับซ้อนกว่า media queries แบบดั้งเดิมได้ โดยเฉพาะอย่างยิ่งเมื่อใช้ร่วมกับ feature queries และตรรกะที่ขับเคลื่อนด้วย JavaScript (โดยใช้ CSS Custom Properties) - การตรวจจับฟีเจอร์ที่ง่ายขึ้น:
@when
ทำงานร่วมกับ@supports
ได้อย่างราบรื่น ช่วยให้คุณสามารถใช้สไตล์ได้เฉพาะเมื่อเบราว์เซอร์มีฟีเจอร์ที่ต้องการเท่านั้น นี่เป็นสิ่งสำคัญสำหรับ progressive enhancement - การจัดสไตล์ที่มีความหมายมากขึ้น (More Semantic Styling):
@when
ช่วยให้คุณสามารถจัดสไตล์องค์ประกอบตามสถานะหรือบริบทของมัน ซึ่งนำไปสู่ CSS ที่มีความหมายและบำรุงรักษาได้ง่ายขึ้น ตัวอย่างเช่น การจัดสไตล์องค์ประกอบตาม data attributes หรือ custom properties ที่กำหนดโดย JavaScript
ไวยากรณ์ (Syntax) ของ @when Rule
ไวยากรณ์พื้นฐานของ@when
rule มีดังนี้:
@when <condition> {
/* กฎ CSS ที่จะใช้เมื่อเงื่อนไขเป็นจริง */
}
<condition>
สามารถเป็นนิพจน์บูลีนใดๆ ที่ถูกต้องซึ่งให้ค่าเป็นจริงหรือเท็จ นิพจน์นี้มักจะเกี่ยวข้องกับ:
- Media Queries: เงื่อนไขที่ขึ้นอยู่กับลักษณะของ viewport (เช่น ความกว้างของหน้าจอ, การวางแนวของอุปกรณ์)
- Feature Queries (@supports): เงื่อนไขที่ขึ้นอยู่กับการรองรับฟีเจอร์ CSS ที่เฉพาะเจาะจงของเบราว์เซอร์
- พีชคณิตบูลีน (Boolean Algebra): การรวมเงื่อนไขหลายอย่างเข้าด้วยกันโดยใช้ตัวดำเนินการทางตรรกะ (
and
,or
,not
)
ตัวอย่างการใช้งานจริงของ @when
มาดูตัวอย่างการใช้งานจริงเพื่อแสดงให้เห็นถึงพลังและความหลากหลายของ@when
rule
1. Responsive Design ด้วย @when และ Media Queries
กรณีการใช้งานที่พบบ่อยที่สุดสำหรับ @when
คือ responsive design ซึ่งคุณจะปรับสไตล์ตามขนาดของหน้าจอ แม้ว่า media queries จะสามารถทำสิ่งนี้ได้ด้วยตัวเอง แต่ @when
ให้แนวทางที่มีโครงสร้างและอ่านง่ายกว่า โดยเฉพาะเมื่อต้องจัดการกับเงื่อนไขที่ซับซ้อน
@when (min-width: 768px) and (max-width: 1023px) {
body {
font-size: 18px;
line-height: 1.6;
}
.container {
width: 720px;
margin: 0 auto;
}
}
ในตัวอย่างนี้ สไตล์ภายในบล็อก @when
จะถูกนำไปใช้ก็ต่อเมื่อความกว้างของหน้าจออยู่ระหว่าง 768px และ 1023px (ขนาดแท็บเล็ตทั่วไป) ซึ่งให้วิธีการกำหนดสไตล์สำหรับช่วง viewport ที่เฉพาะเจาะจงได้อย่างชัดเจนและรัดกุม
หมายเหตุเกี่ยวกับการทำให้เป็นสากล (Internationalization): Responsive design มีความสำคัญอย่างยิ่งสำหรับผู้ใช้งานทั่วโลก ควรพิจารณาขนาดหน้าจอที่แตกต่างกันในแต่ละภูมิภาค ตัวอย่างเช่น การใช้งานบนมือถือมีสัดส่วนสูงกว่าในบางประเทศ ทำให้การออกแบบโดยเน้นมือถือก่อน (mobile-first) มีความสำคัญมากยิ่งขึ้น
2. การตรวจจับฟีเจอร์ (Feature Detection) ด้วย @when และ @supports
@when
สามารถใช้ร่วมกับ @supports
เพื่อใช้สไตล์เฉพาะเมื่อเบราว์เซอร์รองรับฟีเจอร์ CSS ที่ระบุเท่านั้น สิ่งนี้ช่วยให้คุณสามารถปรับปรุงเว็บไซต์ของคุณอย่างค่อยเป็นค่อยไป (progressively enhance) โดยมอบประสบการณ์ที่ดีขึ้นสำหรับผู้ใช้ที่มีเบราว์เซอร์ที่ทันสมัย ในขณะที่ยังคงความเข้ากันได้กับเบราว์เซอร์รุ่นเก่า
@when supports(display: grid) {
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
grid-gap: 20px;
}
}
@when not supports(display: grid) {
.container {
/* สไตล์สำรองสำหรับเบราว์เซอร์ที่ไม่รองรับ grid */
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.item {
width: calc(50% - 10px); /* ปรับความกว้างสำหรับเบราว์เซอร์รุ่นเก่า */
}
}
ในที่นี้ เราใช้ @supports
เพื่อตรวจสอบว่าเบราว์เซอร์รองรับ CSS Grid Layout หรือไม่ ถ้าใช่ เราจะใช้สไตล์แบบ grid กับ .container
ถ้าไม่ เราจะให้สไตล์สำรองโดยใช้ flexbox เพื่อให้แน่ใจว่าจะได้เลย์เอาต์ที่คล้ายกันในเบราว์เซอร์รุ่นเก่า
หมายเหตุเกี่ยวกับการเข้าถึงได้ทั่วโลก (Global Accessibility): การตรวจจับฟีเจอร์เป็นสิ่งสำคัญสำหรับการเข้าถึงได้ (accessibility) เบราว์เซอร์รุ่นเก่าอาจไม่รองรับ ARIA attributes หรือองค์ประกอบ HTML5 เชิงความหมาย (semantic) ใหม่ๆ ควรมีสไตล์สำรองที่เหมาะสมเพื่อให้แน่ใจว่าเนื้อหายังคงสามารถเข้าถึงได้
3. การรวม Media Queries และ Feature Queries
พลังที่แท้จริงของ @when
มาจากความสามารถในการรวม media queries และ feature queries เพื่อสร้างกฎการจัดสไตล์แบบมีเงื่อนไขที่ซับซ้อนและละเอียดอ่อนมากขึ้น
@when (min-width: 768px) and supports(backdrop-filter: blur(10px)) {
.modal {
background-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(10px);
}
}
ในตัวอย่างนี้ องค์ประกอบ .modal
จะมีพื้นหลังเบลอก็ต่อเมื่อความกว้างของหน้าจอมีขนาดอย่างน้อย 768px และ เบราว์เซอร์รองรับคุณสมบัติ backdrop-filter
เท่านั้น สิ่งนี้ช่วยให้คุณสามารถสร้างเอฟเฟกต์ที่สวยงามบนเบราว์เซอร์ที่ทันสมัย ในขณะที่หลีกเลี่ยงปัญหาด้านประสิทธิภาพหรือข้อผิดพลาดในการแสดงผลที่อาจเกิดขึ้นกับเบราว์เซอร์รุ่นเก่า
4. การจัดสไตล์ตาม Custom Properties (CSS Variables)
@when
ยังสามารถใช้ร่วมกับ CSS Custom Properties (หรือที่รู้จักในชื่อตัวแปร CSS) เพื่อสร้างสไตล์แบบไดนามิกและขับเคลื่อนด้วยสถานะได้ คุณสามารถใช้ JavaScript เพื่ออัปเดตค่าของ custom property จากนั้นใช้ @when
เพื่อใช้สไตล์ที่แตกต่างกันตามค่านั้น
ขั้นแรก กำหนด custom property:
:root {
--theme-color: #007bff; /* สีธีมเริ่มต้น */
--is-dark-mode: false;
}
จากนั้น ใช้ @when
เพื่อใช้สไตล์ตามค่าของ custom property:
@when var(--is-dark-mode) = true {
body {
background-color: #333;
color: #fff;
}
a {
color: #ccc;
}
}
สุดท้าย ใช้ JavaScript เพื่อสลับค่าของ --is-dark-mode
custom property:
document.getElementById('darkModeToggle').addEventListener('click', function() {
document.documentElement.style.setProperty('--is-dark-mode', this.checked);
});
สิ่งนี้ช่วยให้ผู้ใช้สามารถสลับระหว่างธีมสว่างและธีมมืดได้ โดยที่ CSS จะอัปเดตแบบไดนามิกตามค่าของ custom property โปรดทราบว่าการเปรียบเทียบตัวแปร CSS โดยตรงใน @when
อาจยังไม่ได้รับการสนับสนุนอย่างแพร่หลายในทุกเบราว์เซอร์ คุณอาจต้องใช้วิธีแก้ปัญหาอื่น เช่น ใช้ media query ตรวจสอบค่าที่ไม่ใช่ศูนย์แทน:
@when ( --is-dark-mode > 0 ) { ... }
อย่างไรก็ตาม ต้องแน่ใจว่า custom property มีค่าเป็นตัวเลขเพื่อให้ฟังก์ชันนี้ทำงานได้อย่างถูกต้อง
หมายเหตุเกี่ยวกับการเข้าถึงได้ (Accessibility): การมีธีมทางเลือก (เช่น dark mode) เป็นสิ่งสำคัญสำหรับการเข้าถึงได้ ผู้ใช้ที่มีความบกพร่องทางการมองเห็นอาจได้รับประโยชน์จากธีมที่มีคอนทราสต์สูง ตรวจสอบให้แน่ใจว่าตัวสลับธีมของคุณสามารถเข้าถึงได้ผ่านคีย์บอร์ดและโปรแกรมอ่านหน้าจอ
5. การจัดสไตล์ตาม Data Attributes
คุณยังสามารถใช้ @when
กับ data attributes เพื่อจัดสไตล์องค์ประกอบตามค่าข้อมูลของมันได้ ซึ่งมีประโยชน์สำหรับการสร้างอินเทอร์เฟซแบบไดนามิกที่องค์ประกอบต่างๆ เปลี่ยนรูปลักษณ์ตามการโต้ตอบของผู้ใช้หรือการอัปเดตข้อมูล
ตัวอย่างเช่น สมมติว่าคุณมีรายการงาน และแต่ละงานมี data-status
attribute ที่ระบุสถานะของมัน (เช่น "todo", "in-progress", "completed") คุณสามารถใช้ @when
เพื่อจัดสไตล์แต่ละงานให้แตกต่างกันตามสถานะของมันได้
[data-status="todo"] {
/* สไตล์เริ่มต้นสำหรับงานที่ต้องทำ */
color: #333;
}
@when attribute(data-status string equals "in-progress") {
[data-status="in-progress"] {
color: orange;
font-style: italic;
}
}
@when attribute(data-status string equals "completed") {
[data-status="completed"] {
color: green;
text-decoration: line-through;
}
}
หมายเหตุ: การรองรับเงื่อนไขการทดสอบ attribute() อาจมีจำกัดหรือไม่ถูกนำมาใช้อย่างสมบูรณ์ในทุกเบราว์เซอร์ในปัจจุบัน ควรทดสอบอย่างละเอียดเสมอ
ความเข้ากันได้ของเบราว์เซอร์และ Polyfills
ณ ปลายปี 2024 การรองรับ @when
rule ของเบราว์เซอร์ยังคงอยู่ในระหว่างการพัฒนา แม้ว่าเบราว์เซอร์ที่ทันสมัยจำนวนมากจะรองรับฟังก์ชันหลักแล้ว แต่เบราว์เซอร์รุ่นเก่าบางตัวอาจยังไม่รองรับ ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องตรวจสอบตารางความเข้ากันได้และใช้สไตล์สำรอง (fallbacks) หรือ polyfills ที่เหมาะสมเมื่อจำเป็น
ควรปรึกษาแหล่งข้อมูลเช่น Can I use... อยู่เสมอเพื่อตรวจสอบสถานะการรองรับปัจจุบันของ @when
และฟีเจอร์ที่เกี่ยวข้อง
แนวปฏิบัติที่ดีที่สุดสำหรับการใช้ @when
- ทำให้เงื่อนไขเรียบง่าย: หลีกเลี่ยงเงื่อนไขที่ซับซ้อนเกินไปในบล็อก
@when
แบ่งตรรกะที่ซับซ้อนออกเป็นส่วนเล็กๆ ที่จัดการได้ง่ายกว่า - จัดเตรียมสไตล์สำรอง (Fallbacks): จัดเตรียมสไตล์สำรองสำหรับเบราว์เซอร์ที่ไม่รองรับฟีเจอร์ที่คุณใช้ในกฎ
@when
เสมอ เพื่อให้แน่ใจว่าผู้ใช้จะได้รับประสบการณ์ที่สอดคล้องกันในเบราว์เซอร์ต่างๆ - ทดสอบอย่างละเอียด: ทดสอบ CSS ของคุณในเบราว์เซอร์และอุปกรณ์ที่หลากหลายเพื่อให้แน่ใจว่ากฎ
@when
ของคุณทำงานตามที่คาดไว้ - ใช้ความคิดเห็นที่มีความหมาย: เพิ่มความคิดเห็นใน CSS ของคุณเพื่ออธิบายวัตถุประสงค์ของแต่ละกฎ
@when
และเงื่อนไขที่มันอ้างอิง ซึ่งจะทำให้โค้ดของคุณเข้าใจและบำรุงรักษาได้ง่ายขึ้น - พิจารณาถึงประสิทธิภาพ: หลีกเลี่ยงการใช้กฎ
@when
มากเกินไป เนื่องจากอาจส่งผลกระทบต่อประสิทธิภาพได้ ปรับปรุง CSS ของคุณเพื่อลดจำนวนกฎที่ต้องประเมินผล
สรุป
@when
rule เป็นส่วนเสริมที่ทรงพลังในกล่องเครื่องมือ CSS ซึ่งมอบวิธีการที่ยืดหยุ่นและแสดงออกได้มากขึ้นสำหรับนักพัฒนาในการใช้สไตล์ตามเงื่อนไข ด้วยการผสมผสานกับ media queries, feature queries และ CSS Custom Properties คุณสามารถสร้าง stylesheet ที่แข็งแกร่ง ปรับเปลี่ยนได้ และบำรุงรักษาได้ง่ายขึ้น แม้ว่าการรองรับของเบราว์เซอร์จะยังคงพัฒนาอยู่ แต่ @when
ก็เป็นฟีเจอร์ที่ควรค่าแก่การสำรวจและนำไปใช้ในกระบวนการพัฒนาเว็บที่ทันสมัยของคุณ
ในขณะที่เว็บยังคงพัฒนาต่อไป การเรียนรู้ฟีเจอร์ต่างๆ เช่น @when
จะเป็นสิ่งจำเป็นสำหรับการสร้างประสบการณ์ที่น่าดึงดูด เข้าถึงได้ และมีประสิทธิภาพสำหรับผู้ใช้ทั่วโลก จงเปิดรับพลังของการจัดสไตล์แบบมีเงื่อนไขและปลดล็อกความเป็นไปได้ใหม่ๆ ในการพัฒนา CSS ของคุณ