|
導讀網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立... 網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。 本篇文章給大家帶來的內容是關于什么是css模塊化?css模塊化的實現方法,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。CSS 模塊化 CSS(Cascading Style Sheets),從誕生之初就決定了它無法編程,甚至連解釋性語言都算不上,只能作為一種簡單的層疊樣式表,對 HTML 元素進行格式化。 但隨著前端的發展,前端項目已經變得越來越龐大和復雜,社區也一直在探索如何以一種有效的方式去管理前端的代碼(js/css/html)和資源(images, fonts, ...)。 在這個過程中,社區探索出了 js 的模塊化(amd, commonjs, es6),現在用 js 開發大工程已經游刃有余,而 css 的模塊化卻還沒有特別的深入人心。 1. 分組式模塊化這是最早對 css 模塊化的實現,也是最主要的一種方式,包括現在很多組件和開發者都是用這種方式開發的。 分組式模塊化就是用命名的方式,以不同的前綴代表不同的含義,實現樣式分組,文件分塊,達到模塊化的目的。 比如: # 目錄結構
|-- one/page/css/ 某個頁面的 css 目錄
|-- common.css 通用的 css
|-- page1/ 單頁面1
|-- section1.css 區域1 css
|-- section2.css 區域2 css
|-- page2/ 單頁面2
|-- ...
# common.css 文件
.c-el-1 {
...
}
.c-el-2 {
...
}
...
# page1/section1.css 文件
.page1-section1 {
...
}
.page1-section1 .el-1 {
...
}
.page1-section1 .el-2 {
...
}
...
# page1/section2.css 文件
.page1-section2 {
...
}
.page1-section2 .el-1 {
...
}
.page1-section2 .el-2 {
...
}
...這種方式并不是真正意義上的模塊化,因為無法避免全局沖突的問題,但原生 css 并不具備編程的能力,所以這個問題是無法避免的。盡管分組式不算真正意義上的模塊化,但是這種方式沒有脫離 css 原生的機制,所以尤其是第三方組件在導出 css 文件時,很多都使用的是這種方式。 比如,ant-design 導出的 css 中使用 ant- 前綴標識,mui 導出的 css 中使用 mui- 前綴標識等等。 1.1 最佳實踐css 命名分組實踐的時間很長,從 css 誕生之初就有了,所以社區已經發展很成熟了,比如網易的 css 規范框架 NEC,H-ui。 補充: 一個 css 文件不宜過大,可以使用 @import 進行文件分塊; 樣式渲染盡量不要使用 #id [attr],應盡量使用 .class; 使用 js 庫操作 dom 時,盡量不要用 .class,應盡量用 #id data-set,如 $('#main'), $('[data-tab="1"]')。 <ul>
<li data-tab="1">tab1</li>
<li data-tab="2">tab2</li>
</ul>
<p data-tab-container="1"></p>
<p data-tab-container="2"></p>1.2 css 語言擴充因為 css 不是編程語言,所以不能聲明變量、函數,不能做判斷、循環和計算,也不能嵌套,所以這就使得寫樣式是一個效率底下且又枯燥的活兒。 為了解決這個問題,社區在探索中主要衍生出了兩種拓展語言 less 與 sass,它們兼容 css,并且拓展了編程的功能,主要是帶來了以下的特性: 可以聲明變量、函數,可以進行一些簡單的計算、判斷、循環; 可以嵌套選擇器,這樣節省了書寫的內容,也更具閱讀性; .page1-section1 {
...
.el-1 {
...
.el-1-1 {
...
}
}
.el-2 {
...
}
}@import 避免重復導入問題,因此可以放心大膽的導入其他文件。 從模塊化的角度來講,less 與 sass 只是擴充了 css 的功能,但并沒有在語言的層面做模塊化,因為全局命名沖突的問題依然還在。 2. 模塊化(導出為 js 對象)想要讓 css 具備真正意義上的模塊化功能,暫時還不能從語言的層面來考慮,所以只能從工具的角度來實現。 目前比較好的方式是使用 js 來加載 css 文件,并將 css 的內容導出為一個對象,使用 js 來渲染整個 dom 樹和匹配相應的樣式到對應的元素上,在這個過程中,我們便有機會對 css 做額外的處理,來達到模塊化的目的。 比如: 源文件 # style.css 文件
.className {
color: green;
}
# js 文件
import styles from "./style.css";
element.innerHTML = '<p class="' + styles.className + '">Hello!</p>';實際效果 # style.css 文件
._23_aKvs-b8bW2Vg3fwHozO {
color: green;
}
# DOM
<p class="_23_aKvs-b8bW2Vg3fwHozO">Hello!</p>在這個轉換過程中,根據文件的位置、內容生成一個全局唯一的 base64 字符串,替換原來的名稱,避免了全局命名沖突的問題,這樣便達到了模塊化的目的。所以,開發的過程中便無全局樣式沖突的問題。 # common.css 文件
.container {
...
}
.el1 {
...
}
.el2 {
...
}
...
# page1/section1.css 文件
.container {
...
}
.title {
...
}
.content {
...
}
...
# page2/section1.css 文件
.container {
...
}
.title {
...
}
.content {
...
}
...對 css 模塊化的定義參見 css-modules,其中對 css 書寫需求主要是: 1、應當用 .class,而非#id [attr](因為只有 .class 才能導出為對象的屬性); 2、推薦用 .className 書寫,而非 .class-name(前者可以通過 styles.className 訪問,后者需要通過 styles['class-name'] 才能訪問)。 更多功能可以查看 css-modules。 當然這個功能需要構建工具的支持,如果你是使用 webpack 構建工程的話,可以使用 css-loader,并設置 options.modules 為 true, 便可使用模塊化的功能了。 3. 模塊化(內置 js,綁定組件)隨著前端組件化的發展,組件化框架的更新,如 react、vue,慢慢的發展為把整個組件的資源進行封裝,并只對外暴露一個對象,而調用者無需關心組件的內部實現和資源,直接調用這個對象就夠了。 比如(以 react 為例),一個 Welcome 組件,包括一個 js 文件、一個 css 文件、圖片: # Welcome 組件 |-- welcome.js |-- welcome.css |-- images/ 在 import styles from './welcome.css'; import image1 from './images/1.jpg'; 其實,還有另外一種思路,就是將 css 內置 js 中,成為 js 的一部分。 這樣做的目的,一是 css 的模塊化,二是直接綁定到組件上。 比如,material-ui、styled-jsx、jss、vue style scoped 便是使用的這種方式。 這種方式的實現有很多種,這里主要介紹一下 styled-jsx。 3.1 styled-jsxstyled-jsx 的原理是根據當前文件的位置、內容生成一個全局唯一的標識,然后把這個標識追加到組件每一個元素上,每一個樣式選擇器上,達到模塊化的目的。 可以參考官方文檔,查看詳細的用法,我在這里給個例子: 3.1.1 安裝工具(babel 轉碼所需)npm install --save styled-jsx 3.1.2 配置 babel plugins(如 |
溫馨提示:喜歡本站的話,請收藏一下本站!