摘要:下面的代碼違反規(guī)則下面的代碼符合規(guī)則禁止使用十六進(jìn)制顏色十六進(jìn)制的顏色違反規(guī)則無效的十六進(jìn)制色同樣違規(guī)下面的是符合規(guī)則的自動(dòng)將十六進(jìn)制色轉(zhuǎn)換為大寫或者小寫可以使用實(shí)現(xiàn)同樣的功能。
在PostCSS官網(wǎng)有著這樣的對(duì)PostCSS特性介紹,箭頭后面是對(duì)應(yīng)功能的插件及其github地址。
increase code readability → Autoprefixer
Use tomorrow"s CSS ,today! → postcss-cssnext
The end of global CSS → postcss-modules
Avoid errors in your CSS → stylelint
Powerful grid CSS → lost →lost
PostCSS是一款使用插件去轉(zhuǎn)換CSS的工具,有許多非常好用的插件,例如autoprefixer,cssnext以及CSS Modules。而上面列舉出的這些特性,都是由對(duì)應(yīng)的postcss插件去實(shí)現(xiàn)的。而使用PostCSS則需要與webpack或者parcel結(jié)合起來。
在Parcel中使用PostCSS的方法:添加配置文件.postcssrc(JSON),.postcssrc.js或者是postcss.config.js。
拿 .postcssrc 文件來舉例:
{ "modules": true, "plugins": { "autoprefixer": { "grid": true } } }
Plugins 在 plugins 對(duì)象中被指定為 key,并使用對(duì)象的值定義選項(xiàng)。如果插件沒有選項(xiàng),只需將其設(shè)置為 true 即可。
下面我將對(duì)根據(jù)官方readme的演示demo,對(duì)各個(gè)插件進(jìn)行一一介紹,并添加一些隱藏在插件背后的知識(shí)點(diǎn)的說明。
首先明確一點(diǎn)Autoprefixer是一個(gè)根據(jù)can i use解析css并且為其添加瀏覽器廠商前綴的PostCSS插件。
不加任何vender prefix的通常寫法。
::placeholder { color: gray; }
Autoprefixer將使用基于當(dāng)前瀏覽器支持的特性和屬性數(shù)據(jù)去為你添加前綴。你可以嘗試下Autoprefixer的demo:http://autoprefixer.github.io/
由上圖可以看出,像沒有瀏覽器差異已經(jīng)完全符合W3C標(biāo)準(zhǔn)的css2.1屬性display,position等,Autoprefixer不會(huì)為其加前綴,而像css3屬性transform就會(huì)為其加前綴,其中--webkit是chrome和safari前綴,--ms則是ie的前綴,像firefox由于已經(jīng)實(shí)現(xiàn)了對(duì)transform的W3C標(biāo)準(zhǔn)化,因此使用transform即可。
因此Autoprefixer是一個(gè)非常有用的加速前端開發(fā)的一個(gè)工具,但是它需要基于PostCSS去發(fā)揮作用。
如果對(duì)vender prefix存疑,可以去看我的這篇博客:rem / Vender Prefix / CSS extensions
2.什么是postcss-cssnext?postcss-cssnext語法input:
:root { --fontSize: 1rem; --mainColor: #12345678; --centered: { display: flex; align-items: center; justify-content: center; }; } body { color: var(--mainColor); font-size: var(--fontSize); line-height: calc(var(--fontSize) * 1.5); padding: calc((var(--fontSize) / 2) + 1px); } .centered { @apply --centered; }
瀏覽器可用語法output:
body { color: rgba(18, 52, 86, 0.47059); font-size: 16px; font-size: 1rem; line-height: 24px; line-height: 1.5rem; padding: calc(0.5rem + 1px); } .centered { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; }
粗略看了一遍演示demo,http://cssnext.io/playground/,感覺既好用又不好用。
好用的地方在于通過var()和calc()進(jìn)行css屬性值的計(jì)算,也有@apply這樣的應(yīng)用大段規(guī)則的寫法,也可以借此去了解一些新的css草案特性;不好用的地方在于有一定的學(xué)習(xí)成本,而且在前期與webpack,gulp以及parcel進(jìn)行結(jié)合時(shí)也需要花費(fèi)一定時(shí)間,并且如果有新的前端組成員加入,必須要掌握這種cssnext的語法。
這樣做有些似乎在嘗試將css變?yōu)橐环N可以進(jìn)行邏輯處理的語言,但是我個(gè)人認(rèn)為這對(duì)于css這樣的靈活的需要具象思維并且需要大量調(diào)試的語言來說,工作中使用cssnext不是一個(gè)很好的選擇,但是工作之余可以作為一個(gè)學(xué)習(xí)新的css草案特性的一個(gè)入口,待到納入標(biāo)準(zhǔn)再去使用。
剛開始對(duì)自己的想法不確定,因此去看了下前輩們的想法,其中顧鐵靈對(duì)cssnext的想法與我的想法如出一轍:
CSS 的轉(zhuǎn)譯器(transpiler),根據(jù)目前仍處于草案階段、未被瀏覽器實(shí)現(xiàn)的標(biāo)準(zhǔn)把代碼轉(zhuǎn)譯成符合目前瀏覽器實(shí)現(xiàn)的 CSS。類似 ES6 的 Babel。3.什么是postcss-modules?
相比之下,Autoprefixer 更加具有實(shí)用價(jià)值,而 cssnext 實(shí)現(xiàn)的功能以后瀏覽器會(huì)怎么實(shí)現(xiàn)還存疑,感覺只能玩玩。
在看postcss-modules之前,首先要明確的是CSS Modules的這個(gè)概念,關(guān)于CSS Modules,可以閱讀我翻譯的一篇文章:【譯】什么是CSS Modules ?我們?yōu)槭裁葱枰麄儯?/p>
postcss-modules則是CSS Modules在PostCSS上的實(shí)現(xiàn)插件,這里有一篇插件作者本人寫的介紹postcss-modules的文章:PostCSS-modules:make CSS great again!。
在我有限的開發(fā)經(jīng)驗(yàn)中,只在react中使用過css modules,在vue和angularjs中都沒用到過,而且在react中使用時(shí),不會(huì)去用postcss-modules這個(gè)插件,而是使用react-css-modules這個(gè)CSS Modules思想在react中的插件。
下面將給出最簡單的入門例子:
在React上下文中,CSS Modules可能像下面這樣寫:
import React from "react"; import styles from "./table.css"; export default class Table extends React.Component { render () { return; } }A0B0
最后渲染出的組件的標(biāo)簽會(huì)是如下形式:
A0B0
如果對(duì)為什么會(huì)把class名編譯成table__table___32osj這樣的形式存在疑惑,需要先把css modules搞清楚:【譯】什么是CSS Modules ?我們?yōu)槭裁葱枰麄儯?/p>
如果需要在開發(fā)環(huán)境或者生產(chǎn)環(huán)境結(jié)合webpack去使用,那么可以閱讀react-css-modules的官方文檔尋找答案。
通過這次探索我們可以發(fā)現(xiàn),前端開發(fā)在不同的生態(tài),或者說框架體系下,同一個(gè)技術(shù),例如CSS Modules這種將思想,會(huì)有對(duì)應(yīng)的實(shí)現(xiàn)方式,而我們要掌握的,不僅僅是在某種框架下配置使用的方法,而是這種開發(fā)思想。因?yàn)閷W(xué)習(xí)的核心在于學(xué)習(xí)知識(shí),而不是無休止的學(xué)習(xí)工具。
4.什么是stylelint?這是用來強(qiáng)制開發(fā)人員按照?qǐng)F(tuán)隊(duì)css規(guī)范寫css樣式的工具,類似eslint。
若想使用,只需要去啟用規(guī)則即可。
節(jié)選一段stylelint作者博文中的話:
沒錯(cuò),你的團(tuán)隊(duì)可能在某個(gè)地方的某條純文本wiki中記錄了團(tuán)隊(duì)的代碼樣式規(guī)范。但是,不容忽視的是人的因素:人總是會(huì)犯錯(cuò)——總是在無意之間。
而且即使你很自律地執(zhí)著遵循某個(gè)規(guī)范的代碼風(fēng)格,但是你沒辦法確保你的同事或是你的開源項(xiàng)目的貢獻(xiàn)者能夠像你一樣。沒有l(wèi)inter的幫助,你必須人工檢查代碼樣式和錯(cuò)誤。而機(jī)器存在的意義就是代替人來完成能夠自動(dòng)化實(shí)現(xiàn)的任務(wù)。linter就是這樣的機(jī)器,有了linter,你不需要浪費(fèi)時(shí)間檢查代碼風(fēng)格,也不需要對(duì)每一個(gè)代碼錯(cuò)誤都寫一大堆的注釋,因此它能夠極大程度地減少你花費(fèi)在代碼審閱上的時(shí)間。你無須檢查代碼究竟做了些什么,也無需關(guān)心它看起來什么樣。
事實(shí)與stylelint作者說的是一樣的,即使團(tuán)隊(duì)有前端開發(fā)規(guī)范,也會(huì)不經(jīng)意間寫出不符合規(guī)范的代碼,因?yàn)槊看螌慶ss規(guī)則前都去規(guī)范check一遍不是誰都能做到的,如果團(tuán)隊(duì)再?zèng)]有code review這一關(guān)的話,寫出各種各樣風(fēng)格的css代碼就是一件必然的事了,短期沒有什么影響,當(dāng)項(xiàng)目變得龐大起來,增加新功能或者重寫舊功能將會(huì)是一件很痛苦的事。
我們主要去關(guān)注Rules部分:
sytlelint的規(guī)則主要有3類,我將從每一類規(guī)則中挑一個(gè)拿出來作為示例。
Possible errors(常見的錯(cuò)誤寫法,強(qiáng)烈推薦開啟)
Limit language features(棄用一些正確的寫法,中等推薦開啟)
Stylistic issues(代碼風(fēng)格代碼統(tǒng)一,普通建議開啟)
Possible errors ------ color-no-invalid-hex: 禁止無效的十六進(jìn)制顏色
完全形式的十六進(jìn)制顏色可以是6或者8(7,8位是透明度的值)個(gè)字符。同樣他們的縮寫可以是3或者4個(gè)字符。
options : true
下面的代碼違反規(guī)則:
a { color: #00; } a { color: #fff1az; } a { color: #12345aa; }
下面的代碼符合規(guī)則:
a { color: #000; } a { color: #000f; } a { color: #fff1a0; } a { color: #123450aa; }
Limit language features ------ color-no-hex:禁止使用十六進(jìn)制顏色
options : true
十六進(jìn)制的顏色違反規(guī)則:
a { color: #000; } a { color: #fff1aa; } a { color: #123456aa; }
無效的十六進(jìn)制色同樣違規(guī):
a { color: #foobar; } a { color: #0000000000000000; }
下面的是符合規(guī)則的:
a { color: black; } a { color: rgb(0, 0, 0); } a { color: rgba(0, 0, 0, 1); }
Stylistic issues ------ color-hex-case: 自動(dòng)將十六進(jìn)制色轉(zhuǎn)換為大寫或者小寫
Options string: "lower"|"upper"
可以使用stylelint "foo/*.css" --fix實(shí)現(xiàn)同樣的功能。
"小寫"
下面的代碼是違規(guī)的:
a { color: #FFF; }
下面的是符合規(guī)則的:
a { color: #000; } a { color: #fff; }
"大寫"
下面的代碼是違規(guī)的:
a { color: #fff; }
下面的是符合規(guī)則的:
a { color: #000; } a { color: #FFF; }
更多的stylelint的規(guī)則可以查閱:https://github.com/stylelint/...
5.什么是LostGrid?Lost Grid是一個(gè)強(qiáng)大的PostCSS網(wǎng)格系統(tǒng),可與任何預(yù)處理器甚至是原生CSS一起使用。
在這里有非常好的demo展示:http://lostgrid.org/lostgrid-...
節(jié)選2個(gè)展示進(jìn)行說明。
.ColumnSection__grid div { lost-column: 1/1; } @media (min-width: 400px) { .ColumnSection__grid div { lost-column: 1/3; } } @media (min-width: 900px) { .ColumnSection__grid div { lost-column: 1/6; } }
大于900px時(shí):
小于900px時(shí):
.NestingSection__grid { background: #8eb19d; } .NestingSection__grid div { background: #7ba48d; lost-column: 1/3; } .NestingSection__grid div div { background: #68977c; lost-column: 1/2; }
經(jīng)過查看css樣式我們發(fā)現(xiàn),其實(shí)就是巧用了table布局,before/after偽元素,以及css選擇器,以及border-box布局,但其實(shí)最最核心的地方還是在于很好的使用了css本身具有的流式布局以及BFC,針對(duì)各種情況,在插件內(nèi)部使用了大量的樣式進(jìn)行約束。
在css3的flex布局和grid布局逐漸被瀏覽器所支持的今天,我個(gè)人建議不使用LostGrid插件。
期待和大家交流,共同進(jìn)步,歡迎大家加入我創(chuàng)建的與前端開發(fā)密切相關(guān)的技術(shù)討論小組:
SegmentFault技術(shù)圈:ES新規(guī)范語法糖
SegmentFault專欄:趁你還年輕,做個(gè)優(yōu)秀的前端工程師
知乎專欄:趁你還年輕,做個(gè)優(yōu)秀的前端工程師
Github博客: 趁你還年輕233的個(gè)人博客
前端開發(fā)交流群:660634678
努力成為優(yōu)秀前端工程師!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/113233.html
摘要:而則可制定個(gè)人需求的一套解決方案僅安裝需要的插件。迫不及待的你已經(jīng)等不及安裝使用了吧。安裝及使用一般是結(jié)合自動(dòng)化工具使用,如果要單獨(dú)使用可以安裝,這里我先對(duì)的安裝使用講解下。接下來說點(diǎn)實(shí)際的,如何利用結(jié)合自動(dòng)化工作在項(xiàng)目中使用。 PostCSS介紹 PostCSS是一個(gè)利用JS插件來對(duì)CSS進(jìn)行轉(zhuǎn)換的工具,這些插件非常強(qiáng)大,強(qiáng)大到無所不能。其中,Autoprefixer就是眾多Post...
摘要:本身并不直接用于處理樣式,只有配合它的插件,才能完成相關(guān)的編譯工作。是很容易引入當(dāng)前的工作流中的。無論是還是,都有比較方便的方式。 一般來說介紹一個(gè)東西都是要從是什么,怎么用的順序來講。我感覺這樣很容易讓大家失去興趣,先看一下postcss能做點(diǎn)什么,有興趣的話再往下看,否則可能沒有耐心看下去。讓我們開始吧 postcss能做什么 補(bǔ)全css屬性瀏覽器前綴 手寫的代碼可以是這樣的: ....
摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業(yè)務(wù)邏輯開發(fā)流程需要經(jīng)過預(yù)處理器如或,然后再經(jīng)過后處理器如進(jìn)行深加工。 還未看的,可以點(diǎn)擊查看上兩篇文章喲:Webpack 最佳實(shí)踐總結(jié)(一)、Webpack 最佳實(shí)踐總結(jié)(二) 好了,這篇是第三篇,也是完結(jié)篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會(huì)讓你失望的 整合 CSS 加工流 有時(shí)候,前端項(xiàng)目中除了 JavaScript ...
摘要:這里要介紹的是工作流中的一種很普遍的代碼加工流程正常的業(yè)務(wù)邏輯開發(fā)流程需要經(jīng)過預(yù)處理器如或,然后再經(jīng)過后處理器如進(jìn)行深加工。 還未看的,可以點(diǎn)擊查看上兩篇文章喲:Webpack 最佳實(shí)踐總結(jié)(一)、Webpack 最佳實(shí)踐總結(jié)(二) 好了,這篇是第三篇,也是完結(jié)篇,我感覺這一篇是最亂的一篇,湊合著看吧,不會(huì)讓你失望的 整合 CSS 加工流 有時(shí)候,前端項(xiàng)目中除了 JavaScript ...
閱讀 3471·2019-08-30 13:15
閱讀 1407·2019-08-29 18:34
閱讀 836·2019-08-29 15:18
閱讀 3494·2019-08-29 11:21
閱讀 3255·2019-08-29 10:55
閱讀 3711·2019-08-26 10:36
閱讀 1877·2019-08-23 18:37
閱讀 1833·2019-08-23 16:57