ไทย

สำรวจ 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

ไวยากรณ์ (Syntax) ของ @when Rule

ไวยากรณ์พื้นฐานของ @when rule มีดังนี้:
@when <condition> {
  /* กฎ CSS ที่จะใช้เมื่อเงื่อนไขเป็นจริง */
}

<condition> สามารถเป็นนิพจน์บูลีนใดๆ ที่ถูกต้องซึ่งให้ค่าเป็นจริงหรือเท็จ นิพจน์นี้มักจะเกี่ยวข้องกับ:

ตัวอย่างการใช้งานจริงของ @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 rule เป็นส่วนเสริมที่ทรงพลังในกล่องเครื่องมือ CSS ซึ่งมอบวิธีการที่ยืดหยุ่นและแสดงออกได้มากขึ้นสำหรับนักพัฒนาในการใช้สไตล์ตามเงื่อนไข ด้วยการผสมผสานกับ media queries, feature queries และ CSS Custom Properties คุณสามารถสร้าง stylesheet ที่แข็งแกร่ง ปรับเปลี่ยนได้ และบำรุงรักษาได้ง่ายขึ้น แม้ว่าการรองรับของเบราว์เซอร์จะยังคงพัฒนาอยู่ แต่ @when ก็เป็นฟีเจอร์ที่ควรค่าแก่การสำรวจและนำไปใช้ในกระบวนการพัฒนาเว็บที่ทันสมัยของคุณ

ในขณะที่เว็บยังคงพัฒนาต่อไป การเรียนรู้ฟีเจอร์ต่างๆ เช่น @when จะเป็นสิ่งจำเป็นสำหรับการสร้างประสบการณ์ที่น่าดึงดูด เข้าถึงได้ และมีประสิทธิภาพสำหรับผู้ใช้ทั่วโลก จงเปิดรับพลังของการจัดสไตล์แบบมีเงื่อนไขและปลดล็อกความเป็นไปได้ใหม่ๆ ในการพัฒนา CSS ของคุณ