Estilos reutilizables sin problemas
Las hojas de estilo construibles son una manera de crear y distribuir estilos reutilizables cuando se usa Shadow DOM
Siempre fue posible crear hojas de estilo con JavaScript. Sin embargo, el
siempre fue crear un elemento <style>
usando
document.createElement('style')
y, luego, accede a la propiedad de su hoja para obtener
una referencia al modelo
CSSStyleSheet
instancia. Este método puede generar un código CSS duplicado y su sobredimensionamiento,
y el acto de adjuntarlo lleva
a un destello de contenido sin estilo,
pueden o no tener tamaño completo. La interfaz CSSStyleSheet
es la raíz de una colección de CSS
de representación visual,
que se conocen como
CSSOM,
ofrecer una forma programática de manipular las hojas de estilo y de eliminar las
problemas asociados con el método anterior.
Las hojas de estilo constructibles permiten definir y preparar archivos CSS compartidos estilos y, luego, aplicarlos a varias shadow Roots o al documento de manera sencilla y sin duplicaciones. Las actualizaciones de una CSSStyleSheet compartida se aplican a todas las raíces en las que se adoptó y adoptar un hoja de estilo es rápido y síncrono una vez que se carga la hoja.
La asociación establecida por los CSS componibles se adapta bien a una gran variedad de aplicaciones. Se puede usar para proporcionar un tema centralizado
usado por muchos componentes: el tema puede ser una instancia de CSSStyleSheet
que se pasa a
componentes, y las actualizaciones del tema se propagan a los componentes
automáticamente. Se puede usar para distribuir valores de propiedad personalizada de CSS a subárboles de DOM específicos sin depender de la cascada. Incluso puede
usarse como interfaz directa con el analizador de CSS del navegador, lo que facilita
precarga las hojas de estilo sin insertarlas en el DOM.
Construcción de una hoja de estilo
En lugar de introducir una nueva API para lograrlo, la guía Constructable
StyleSheets
especificación permite crear hojas de estilo de forma imperativa invocando
el constructor CSSStyleSheet()
. El objeto CSSStyleSheet resultante tiene dos
nuevos métodos para que sea más seguro agregar y actualizar reglas de hojas de estilo sin
activando destello de imágenes sin estilo
Contenido (FOUC).
Los métodos replace()
y replaceSync()
reemplazan la hoja de estilo por una cadena de CSS, y replace()
muestra una promesa. En ambos casos, las referencias a hojas de estilo externas no se
compatible: se ignorará cualquier regla @import
y se mostrará una advertencia.
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..."
Cómo usar hojas de estilo construidas
La segunda función nueva que presenta Constructable StyleSheets es una
adoptedStyleSheets
propiedad disponible en Shadow
Raíces
y Documentos. Esta
nos permite aplicar explícitamente los estilos definidos por un CSSStyleSheet
a un DOM determinado.
subárbol. Para ello, configuramos la propiedad en un array de una o más hojas de estilo para
se aplican a ese 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);
Revisión general
Con Hojas de estilo Constructable, los desarrolladores web ahora tienen una solución explícita para la creación de Hojas de estilo CSS y su aplicación a los árboles del DOM. Tenemos una nueva API basada en promesas para cargar hojas de estilo desde una cadena de fuente de CSS que usa el analizador integrado del navegador y la semántica de carga. Por último, tenemos un mecanismo para aplicar actualizaciones de hojas de estilo en todos los usos de una hoja de estilo lo que simplifica los cambios de tema y las preferencias de color.
Con la mirada puesta en el futuro
La versión inicial de las hojas de estilo Constructable que se incluye con la API
pero se está trabajando para hacer que todo sea más fácil de usar. Hay
una propuesta para extender
El FrozenArray adoptedStyleSheets
con métodos dedicados para insertar y
eliminar las hojas de estilo, lo que obviaría la necesidad de clonar un array y evitaría
posibles referencias duplicadas de hojas de estilo.