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