自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何像導(dǎo)入 JS 模塊一樣導(dǎo)入 CSS?

安全
剛剛發(fā)布的 Chrome 93 版本中更新了一項(xiàng)令人興奮的新特性:CSS Module Script,使用它你可以像導(dǎo)入一個(gè) JavaScript 模塊一樣加載 CSS 樣式。

剛剛發(fā)布的 Chrome 93 版本中更新了一項(xiàng)令人興奮的新特性:CSS Module Script,使用它你可以像導(dǎo)入一個(gè) JavaScript 模塊一樣加載 CSS 樣式。

然后,你可以將 CSS 樣式與可構(gòu)造樣式表(Constructable Stylesheet) 相同的方式作用于 document 和 shadow dom,這比其他加載 CSS 的方式更方便、更高效。

什么是可構(gòu)造樣式表?

在了解 CSS Module Script 之前,我們先來(lái)了解下啥是可構(gòu)造樣式表(Constructable Stylesheet)。和表面意思一樣,它是為了 CssStyleSheet 可直接構(gòu)造而設(shè)計(jì)的,在 document 和 shadow dom 下都可以使用。

使用可構(gòu)造樣式表:

  • 通過(guò) new CSSStyleSheet() 構(gòu)造一個(gè)樣式表
  • 改變可構(gòu)造樣式表
  • 通過(guò) adoptedStyleSheets 使用可構(gòu)造樣式表

改變可構(gòu)造樣式表有如下API:

  • insertRule(rule,index) 往 cssRules 屬性里插入 rule
  • deleteRule(rule,index) 從 cssRules 屬性里刪除 rule
  • replace(text) 異步替換 cssRules
  • replaceSync(text) 同步的 replace
  1. // Construct the CSSStyleSheet 
  2. const stylesheet = new CSSStyleSheet(); 
  3.   
  4. // Add some CSS 
  5. stylesheet.replaceSync('body { background: #000 !important; }') 
  6. // OR stylesheet.replace, which returns a Promise instead 
  7.   
  8. // Tell the document to adopt your new stylesheet. 
  9. // Note that this also works with Shadow Roots. 
  10. document.adoptedStyleSheets = [...document.adoptedStyleSheets, stylesheet]; 

使用 CSS Module Script

引入 CSS Module Script 將作用于 document 和 shadow dom,如下:

  1. import sheet from './styles.css' assert { type: 'css' }; 
  2. document.adoptedStyleSheets = [sheet]; 
  3. shadowRoot.adoptedStyleSheets = [sheet]; 

CSS Module Script 默認(rèn)導(dǎo)出的是一個(gè) 可構(gòu)造樣式表 ,與任何其他 可構(gòu)造樣式表 一樣,它使用 adoptedstylesheet 作用于 document 和 shadow dom。

和其他使用 JavaScript 引入 CSS 的方式不同,你無(wú)需創(chuàng)建一個(gè)<script>標(biāo)簽,也不需要把 CSS 插入混淆后的 JavaScript 中。

CSS Module 也有像 JavaScript Module 一樣的優(yōu)點(diǎn):

  • 重復(fù)數(shù)據(jù)刪除:如果從應(yīng)用的多個(gè)位置導(dǎo)入相同的 CSS 文件,它仍然只會(huì)被提取、實(shí)例化和解析一次。
  • 一致的順序:如果導(dǎo)入一個(gè) JavaScript 運(yùn)行時(shí),它可以依賴于已經(jīng)解析過(guò)的樣式表。
  • 安全性:模塊使用 CORS 加載,并且使用嚴(yán)格的 MIME 類型檢查。

導(dǎo)入斷言(assert)是什么?

import 語(yǔ)句的 assert {type: 'css'} 部分是一個(gè) import 斷言,這是必需要聲明的的;如果沒(méi)有它,CSS 將被認(rèn)為是一個(gè)普通的 JavaScript 模塊,如果導(dǎo)入的文件具有非 JavaScript MIME 類型,則會(huì)導(dǎo)入失敗。

  1. import sheet from './styles.css'; // Failed to load module script: 
  2.                                   // Expected a JavaScript module 
  3.                                   // script but the server responded 
  4.                                   // with a MIME type of "text/css". 

樣式表的動(dòng)態(tài)導(dǎo)入類似于 JavaScript 模塊的動(dòng)態(tài)導(dǎo)入,你還可以用 dynamic import 導(dǎo)入 CSS 模塊:

  1. const cssModule = await import('./style.css', { 
  2.   assert: { type: 'css' } 
  3. }); 
  4. document.adoptedStyleSheets = [cssModule.default]; 

這里有個(gè)坑需要注意,被添加到 adoptedstylesheet 的并不是 cssModule本身,而是 cssModule.default。

@import 的規(guī)則尚未支持

目前,CSS@import 的規(guī)則不適用 于可構(gòu)造樣式表,包括 CSS Module Script。如果 CSS 模塊中含有@import 規(guī)則,則這些規(guī)則將被忽略。

  1. /* atImported.css */ 
  2. div { 
  3.     background-color: blue; 
  1. /* styles.css */ 
  2. @import url('./atImported.css'); /* Ignored in CSS module */ 
  3. div { 
  4.     border: 1em solid green; 
  1. <!-- index.html --> 
  2. <script type="module"> 
  3.     import styles from './styles.css' assert { type: "css" }; 
  4.     document.adoptedStyleSheets = [styles]; 
  5. </script> 
  6. <div>This div will have a green border but no background color.</div> 

目前 Firefox 和 Safari 瀏覽器尚未支持,不過(guò)未來(lái)可期~

 

責(zé)任編輯:趙寧寧 來(lái)源: code秘密花園
相關(guān)推薦

2023-11-01 08:36:07

CSSTailwind

2015-03-16 12:50:44

2013-08-22 10:17:51

Google大數(shù)據(jù)業(yè)務(wù)價(jià)值

2021-08-12 06:08:15

CSS 技巧組件狀態(tài)

2023-04-05 14:19:07

FlinkRedisNoSQL

2017-05-22 10:33:14

PythonJuliaCython

2022-10-21 13:52:56

JS 報(bào)錯(cuò)調(diào)試本地源碼

2022-12-13 07:41:43

CSSCSS Houdi

2013-12-17 09:02:03

Python調(diào)試

2022-12-21 15:56:23

代碼文檔工具

2023-05-23 13:59:41

RustPython程序

2013-12-31 09:19:23

Python調(diào)試

2013-07-26 10:15:29

云計(jì)算大數(shù)據(jù)Hadoop

2016-10-08 00:24:53

httptcp實(shí)時(shí)

2021-06-30 08:00:31

ECMAScriptimport 模塊JavaScript

2020-08-25 08:56:55

Pythonawk字符串

2017-11-06 14:18:03

2020-09-30 17:12:09

人工智能技術(shù)數(shù)據(jù)

2021-05-20 08:37:32

multiprocesPython線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)