Folhas de estilo construíveis

Estilos reutilizáveis integrados.

As folhas de estilo criáveis são uma maneira de criar e distribuir estilos reutilizáveis ao usar o Shadow DOM.

Browser Support

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

Source

Sempre foi possível criar folhas de estilo usando JavaScript. No entanto, o processo historicamente era criar um elemento <style> usando document.createElement('style') e acessar a propriedade da folha para receber uma referência à instância CSSStyleSheet subjacente. Esse método pode produzir código CSS duplicado e o inchaço associado, e o ato de anexar leva a um flash de conteúdo sem estilo, independentemente de haver inchaço ou não. A interface CSSStyleSheet é a raiz de uma coleção de interfaces de representação CSS conhecidas como CSSOM, oferecendo uma maneira programática de manipular folhas de estilo, além de eliminar os problemas associados ao método antigo.

Diagrama mostrando o fluxo do CSS criado para a instanciação e o aplicativo.

As folhas de estilo criáveis permitem definir e preparar estilos CSS compartilhados e, em seguida, aplicar esses estilos a várias raízes de sombra ou ao documento com facilidade e sem duplicação. As atualizações de uma CSSStyleSheet compartilhada são aplicadas a todas as raízes em que ela foi adotada, e a adoção de uma folha de estilo é rápida e síncrona depois que a folha é carregada.

A associação configurada pelas folhas de estilo criáveis se presta bem a várias aplicações diferentes. Ela pode ser usada para fornecer um tema centralizado usado por muitos componentes: o tema pode ser uma instância CSSStyleSheet transmitida aos componentes, com atualizações do tema propagadas automaticamente para os componentes. Ela pode ser usada para distribuir valores de propriedade personalizada de CSS para subárvores DOM específicas sem depender da cascata. Ela pode até ser usada como uma interface direta para o analisador CSS do navegador, facilitando o pré-carregamento de folhas de estilo sem injetá-las no DOM.

Como criar uma folha de estilo

Em vez de introduzir uma nova API para realizar essa tarefa, a especificação de folhas de estilo criáveis permite criar folhas de estilo de forma imperativa invocando o construtor CSSStyleSheet(). O objeto CSSStyleSheet resultante tem dois novos métodos que tornam mais seguro adicionar e atualizar regras de folha de estilo sem acionar o Flash de conteúdo sem estilo (FOUC, na sigla em inglês). Os métodos replace() e replaceSync() substituem a folha de estilo por uma string de CSS, e replace() retorna uma promessa. Em ambos os casos, as referências de folhas de estilo externas não são aceitas. Todas as regras @import são ignoradas e produzem um aviso.

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

Como usar folhas de estilo criadas

O segundo novo recurso introduzido pelas folhas de estilo criáveis é uma adoptedStyleSheets disponível em raízes de sombra e documentos. Isso nos permite aplicar explicitamente os estilos definidos por uma CSSStyleSheet a uma determinada subárvore DOM. Para fazer isso, definimos a propriedade como uma matriz de uma ou mais folhas de estilo a serem aplicadas a esse elemento.

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

Como tudo funciona em conjunto

Com as folhas de estilo criáveis, os desenvolvedores da Web agora têm uma solução explícita para criar CSS StyleSheets e aplicá-las a árvores DOM. Temos uma nova API baseada em promessas para carregar StyleSheets de uma string de origem CSS que usa o analisador integrado do navegador e a semântica de carregamento. Por fim, temos um mecanismo para aplicar atualizações de folhas de estilo a todos os usos de uma StyleSheet, simplificando coisas como mudanças de tema e preferências de cores.

Ver demonstração

No futuro

A versão inicial das folhas de estilo criáveis foi enviada com a API descrita aqui, mas há um trabalho em andamento para facilitar o uso. Há uma proposta para estender o adoptedStyleSheets FrozenArray com métodos dedicados para inserir e remover folhas de estilo, o que eliminaria a necessidade de clonagem de matrizes e evitaria possíveis referências duplicadas de folhas de estilo.

Mais informações