当前位置: 首页 > 编程日记 > 正文

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

可构造样式表是一种使用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/

相关文章:

模板方法模式与策略模式的区别

2019独角兽企业重金招聘Python工程师标准>>> 模板方法模式&#xff1a;在一个方法中定义一个算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法中的某些步骤。 策略模式&#xff1a;定义一个…

简单明了,一文入门视觉SLAM

作者 | 黄浴转载自知乎【导读】SLAM是“Simultaneous Localization And Mapping”的缩写&#xff0c;可译为同步定位与建图。最早&#xff0c;SLAM 主要用在机器人领域&#xff0c;是为了在没有任何先验知识的情况下&#xff0c;根据传感器数据实时构建周围环境地图&#xff0c…

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

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

Windows7上配置Python Protobuf 操作步骤

1、 按照http://blog.csdn.net/fengbingchun/article/details/8183468 中步骤&#xff0c;首先安装Python 2.7.10&#xff1b; 2、 按照http://blog.csdn.net/fengbingchun/article/details/47905907 中步骤&#xff0c;配置、编译Protobuf&#xff1b; 3、 将(2)中生成的pr…

鲜为人知的静态、命令式编程语言——Nimrod

Nimrod是一个新型的静态类型、命令式编程语言&#xff0c;支持过程式、函数式、面向对象和泛型编程风格而保持简单和高效。Nimrod从Lisp继承来的一个特殊特性抽象语法树&#xff08;AST&#xff09;作为语言规范的一部分&#xff0c;可以用作创建领域特定语言的强大宏系统。它还…

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

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

无需成对示例、无监督训练,CycleGAN生成图像简直不要太简单

作者 | Jason Brownlee译者 | Freesia&#xff0c;Rachel编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】图像到图像的转换技术一般需要大量的成对数据&#xff0c;然而要收集这些数据异常耗时耗力。因此本文主要介绍了无需成对示例便能实现图…

Git使用常见问题解决方法汇总

1. 在Ubuntu下使用$ git clone时出现server certificate verification failed. CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile: none 解决方法&#xff1a;在执行$ git clone 之前&#xff0c;在终端输入&#xff1a; export GIT_SSL_NO_VERIFY1 2. 在Windows上更新了…

服务器监控常用命令

在网站性能优化中&#xff0c;我们经常要检查服务器的各种指标&#xff0c;以便快速找到害群之马。大多情况下&#xff0c;我们会使用cacti、nagois或者zabbix之类的监控软件&#xff0c;但是这类软件安装起来比较麻烦&#xff0c;在一个小型服务器&#xff0c;我们想尽快找到问…

Ubuntu下内存泄露检测工具Valgrind的使用

在VS中可以用VLD检测是否有内存泄露&#xff0c;可以参考http://blog.csdn.net/fengbingchun/article/details/44195959&#xff0c;下面介绍下Ubuntu中内存泄露检测工具Valgrind的使用。Valgrind目前最新版本是3.11.0&#xff0c; 可以从http://www.valgrind.org/ 通过下载源码…

数据为王的时代,如何用图谱挖掘商业数据背后的宝藏?

这是一个商业时代&#xff0c;一个数据为王的时代&#xff0c;也是一个 AI 迎来黄金发展期的时代。据史料记载&#xff0c;商业在商朝已初具规模。斗转星移&#xff0c;时光流转&#xff0c;到 2019 年&#xff0c;商业形式已发生翻天覆地的变化&#xff0c;但是商业的本质——…

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

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

SNMP 协议 OID的使用

为什么80%的码农都做不了架构师&#xff1f;>>> SNMP 协议 OID的使用 SNMP&#xff08;Simple Network Management Protocol简单网络管理&#xff09;协议 是现在网络管理系统&#xff08;NMS&#xff09;监控网络设备状态的协议&#xff0c;是现在网管事实上的标准…

颜色空间YUV简介

YUV概念&#xff1a;YUV是被欧洲电视系统所采用的一种颜色编码方法(属于PAL&#xff0c;Phase Alternation Line)&#xff0c;是PAL和SECAM模拟彩色电视制式采用的颜色空间。其中的Y、U、V几个字母不是英文单词的组合词&#xff0c;Y代表亮度&#xff0c;其实Y就是图像的灰度值…

基于RNN的NLP机器翻译深度学习课程 | 附实战代码

作者 | 小宋是呢来源 | CSDN博客深度学习用的有一年多了&#xff0c;最近开始NLP自然处理方面的研发。刚好趁着这个机会写一系列 NLP 机器翻译深度学习实战课程。本系列课程将从原理讲解与数据处理深入到如何动手实践与应用部署&#xff0c;将包括以下内容&#xff1a;&#xf…

trash-cli设置Linux 回收站

trash-cli 设置 Linux 回收站 trash-cli是一个使用 python 开发的软件包&#xff0c;包含 trash-put、restore-trash、trash-list、trash-empty、trash-rm等命令&#xff0c;我们可以通过这条命令&#xff0c;将文件移动到回收站&#xff0c;或者还原删除了的文件。 trash-cli的…

磁盘有时也不可靠

实验服务器的磁盘是最近买的&#xff0c;当卖家问我要普通的还是高级的&#xff0c; 我选择了普通&#xff0c;现在追悔莫及。今天的分析更加详细。首先发现每次实验&#xff0c;出错的文件都不一样&#xff0c;所以应该不是临界条件的问题。下表总结了出错的位置&#xff0c;原…

从原理到落地,七大维度详解矩阵分解推荐算法

作者 | gongyouliu编辑丨Zandy来源 | 大数据与人工智能 &#xff08; ID: ai-big-data&#xff09;导语&#xff1a;作者在《协同过滤推荐算法》这篇文章中介绍了 user-based 和 item-based 协同过滤算法&#xff0c;这类协同过滤算法是基于邻域的算法(也称为基于内存的协同过…

libyuv库的使用

libyuv是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。它是跨平台的&#xff0c;可在Windows、Linux、Mac、Android等操作系统&#xff0c;x86、x64、arm架构上进行编译运行&#xff0c;支持SSE、AVX、NEON等SIMD指令加速。下面说一下libyuv在Windows7VS2013 x6…

封装 vue 组件的过程记录

在我们使用vue的开发过程中总会遇到这样的场景&#xff0c;封装自己的业务组件。 封装页面组件前要考虑几个问题&#xff1a;1、该业务组件的使用场景 2、在什么条件下展示一些什么数据&#xff0c;数据类型是什么样的&#xff0c;及长度颜色等 3、如果是通用的内容&#xff0c…

Service的基本组成

Service与Activity的最大区别就是一有界面&#xff0c;一个没有界面。 如果某些程序操作很消耗时间&#xff0c;那么可以将这些程序定义在Service之中&#xff0c;这样就可以完成程序的后台运行&#xff0c; 其实Service就是一个没有界面的Activity&#xff0c;执行跨进程访问也…

BP神经网络公式推导及实现(MNIST)

BP神经网络的基础介绍见&#xff1a;http://blog.csdn.net/fengbingchun/article/details/50274471&#xff0c;这里主要以公式推导为主。BP神经网络又称为误差反向传播网络&#xff0c;其结构如下图。这种网络实质是一种前向无反馈网络&#xff0c;具有结构清晰、易实现、计算…

AI应用落地哪家强?CSDN AI Top 30+案例评选等你来秀!

人工智能历经百年发展&#xff0c;如今迎来发展的黄金时期。目前&#xff0c;AI 技术已涵盖自然语言处理、模式识别、图像识别、数据挖掘、机器学习等领域的研究&#xff0c;在汽车、金融、教育、医疗、安防、零售、家居、文娱、工业等行业获得了令人印象深刻的成果。 在各行业…

安利Mastodon:属于未来的社交网络

我为Mastodon开发了一款安卓客户端&#xff0c;v1.0版本已经发布&#xff0c;欢迎下载使用 源码在这里&#xff1a;https://github.com/shuiRong/Gakki ??? 正文 Mastodon(长毛象)是什么&#xff1f; 是一个免费开源、去中心化、分布式的微博客社交网络&#xff0c;是微博、…

通过案例练习掌握SSH 的整合

1. SSH整合_方案01 ** 整合方案01 Struts2框架 Spring框架 在Spring框架中整合了Hibernate&#xff08;JDBC亦可&#xff09; 一些业务组件&#xff08;Service组件&#xff09;也可以放入Spring框架中迚行管理&#xff08;昨天的例子&#xff09; 1. 请求&#xff0…

tiny-cnn开源库的使用(MNIST)

tiny-cnn是一个基于CNN的开源库&#xff0c;它的License是BSD 3-Clause。作者也一直在维护更新&#xff0c;对进一步掌握CNN很有帮助&#xff0c;因此下面介绍下tiny-cnn在windows7 64bit vs2013的编译及使用。 1. 从https://github.com/nyanp/tiny-cnn下载源码&#xff1…

玩嗨的2亿快手“老铁”和幕后的极致视觉算法

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;创立八年&#xff0c;短视频平台快手目前已经有超过两亿人在每天登陆使用&#xff0c;每天还有超过 1500 万条短视频被制作和上传&#xff0c;每天的累计观看数更是达到 150 亿。拥有如此庞大的用户数&…

lsmod命令详解

基础命令学习目录首页 原文链接&#xff1a;http://blog.sina.com.cn/s/blog_e6b2465d0101fuev.html lsmod——显示已载入系统的模块 lsmod 其实就是list modules的缩写&#xff0c;即 列出所有模块. 功能说明&#xff1a;显示已载入系统的模块。 语法&#xff1a;lsmod 说明&a…

javascript模块化、模块加载器初探

最常见网站的javascript架构可能是这样的&#xff1a; 一个底层框架文件&#xff0c;如jQuery一个网站业务框架文件&#xff0c;包含整站公用业务模块类(如弹框、ajax封装等)多个业务文件&#xff0c;包含每个具体页面有关系的业务代码为了减少一个HTTP请求&#xff0c;我们可能…

tiny-cnn执行过程分析(MNIST)

在http://blog.csdn.net/fengbingchun/article/details/50573841中以MNIST为例对tiny-cnn的使用进行了介绍&#xff0c;下面对其执行过程进行分析&#xff1a;支持两种损失函数&#xff1a;(1)、mean squared error(均方差)&#xff1b;(2)、cross entropy(交叉熵)。在MNIST中使…