摘要:我們將去探索它的目的和主旨。這到底是什么呢我們?yōu)槭裁匆@么做呢我們很快就進(jìn)行介紹。我們不需要人為處理和文件。我們不寫純,我們需要在一個(gè)類似這樣的文件中取寫我們所有的標(biāo)簽。這就是樣式也有作用域的原因。換句話說消除了特殊性問題。
原文地址:https://css-tricks.com/css-mo...
最近我對(duì)CSS Modules比較好奇。如果你曾經(jīng)聽說過他們,那么這篇博客正適合你。我們將去探索它的目的和主旨。如果你同樣很好奇,敬請(qǐng)關(guān)注,在下一篇博文中我們將介紹如何使用CSS Modules。如果你想親自嘗試并且掌握如何使用,第三部分將會(huì)很適合你,這一部分剖析了如何在React環(huán)境中使用。
根據(jù)官方的repository介紹,CSS Modules是:
所有的class的名稱和動(dòng)畫的名稱默認(rèn)屬于本地作用域的CSS文件。
所以CSS Modules不是一個(gè)官方的規(guī)范,也不是瀏覽器的一種機(jī)制,它是一種構(gòu)建步驟中的一個(gè)進(jìn)程。(構(gòu)建通常需要webpack或者browserify的幫助)。通過構(gòu)建工具的幫助,可以將class的名字或者選擇器的名字作用域化。(類似命名空間化。)
這到底是什么呢?我們?yōu)槭裁匆@么做呢?我們很快就進(jìn)行介紹。首先,不要忘記HTML和CSS的工作原理。在HTML中一個(gè)類添加:
An example heading
在CSS中這個(gè)class的定義如下:
.title { background-color: red; }
只要CSS被添加到HTML文檔上,那個(gè)的背景色就是紅色。我們不需要人為處理CSS和HTML文件。瀏覽器本身自己就理解這些文件的格式。
CSS Modules 和上面的方法不一樣。我們不寫純HTML,我們需要在一個(gè)類似index.js這樣的Javascript 文件中取寫我們所有的標(biāo)簽。這里有一個(gè)例子來說明這是怎么回事(我們之后將會(huì)去看更多真實(shí)的實(shí)例):
import styles from "./styles.css"; element.innerHTML = `An example heading
`;
在我們構(gòu)建的步驟中,編譯器將會(huì)搜索我們導(dǎo)入的styles.css文件,然后到我們剛剛寫的js文件中,通過styles.title使得.title class可用。我們的構(gòu)建步驟將會(huì)同時(shí)處理這些東西成為新的,分離的HTML和CSS文件,并且用一個(gè)新的字符串去替換HTML和CSS選擇器的class。
通過構(gòu)建工具生成的HTML也許像下面這樣:
An example heading
通過構(gòu)建工具生成的CSS也許像下面這樣:
._styles__title_309571057{ background-color: red; }
class屬性和.title選擇器已經(jīng)完全不見了,取而代之的是這個(gè)全新的字符串;我們的源CSS文件也沒有為瀏覽器提供服務(wù)。
就像Hugo Griaudel在他的這一模塊的教程中所說:
[the classes]是動(dòng)態(tài)生成的,唯一的,而且和當(dāng)前的樣式有映射關(guān)系的。
這就是樣式也有作用域的原因。它們的作用域是特定的模板。如果我們有一個(gè)buttons.css文件我們將在buttons.js模板中導(dǎo)入它,并且在css文件內(nèi)的.btn class相對(duì)于其他模板(例如forms.js)也是不可用的,除非我們?cè)谶@個(gè)文件中同樣導(dǎo)入了進(jìn)來。
為什么我們想要把CSS和HTML搞成這樣?我們這樣做的真真正正的原因是什么?
為什么我們要用CSS Modules?有了CSS Modules,就可以確保所有的樣式能夠服務(wù)于單個(gè)組件:
集中在一個(gè)地方
只應(yīng)用于那個(gè)組件,其他組件不適用
除此之外,任何組件都能擁有真正的依賴,就像下面這樣:
import buttons from "./buttons.css"; import padding from "./padding.css"; element.innerHTML = ``;這樣設(shè)計(jì)的目的在于解決CSS中的全局作用域問題。
你曾有過為了提升效率,節(jié)省時(shí)間去簡(jiǎn)略的寫css嗎?而且是在完全不考慮你會(huì)不會(huì)影響其他代碼的情況下?
你曾有過在樣式表的底部隨機(jī)打了一些的比特和垃圾,然后嘗試回過頭來重新去組織但是從來沒這么做嗎?
你曾有過看到樣式卻不完全知道它的意義的時(shí)候嗎?即使它們被用在了當(dāng)前的標(biāo)簽上?
你曾有過思考如何去不破壞任何東西的情況下,去棄用一些現(xiàn)有的樣式嗎?考慮過這些樣式是僅僅作用于自己還是依賴其它樣式呢?或者是在哪里重新覆蓋了樣式了?
這些問題會(huì)讓人很頭痛,項(xiàng)目時(shí)間緊張,而你的心思又在窗外的花花世界。
但是當(dāng)你有了CSS Modules之后,關(guān)鍵是這種默認(rèn)本地作用域的概念,這個(gè)問題將會(huì)被避免。你必須去思考寫樣式的方便性。
例如,如果你在不應(yīng)用CSS module-style class去做轉(zhuǎn)換的情況下,在HTML中使用random-gross-class,這個(gè)樣式將不會(huì)被應(yīng)用,因?yàn)檫@個(gè)選擇器將會(huì)被轉(zhuǎn)換為._style_random-gross-class_0038089.
composes 關(guān)鍵詞我們現(xiàn)在擁有一個(gè)叫做type.css的模塊去渲染text樣式。在那個(gè)文件中,我們也許會(huì)有如下代碼:
.serif-font { font-family: Georgia,serif; } .display { composes: serif-font; font-size: 30px; line-height: 35px; }我們將在我們的模板中聲明class:
import type from "./type.css"; element.innerHTML = `This is a heading
; `編譯后的模板上的標(biāo)簽會(huì)是下面這樣:
Heading title
使用composes關(guān)鍵詞匯將2個(gè)class都綁定到元素上,從而避免了類似解決方案的一些問題,類似Sass中的@extend。
我們甚至可以在一個(gè)分離的CSS文件中去compose。
.element{ compose: dark-red from "./colors.css"; font-size: 30px; line-height: 1.2; }不需要BEM在構(gòu)建CSS module的過程中,不需要BEM。有2個(gè)原因:
易解析- 類似type.display這樣的代碼,對(duì)于開發(fā)者來說就像BEM-y的.font-size__serif--large。當(dāng)BEM選擇器變長(zhǎng)時(shí),可能更容易被理解。
本地作用域- 比如我們?cè)谀K中有一個(gè)類似.big去修改font-size屬性的class。同樣我們可能還會(huì)用.big去同時(shí)增大padding和font-size。這沒關(guān)系!他們不會(huì)沖突,因?yàn)樽饔糜蛑械臉邮绞怯懈髯砸饬x的。甚至一個(gè)module引入2個(gè)樣式表,然后它有通常的名字我們的構(gòu)建工具會(huì)為那個(gè)class加上前綴作區(qū)分。換句話說:CSS modules消除了特殊性問題。
很酷,難道不是嗎?
這些僅僅是CSS Modules的部分優(yōu)點(diǎn)。
如果你想學(xué)習(xí)更多,Glen Madden寫了更多的這樣做的好處。
這個(gè)系列的下一篇文章將會(huì)去探索如何在項(xiàng)目中使用Webpack和CSS Modules。我們將使用最新的ES2015的特性去實(shí)現(xiàn),也會(huì)給出一些代碼例子去引導(dǎo)大家去理解。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/113193.html
摘要:下面的代碼違反規(guī)則下面的代碼符合規(guī)則禁止使用十六進(jìn)制顏色十六進(jìn)制的顏色違反規(guī)則無效的十六進(jìn)制色同樣違規(guī)下面的是符合規(guī)則的自動(dòng)將十六進(jìn)制色轉(zhuǎn)換為大寫或者小寫可以使用實(shí)現(xiàn)同樣的功能。 showImg(https://segmentfault.com/img/remote/1460000014782565); 在PostCSS官網(wǎng)有著這樣的對(duì)PostCSS特性介紹,箭頭后面是對(duì)應(yīng)功能的插件及...
摘要:起初只是一個(gè)美化文檔的工具,但是事情到年發(fā)生了變化。對(duì)于來說,這意味著有問題的布局。和朝夕相伴的有和最終確定的。他們通過增加前綴的辦法,解決了命名沖突的問題。長(zhǎng)長(zhǎng)的前綴將成為歷史,歡迎來到未來的世界。 譯者注(GeoffZhu): 這篇適合一些使用過預(yù)處理CSS的開發(fā)者,比如less,sass或stylus,如果你都沒用過,那你一定不是個(gè)好司機(jī)。在PostCSS中早就可以使用CSS M...
摘要:但還存在一些問題,比如,單向數(shù)據(jù)流導(dǎo)致的有時(shí)數(shù)據(jù)鏈過長(zhǎng)過繁瑣所以才產(chǎn)生了,需要在多地保存同一份數(shù)據(jù)等等。數(shù)據(jù)流細(xì)粒度的目前來說,我們的的甚至是還是設(shè)計(jì)得太過簡(jiǎn)單。 前言 ??由于筆者對(duì)React的了解不深,即便算是學(xué)習(xí)React的時(shí)間,到目前也才剛剛半年,所以錯(cuò)誤不足之處還望指正。以下都是基于React 15(可能有些是16),webpack1進(jìn)行探討(注:未學(xué)習(xí)過Vue,Ng,Emb...
摘要:期有哪些常見的他們是解決什么問題的在回答之前我們先來了解一下我們?cè)谏弦还?jié)講過,是屬于模塊化方案,他能讓任意類型的文件都能運(yùn)行在瀏覽器中,怎么做到呢這時(shí)就有了定義用于對(duì)模塊的源代碼進(jìn)行轉(zhuǎn)換。 20190326期 Webpack有哪些常見的Loader?他們是解決什么問題的? 在回答之前我們先來了解一下Loader 我們?cè)谏弦还?jié)講過,webpack是屬于模塊化方案,他能讓任意類型的文件都能...
摘要:下面是頭部的樣式示例這是一個(gè)用例我在之前了解過自定義屬性的用法。這里有一個(gè)正在進(jìn)行中的規(guī)則的規(guī)范與之相關(guān)。允許儲(chǔ)存一系列的屬性并且在選擇器引用。 原文鏈接:https://tylergaw.com/articles...譯者:Icarus郵箱:xdlrt0111@163.com 多年來我一直使用Sass.但是最近我想要使用PostCSS和它的cssnext插件來嘗試處理樣式.我愛死了現(xiàn)...
閱讀 3685·2021-11-25 09:43
閱讀 2645·2021-11-25 09:43
閱讀 3844·2021-11-24 09:38
閱讀 697·2021-11-18 10:02
閱讀 2237·2021-09-22 15:53
閱讀 2998·2019-08-30 15:44
閱讀 2774·2019-08-30 14:01
閱讀 2754·2019-08-29 15:15