สไตล์ชีตที่สร้างได้

รูปแบบที่นํามาใช้ซ้ำได้แบบราบรื่น

สไตล์ชีตที่สร้างได้เป็นวิธีสร้างและเผยแพร่สไตล์ที่ใช้ซ้ำได้เมื่อใช้ Shadow DOM

การรองรับเบราว์เซอร์

  • Chrome: 73
  • Edge: 79
  • Firefox: 101.
  • Safari: 16.4

แหล่งที่มา

คุณสร้างสไตล์ชีตโดยใช้ JavaScript มาได้ตลอด อย่างไรก็ตาม ที่ผ่านมากระบวนการคือการสร้างองค์ประกอบ <style> โดยใช้ document.createElement('style') จากนั้นเข้าถึงพร็อพเพอร์ตี้ชีตเพื่อรับการอ้างอิงไปยังอินสแตนซ์ CSSStyleSheet ที่อยู่เบื้องหลัง วิธีนี้อาจสร้างโค้ด CSS ที่ซ้ำกันและการขยายขนาดที่ตามมา และการดำเนินการแนบจะทําให้เนื้อหาที่ไม่มีการจัดรูปแบบปรากฏขึ้นอย่างรวดเร็ว ไม่ว่าจะมีการขยายขนาดหรือไม่ก็ตาม อินเทอร์เฟซ CSSStyleSheet คือรูทของคอลเล็กชันอินเทอร์เฟซการนําเสนอ CSS ที่เรียกว่า CSSOM ซึ่งเสนอวิธีแบบเป็นโปรแกรมในการดําเนินการกับสไตล์ชีต รวมถึงขจัดปัญหาที่เกี่ยวข้องกับวิธีการแบบเก่า

แผนภาพแสดงการเตรียมและการใช้ CSS

สไตล์ชีตที่สร้างได้ช่วยให้คุณกำหนดและเตรียมรูปแบบ CSS ที่แชร์ จากนั้นใช้รูปแบบเหล่านั้นกับ Shadow Root หรือเอกสารหลายรายการได้ง่ายๆ โดยไม่ต้องทำซ้ำ การอัปเดต CSSStyleSheet ที่แชร์จะมีผลกับรูททั้งหมดที่ใช้ การนำstylesheetไปใช้จะรวดเร็วและซิงค์กันเมื่อโหลดชีตแล้ว

การเชื่อมโยงที่ตั้งค่าโดยสไตล์ชีตแบบสร้างได้เหมาะสําหรับการใช้งานที่หลากหลาย ธีมนี้สามารถใช้เพื่อจัดหาธีมแบบรวมศูนย์ที่ใช้โดยคอมโพเนนต์หลายรายการ โดยธีมอาจเป็นอินสแตนซ์ CSSStyleSheet ที่ส่งไปยังคอมโพเนนต์ และการอัปเดตธีมจะเผยแพร่ไปยังคอมโพเนนต์โดยอัตโนมัติ ซึ่งสามารถใช้เพื่อกระจายค่าพร็อพเพอร์ตี้ที่กำหนดเองของ CSS ไปยัง DOM ย่อยที่เฉพาะเจาะจงโดยไม่ต้องอาศัยลําดับชั้น นอกจากนี้ยังใช้เป็นอินเทอร์เฟซโดยตรงกับโปรแกรมแยกวิเคราะห์ CSS ของเบราว์เซอร์ได้ด้วย ซึ่งทำให้โหลดสไตล์ชีตล่วงหน้าได้ง่ายๆ โดยไม่ต้องแทรกลงใน DOM

การสร้างสไตล์ชีต

แทนที่จะเปิดตัว API ใหม่เพื่อดำเนินการนี้ ข้อกำหนด Constructable StyleSheets ช่วยให้สร้างสไตล์ชีตแบบบังคับได้ด้วยการเรียกใช้คอนสตรัคเตอร์ CSSStyleSheet() ออบเจ็กต์ CSSStyleSheet ที่ได้จะมีเมธอดใหม่ 2 เมธอดที่ช่วยให้คุณเพิ่มและอัปเดตกฎสไตล์ชีตได้อย่างปลอดภัยยิ่งขึ้นโดยไม่ทริกเกอร์เนื้อหาที่แสดงขึ้นมาโดยไม่มีการจัดรูปแบบ (FOUC) ทั้ง 2 วิธีการจะแทนที่สไตล์ชีตด้วยสตริง CSS และ replace() จะแสดงผล Promisereplace()replaceSync() ในทั้ง 2 กรณี ระบบจะไม่รองรับการอ้างอิงสไตล์ชีตภายนอก ระบบจะไม่สนใจกฎ @import ใดๆ และจะแสดงคำเตือน

const sheet = new CSSStyleSheet();

// replace all styles synchronously:
sheet.replaceSync('a { color: red; }');

// replace all styles:
sheet.replace('a { color: blue; }')
  .then(() => {
    console.log('Styles replaced');
  })
  .catch(err => {
    console.error('Failed to replace styles:', err);
  });

// Any @import rules are ignored.
// Both of these still apply the a{} style:
sheet.replaceSync('@import url("styles.css"); a { color: red; }');
sheet.replace('@import url("styles.css"); a { color: red; }');
// Console warning: "@import rules are not allowed here..."

การใช้สไตล์ชีตที่สร้างขึ้น

ฟีเจอร์ใหม่ลำดับที่ 2 ที่ StyleSheet แบบสร้างได้นำเสนอคือพร็อพเพอร์ตี้ adoptedStyleSheets ที่มีอยู่ในรูทเงาและเอกสาร ซึ่งช่วยให้เราใช้สไตล์ที่ CSSStyleSheet กำหนดไว้กับ DOM ย่อยที่ระบุได้อย่างชัดเจน โดยตั้งค่าพร็อพเพอร์ตี้เป็นอาร์เรย์ของสไตลชีตอย่างน้อย 1 รายการที่จะใช้กับองค์ประกอบนั้น

// Create our shared stylesheet:
const sheet = new CSSStyleSheet();
sheet.replaceSync('a { color: red; }');

// Apply the stylesheet to a document:
document.adoptedStyleSheets.push(sheet);

// Apply the stylesheet to a Shadow Root:
const node = document.createElement('div');
const shadow = node.attachShadow({ mode: 'open' });
shadow.adoptedStyleSheets.push(sheet);

สรุปข้อมูลทั้งหมด

เมื่อมีสไตล์ชีตที่สร้างได้ นักพัฒนาเว็บจะมีโซลูชันที่ชัดเจนในการสร้างสไตล์ชีต CSS และนำไปใช้กับต้นไม้ DOM เรามี API ใหม่ที่อิงตาม Promise สำหรับการโหลดสไตล์ชีตจากสตริงแหล่งที่มาของ CSS ที่ใช้โปรแกรมแยกวิเคราะห์และความหมายของการโหลดในตัวของเบราว์เซอร์ สุดท้ายนี้ เรามีกลไกสำหรับการใช้การอัปเดตสไตล์ชีตกับการใช้งานสไตล์ชีตทั้งหมด ซึ่งทำให้การเปลี่ยนแปลงธีมและค่ากำหนดสีเป็นเรื่องง่าย

ดูการสาธิต

ในอนาคต

สไตล์ชีตแบบสร้างได้เวอร์ชันแรกมาพร้อมกับ API ที่อธิบายไว้ที่นี่ แต่เรากำลังดำเนินการเพื่อให้ใช้งานได้ง่ายขึ้น มีข้อเสนอที่จะขยายadoptedStyleSheets FrozenArray ด้วยเมธอดเฉพาะสำหรับการแทรกและนำสไตล์ชีตออก ซึ่งจะทำให้ไม่ต้องโคลนอาร์เรย์และหลีกเลี่ยงการอ้างอิงสไตล์ชีตที่ซ้ำกัน

ข้อมูลเพิ่มเติม