摘要:為什么引入全局樣式?jīng)_突進(jìn)行打包時(shí),將所有文件導(dǎo)入到入口文件中,樣式也會統(tǒng)一加載到入口中,根據(jù)的規(guī)則,后面的樣式會覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問題。
CSS Modules 為什么引入CSS Modules
(1)全局樣式?jīng)_突
webpack進(jìn)行打包時(shí),將所有js文件導(dǎo)入到入口App.js文件中,樣式也會統(tǒng)一加載到入口中,根據(jù)css的layout規(guī)則,后面的樣式會覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問題。
(2)嵌套層次過深的選擇器
為了解決全局樣式的沖突問題,不得不引入一些特地命名namespace來區(qū)分,但是往往有些namespace命名得不夠清晰,就會造成要想下一個(gè)樣式不會覆蓋,就要再加一個(gè)新的命名空間來進(jìn)行區(qū)分,最終可能一個(gè)元素的顯示樣式嵌套特別深。
嵌套特別深會造成的問題: - 根據(jù)CSS選擇器的解析規(guī)則可以知道,層級越深,比較的次數(shù)也就越多,影響整個(gè)頁面的渲染 - 增加了不必要的字節(jié)開銷 - 語義混亂 可擴(kuò)展性不好,約束越多,擴(kuò)展性越差
(3)無法共享變量
復(fù)雜組件要使用 JS 和 CSS 來共同處理樣式
(1)css預(yù)處理器(less/sass) 支持模塊引入
存在問題:不能解決全局樣式?jīng)_突問題
(2)BEM(Block Element Modifier)解決命名沖突以及更好的語義化
Block:邏輯和頁面功能都獨(dú)立的頁面組件,是一個(gè)可復(fù)用單元,特點(diǎn)如下:
可以隨意嵌套組合
可以放在任意頁面的任何位置,不影響功能和外觀
可復(fù)用,界面可以有任意多個(gè)相同Block的實(shí)例
Element:Block的組成部分,依賴Block存在(出了Block就不能用)
[可選]定義Block和Element的外觀及行為,就像HTML屬性一樣,能讓同一種Block看起來不一樣
存在問題:對于嵌套過深的層次在命名上會給需要語義化體現(xiàn)的元素造成很大的困難 對于多人協(xié)作上,需要統(tǒng)一命名規(guī)范,這同樣也會造成額外的effort
CSS Modules(1)什么是css modules
通過構(gòu)建工具來使指定class達(dá)到scope的過程
(2)css modules優(yōu)勢
解決全局命名沖突問題 css modules只關(guān)心組件本身 命名唯一
模塊化 可以使用composes來引入自身模塊中的樣式以及另一個(gè)模塊的樣式
解決嵌套層次過深的問題 使用扁平化的類名
(3)css modules的用法
開啟css modules功能
由于css modules對樣式的處理邏輯是放在loader中,所以在css-loader中開啟css-loader
{ test: /.css$/, use: [ { loader: MiniCssExtractPlugin.loader, options: { publicPath: "./build/styles" } }, { loader: "css-loader", options: { importLoaders: 1, modules: true, localIdentName: "[name]__[local]___[hash:base64:5]" // 為了生成類名不是純隨機(jī) } } ] }
修改index.js文件中對樣式的引入方式
import styles from "./index.css"; // 導(dǎo)出對象的格式是鍵值對
編譯之后的類使用
//index.css .color{ color:blue; } // index.js import styles from "./index.css"; // 導(dǎo)出對象的格式是鍵值對 // jsx使用轉(zhuǎn)化后的類名// 如果以下劃線給類命名使用styles["color-style"]
(4)其他用法
局部變量和全局變量
:local 做localIdentName規(guī)則處理(類名進(jìn)行編譯 默認(rèn)可以不寫)
:global 樣式編譯后不變
/*下面兩種進(jìn)行編譯*/ .normal { color: green; } :local(.normal) { color: green; } /*下面兩種不會進(jìn)行編譯*/ // 多個(gè)類不編譯 :global { .link { color: green; } .box { color: yellow; } } // 單個(gè)類不編譯 :global(.box){ color:blue; }
compose組合class(需要樣式復(fù)用,在 CSS Modules 中,一個(gè)選擇器可以繼承另一個(gè)選擇器的規(guī)則) 自身引入的聲明的優(yōu)先級會比較高
/* 同一個(gè)css文件中復(fù)用類*/ .bg { background-color:blue; } .title { composes:bg; color:white; } // js中使用 import styles from "./test.css";css modules// 生成的HTMLcss modules
/* 不同css文件中復(fù)用類*/ /* color.css */ .red { color: red; } .blue { color: blue; } /* index.css */ .red { color: red; } .header { font-size: 32px; } .title { color: green; composes: blue from "./color.css"; border-bottom: 1px solid #ccc; padding-bottom: 20px; }
CSS和JS變量共享(:export 關(guān)鍵字可以把 CSS 中的 變量輸出到 JS 中)
/* index.scss */ $primary-color: #f40; :export { primaryColor: $primary-color; } /* app.js */ import style from "index.scss"; // 會輸出 #F40 console.log(style.primaryColor);備注
項(xiàng)目中如果使用antd 需要將antd樣式不進(jìn)行編譯
使用exclude排除exclude中指定目錄的資源。在node-modules中關(guān)閉css-module,在我們自己寫的src下的css開啟css-module
{ test: /.css$/, exclude: /node_modules|antd.css/, use: [ { loader: MiniCssExtractPlugin.loader, options: { publicPath: "./build/styles" } }, { loader: "css-loader", options: { importLoaders: 1, modules: true, localIdentName: "[name]__[local]___[hash:base64:5]" // 為了生成類名不是純隨機(jī) } } ] }
項(xiàng)目中使用stylelint進(jìn)行css檢查 需要在stylelint配置忽略css-modules的關(guān)鍵字
module.exports = { rules: { "selector-pseudo-class-no-unknown": [ true, { ignorePseudoClasses: [ "export", "import", "global", "local", "external", ], }, ], "selector-type-no-unknown": [ true, { ignoreTypes: ["from"], }, ], "property-no-unknown": [ true, { ignoreProperties: ["composes", "compose-with"], }, ], "at-rule-no-unknown": [ true, { ignoreAtRules: ["value"], }, ], }, };
推薦css解決方案文章:
React拾遺:從10種現(xiàn)在流行的 CSS 解決方案談?wù)勎业淖類?(上)
CSS Modules入門及React中實(shí)踐
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104883.html
摘要:結(jié)果是選手獲勝,名為的元素,最終的值為。而合理的命名約定,的確是組織代碼的有效策略。它們會再由轉(zhuǎn)換為適當(dāng)?shù)慕M合。雖然本文為了嚴(yán)謹(jǐn),結(jié)果寫了相當(dāng)長的篇幅,但希望你讀過之后,還能覺得是簡單易懂的。 不要誤會,CSS Modules可不是在說css模塊化這個(gè)好像在某些地方見過的詞,它其實(shí)是特指一種近期才出現(xiàn)的技術(shù)手段。 什么技術(shù)手段呢?請待后文說明。 層疊樣式表 我們知道,css的全名叫做層...
摘要:能最大化地結(jié)合現(xiàn)有生態(tài)預(yù)處理器后處理器等和模塊化能力,幾乎零學(xué)習(xí)成本。編碼相關(guān)的所有樣式上例中打印的結(jié)果是注意到是按照自動生成的名。實(shí)踐手動引用渲染結(jié)果使用可以實(shí)現(xiàn)使用屬性自動加載模塊。 文章同步于Github Pines-Cheng/blog 隨著前端這幾年的風(fēng)生水起,CSS作為前端的三劍客之一,各種技術(shù)方案也是層出不窮。從CSS prepocessor(SASS、LESS、Styl...
摘要:上例中打印的結(jié)果是對中的名都做了處理,使用對象來保存原和混淆后的對應(yīng)關(guān)系。結(jié)合實(shí)踐在處直接使用中名即可。如因?yàn)橹粫D(zhuǎn)變類選擇器,所以這里的屬性選擇器不需要添加。 showImg(http://gtms01.alicdn.com/tps/i1/TB15w0HLpXXXXbdaXXXjhvsIVXX-600-364.png); CSS 是前端領(lǐng)域中進(jìn)化最慢的一塊。由于 ES2015/201...
摘要:為什么引入全局樣式?jīng)_突進(jìn)行打包時(shí),將所有文件導(dǎo)入到入口文件中,樣式也會統(tǒng)一加載到入口中,根據(jù)的規(guī)則,后面的樣式會覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問題。 CSS Modules 為什么引入CSS Modules (1)全局樣式?jīng)_突 webpack進(jìn)行打包時(shí),將所有js文件導(dǎo)入到入口App.js文件中,樣式也會統(tǒng)一加載到入口中,根據(jù)css的layout規(guī)則,后面的樣式會覆蓋掉前...
摘要:示例庫通過記錄來查看定制類名默認(rèn)的哈希算法是,從前面我們可以發(fā)現(xiàn)被編譯成了這樣的字符串。與上面不加等價(jià)顯式的局部作用域語法通過示例庫的記錄來查看下的樣式復(fù)用對于樣式復(fù)用,提供了組合的方式來處理。 showImg(https://segmentfault.com/img/bV9WfX?w=800&h=274);前端發(fā)展越來越快,這應(yīng)該是每個(gè)前端開發(fā)者的切身感受,但是CSS 是前端領(lǐng)域中進(jìn)...
閱讀 3237·2021-11-23 09:51
閱讀 1042·2021-08-05 09:58
閱讀 676·2019-08-29 16:05
閱讀 985·2019-08-28 18:17
閱讀 3039·2019-08-26 14:06
閱讀 2734·2019-08-26 12:20
閱讀 2171·2019-08-26 12:18
閱讀 3074·2019-08-26 11:56