可构造样式表 - 通过javascript来生成css的新方式

news/2024/9/9 14:14:45

可构造样式表是一种使用Shadow DOM进行创建和分发可重用样式的新方法。

使用Javascript来创建样式表是可能的。然而,这个过程在历史上一直是使用document.createElement('style')来创建<style>元素,然后通过访问其sheet属性来获得一个基础的CSSStyleSheet实例的引用。这种方法可以生成重复的CSS,其会使得代码极速膨胀。无论是否存在臃肿,这种附加的动作会导致未样式化内容的闪烁。CSSStyleSheet接口是CSS集合的根,被称为CSSOM,提供一种程序化的方法去控制样式,还有就是消除相关联的旧代码的问题。

clipboard.png

可构造的样式表可以定义和准备共享的CSS样式,然后轻松的吧这些样式应用到多个Shadow Roots中或者是文档中,且无需重复。修改CSSStyleSheet以后,其相关联的样式也都会被改变。并且一旦加载了样式表,其新样式会很快且同步的加载到页面中。

由Constructable Stylesheets创建的关联很适合许多不同的应用程序。它可以被用于在多个不同的组件间提供一个集中的主题:主题可以传递到组件的是CSSStyleSheet的实例,当主题改变以后,会自动传递给组件。它可以不依赖样式表,吧自定义CSS属性分发给特定的DOM子树中。它甚至可以直接用于浏览器解析器直接的接口,无需将他们注入到DOM就可以很轻易的加载样式表。

构建一个样式表

与引入一个新API不同,可构造样式表规范使得其可以通过调用CSSStyleSheet()构造函数来强制创建样式表。CSSStyleSheet对象的结果有两个方法,这俩方法会使样式表更安全的被添加和修改,其操作不会触发无格式内容的闪光(FOUC)。replace()会返回一个Promise,一旦有外部引用(@import)被加载就会解析。而replaceSync()不允许外部引用。

const sheet = new CSSStyleSheet();// replace all styles synchronously:
sheet.replaceSync('a { color: red; }');// this throws an exception:try {sheet.replaceSync('@import url("styles.css")');} catch (err) {console.error(err); // imports are not allowed}// replace all styles, allowing external resources:
sheet.replace('@import url("styles.css")').then(sheet => {console.log('Styles loaded successfully');}).catch(err => {console.error('Failed to load:', err);});

使用可构造样式表

由可构造样式表引入的第二个新功能是Shadow Roots和Documents中的adoptedStyleSheets属性。这允许我们显式的将由CSSStyleSheet定义的属性应用到给定的DOM子树中。为此,我们将属性设置为一个具有一个或者多个样式表的数组,以用于该元素。

// Create our shared stylesheet:const sheet = new CSSStyleSheet();
sheet.replaceSync('a { color: red; }');// Apply the stylesheet to a document:
document.adoptedStyleSheets = [sheet];// Apply the stylesheet to a Shadow Root:const node = document.createElement('div');const shadow = node.attachShadow({ mode: 'open' });
shadow.adoptedStyleSheets = [sheet];

注意我们是覆盖了adoptedStyleSheets的值,而不是改变了数组的值。这是必要的,因为这个数组是被冻结的。像push()那样改变值会抛出一个异常,所以我们必须赋值一个新数组。为了保留通过adoptedStyleSheets添加的已经存在样式表。我们可以使用合并数组的方式来创建一个新数组,这个数组包含已经存在的旧样式,和新添加的新样式。

const sheet = new CSSStyleSheet();
sheet.replaceSync('a { color: red; }');// Combine existing sheets with our new one:
document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];

总结

由于可构造样式表,网站开发人员现在有一个创建CSS样式表并且把他们应用到DOM树中的一个明确的解决方案。我们有了一个新的基于Promise的API,用于从使用浏览器内置解析器和加载语义的CSS源字符串中加载样式表。最终,我们有一种机制,可以将样式表更新应用于StyleSheet的所有用法,从而简化主题更改和颜色首选项等操作。

展望未来

可构建样式表的初始版本附带了此处描述的API,但正在开展工作以使事情更容易使用。 有人建议使用专用方法扩展adoptStyleSheets FrozenArray以插入和删除样式表,这样就不需要进行数组克隆并避免可能的重复样式表引用。

翻译自:

https://developers.google.com...

转载自:http://www.lht.ren/article/17/


http://lihuaxi.xjx100.cn/news/236208.html

相关文章

上交2017计算机专业就业,上海交通大学计算机科学与工程系(CSE)

经过多轮的意向调整&#xff0c;最终确定的生产实习去向结果公示(请见附件)。原则上&#xff0c;经公示后结果不做调整。生产实习执行时间从7月24日到8月27日&#xff0c;请目前尚未就课题开展明细跟导师联系的同学在7月24日之前务必联系导师。一、实习报告要求1、从教务网站&a…

大主子表关联的性能优化方法

【摘要】主子表是数据库最常见的关联关系之一&#xff0c;最典型的包括合同和合同条款、订单和订单明细、保险保单和保单明细、银行账户和账户流水、电商用户和订单、电信账户和计费清单或流量详单。当主子表的数据量较大时&#xff0c;关联计算的性能将急剧降低&#xff0c;在…

微信小程序(canvas)画图保存到本地相册(wepy)

html标签部分 因为这个需要用户授权 所以需要使用button&#xff0c;画布使用的是canvas&#xff0c;这个可以参考小程序官方文档&#xff0c;代码如下 <button classbtn type"default" open-type"getUserInfo" tapexportImg>生成图片保存到本地&l…

学金融买计算机配置,我是学金融投资的计算机等级考试哪个方向对我工作有用...

你好&#xff1a;你的这种情况应该是系统调整或服务器维护造成的&#xff0c;在这两天还有很多网友无法进入主页&#xff0c;请耐心等待&#xff0c;新浪工作日人员会尽快将系统恢复&#xff01; 祝顺利&#xff01;多出好文章&#xff01; 博客临时故障&#xff0c;用新浪各种…

HTML5的十大新特性

为了更好地处理今天的互联网应用&#xff0c;HTML5添加了很多新元素及功能&#xff0c;比如: 图形的绘制&#xff0c;多媒体内容&#xff0c;更好的页面结构&#xff0c;更好的形式 处理&#xff0c;和几个api拖放元素&#xff0c;定位&#xff0c;包括网页 应用程序缓存&#…

机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)

1.cv2.erode(src, kernel, iteration) 参数说明&#xff1a;src表示的是输入图片&#xff0c;kernel表示的是方框的大小&#xff0c;iteration表示迭代的次数 腐蚀操作原理&#xff1a;存在一个kernel&#xff0c;比如(3, 3)&#xff0c;在图像中不断的平移&#xff0c;在这个9…

旋转卡壳——模板(对踵点)

这东西学了我大概两天吧。。其实不应该学这么久的&#xff0c;但是这两天有点小困&#xff0c;然后学习时间被削了很多\(QwQ\) 说几个坑点。 - 对于题目不保证有凸包的情况&#xff0c;要选用左下角的点&#xff0c;而非单纯的最下边的点构造凸包。 - 对于凸包中只有\(1/2\)个点…

计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...

2019 年计算机一级考试 PS 基础学习点子&#xff1a; PS 菜单中英文对照表PS菜单中英文对照表一、FileNew2.Open3.Open As4.Open RecentClose6.Save7.Save As8.Save for Web9.Revert10.Place11.ImportPDF ImageAnnotationsExportManage WorkflowCheck InUndo Check OutUpload T…