Feuilles de style constructibles

Styles réutilisables fluides

Les feuilles de style constructibles permettent de créer et de distribuer des styles réutilisables lorsque vous utilisez la fonction Shadow DOM.

Navigateurs pris en charge

  • 73
  • 79
  • 101
  • 16.4

Source

Il a toujours été possible de créer des feuilles de style en utilisant JavaScript. Toutefois, le processus a toujours consisté à créer un élément <style> à l'aide de document.createElement('style'), puis à accéder à sa propriété "sheet" pour obtenir une référence à l'instance CSSStyleSheet sous-jacente. Cette méthode peut générer un code CSS en double ainsi que son élément volumineux. L'association génère un flash de contenu sans style, qu'il soit gonflé ou non. L'interface CSSStyleSheet est à la racine d'un ensemble d'interfaces de représentation CSS appelées CSSOM. Elle offre un moyen programmatique de manipuler des feuilles de style et d'éliminer les problèmes associés à l'ancienne méthode.

Schéma illustrant la préparation et l&#39;application du CSS

Les feuilles de style constructibles permettent de définir et de préparer des styles CSS partagés, puis de les appliquer à plusieurs racines fantômes ou au document, facilement et sans dupliquer. Les mises à jour d'une feuille de style CSSStyleSheet partagée sont appliquées à toutes les racines dans lesquelles elle a été adoptée. L'adoption d'une feuille de style est rapide et synchrone une fois la feuille chargée.

L'association créée par les feuilles de style constructibles est parfaitement adaptée à de nombreuses applications. Il permet de fournir un thème centralisé utilisé par de nombreux composants: le thème peut être une instance CSSStyleSheet transmise aux composants, les mises à jour du thème étant automatiquement propagées aux composants. Il peut être utilisé pour distribuer des valeurs de propriété personnalisée CSS à des sous-arborescences DOM spécifiques sans dépendre de la cascade. Il peut même servir d'interface directe à l'analyseur CSS du navigateur, ce qui facilite le préchargement des feuilles de style sans les injecter dans le DOM.

Création d'une feuille de style

Plutôt que d'introduire une nouvelle API pour effectuer cette opération, la spécification Constructable StyleSheets permet de créer des feuilles de style de manière impérative en appelant le constructeur CSSStyleSheet(). L'objet CSSStyleSheet obtenu comporte deux nouvelles méthodes qui permettent d'ajouter et de mettre à jour des règles de feuille de style en toute sécurité sans déclencher Flash of Unstyled Content (FOUC). Les méthodes replace() et replaceSync() remplacent la feuille de style par une chaîne de style CSS, et replace() renvoie une promesse. Dans les deux cas, les références aux feuilles de style externes ne sont pas acceptées. Toutes les règles @import sont ignorées et génèrent un avertissement.

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

Utiliser des feuilles de style construites

La deuxième nouvelle fonctionnalité introduite par Constructable StyleSheets est une propriété adoptedStyleSheets disponible sur Shadow roots et Documents. Cela nous permet d'appliquer explicitement les styles définis par un élément CSSStyleSheet à une sous-arborescence DOM donnée. Pour ce faire, nous définissons la propriété sur un tableau d'une ou plusieurs feuilles de style à appliquer à cet élément.

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

Synthèse

Avec Constructable StyleSheets, les développeurs Web disposent désormais d'une solution explicite pour créer des feuilles de style CSS et les appliquer aux arborescences DOM. Nous disposons d'une nouvelle API basée sur Promise permettant de charger des feuilles de style StyleSheets à partir d'une chaîne de source CSS qui utilise l'analyseur intégré et la sémantique de chargement intégrés au navigateur. Enfin, nous disposons d'un mécanisme permettant d'appliquer des mises à jour de feuille de style à toutes les utilisations d'une feuille de style, ce qui simplifie des éléments tels que les changements de thème et les préférences de couleurs.

Voir la démonstration

Perspectives d'avenir

La version initiale des feuilles de style constructibles est fournie avec l'API décrite ici, mais des travaux sont en cours pour simplifier leur utilisation. Il existe une proposition d'étendre la fonction FrozenArray adoptedStyleSheets avec des méthodes dédiées pour insérer et supprimer des feuilles de style, ce qui éviterait de devoir cloner un tableau et éviterait d'éventuelles références de feuille de style en double.

En savoir plus