Stylesheet yang Dapat Dibangun

Gaya yang dapat digunakan kembali secara lancar.

Stylesheet yang Dapat Dikonstruksi adalah cara untuk membuat dan mendistribusikan gaya yang dapat digunakan kembali saat menggunakan Shadow DOM.

Browser Support

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

Source

Stylesheet selalu dapat dibuat menggunakan JavaScript. Namun, prosesnya secara historis adalah membuat elemen <style> menggunakan document.createElement('style'), lalu mengakses properti sheet-nya untuk mendapatkan referensi ke instance CSSStyleSheet yang mendasarinya. Metode ini dapat menghasilkan kode CSS duplikat dan pembengkakan yang menyertainya, dan tindakan melampirkan menyebabkan konten yang tidak berpenampilan muncul sekejap, baik ada pembengkakan maupun tidak. Antarmuka CSSStyleSheet adalah root dari kumpulan antarmuka representasi CSS yang disebut sebagai CSSOM, yang menawarkan cara terprogram untuk memanipulasi stylesheet serta menghilangkan masalah yang terkait dengan metode lama.

Diagram yang menunjukkan alur dari CSS yang Ditulis ke Instansiasi ke Aplikasi.

Stylesheet yang Dapat Dikonstruksi memungkinkan Anda menentukan dan menyiapkan gaya CSS bersama, lalu menerapkan gaya tersebut ke beberapa Shadow Root atau Dokumen dengan mudah dan tanpa duplikasi. Pembaruan pada CSSStyleSheet bersama diterapkan ke semua root yang telah mengadopsinya, dan mengadopsi stylesheet cepat dan sinkron setelah sheet dimuat.

Pengaitan yang disiapkan oleh Stylesheet yang Dapat Dibangun cocok untuk sejumlah aplikasi yang berbeda. Hal ini dapat digunakan untuk menyediakan tema terpusat yang digunakan oleh banyak komponen: tema dapat berupa instance CSSStyleSheet yang diteruskan ke komponen, dengan pembaruan pada tema yang disebarkan ke komponen secara otomatis. Hal ini dapat digunakan untuk mendistribusikan nilai Properti Kustom CSS ke subpohon DOM tertentu tanpa mengandalkan cascade. API ini bahkan dapat digunakan sebagai antarmuka langsung ke parser CSS browser, sehingga memudahkan untuk memuat stylesheet terlebih dahulu tanpa menyisipkannya ke dalam DOM.

Membuat stylesheet

Daripada memperkenalkan API baru untuk melakukannya, spesifikasi Constructable StyleSheets memungkinkan pembuatan stylesheet secara imperatif dengan memanggil konstruktor CSSStyleSheet(). Objek CSSStyleSheet yang dihasilkan memiliki dua metode baru yang membuatnya lebih aman untuk menambahkan dan memperbarui aturan stylesheet tanpa memicu Flash of Unstyled Content (FOUC). Metode replace() dan replaceSync() mengganti stylesheet dengan string CSS, dan replace() menampilkan Promise. Dalam kedua kasus tersebut, referensi stylesheet eksternal tidak didukung—aturan @import apa pun akan diabaikan dan akan menghasilkan peringatan.

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..."

Menggunakan stylesheet yang dikonstruksi

Fitur baru kedua yang diperkenalkan oleh Constructable StyleSheets adalah properti adoptedStyleSheets yang tersedia di Shadow Roots dan Documents. Hal ini memungkinkan kita menerapkan gaya yang ditentukan oleh CSSStyleSheet secara eksplisit ke subpohon DOM tertentu. Untuk melakukannya, kita menetapkan properti ke array yang berisi satu atau beberapa stylesheet untuk diterapkan ke elemen tersebut.

// 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);

Menggabungkan semuanya

Dengan Constructable StyleSheets, developer web kini memiliki solusi eksplisit untuk membuat CSS StyleSheets dan menerapkannya ke hierarki DOM. Kami memiliki API berbasis Promise baru untuk memuat StyleSheets dari string sumber CSS yang menggunakan semantik pemuatan dan parser bawaan browser. Terakhir, kita memiliki mekanisme untuk menerapkan update stylesheet ke semua penggunaan StyleSheet, sehingga menyederhanakan hal-hal seperti perubahan tema dan preferensi warna.

Lihat Demo

Rencana ke depan

Versi awal Constructable Stylesheets dikirimkan dengan API yang dijelaskan di sini, tetapi ada upaya yang sedang dilakukan untuk mempermudah penggunaannya. Ada proposal untuk memperluas adoptedStyleSheets FrozenArray dengan metode khusus untuk menyisipkan dan menghapus stylesheet, yang akan menghilangkan kebutuhan untuk meng-clone array dan menghindari potensi duplikat referensi stylesheet.

Informasi selengkapnya