1. 程式人生 > >Postcss、css4帶你體驗一種獨特的優雅

Postcss、css4帶你體驗一種獨特的優雅

一:看過阮一峰大大介紹react的一篇文章中提到Postcss,甚是感興趣,趁著專案空餘小小研究了一下。那麼到底Postcss到底是啥,能幹啥呢??

現如今各種外掛和工具多的數不勝數,比如gulp、grunt、webpack,less、scss等也都有對應其工具的相應外掛,還有合併、壓縮、瀏覽器自動重新整理等實用外掛,那Postcss存在的意義是什麼呢?

模組化?!如果你的專案用的webpack或者是gulp,那麼相應的要安裝一堆處理各種檔案的外掛。Postcss可以說就是將你專案中所有處理css的外掛進行了一個二次封裝,讓你基於Postcss這個平臺來完成,用Postcss它獨有的一套體系來處理專案中的css檔案。也就是說如果你的專案中想使用Postcss,想感受Postcss的獨特魅力,那麼less、scss、clean-css等處理css的外掛全部替換成Postcss其獨特的外掛就行了。

那麼好,知道了Postcss是個什麼鬼,來認識一下最出名(最實用)的外掛autoprefixer

autoprefixer是讓你可以偷懶的神器,如果你的專案是PC端的,並且產品大大或者專案經理大大要你相容IE8~9,是不是很頭疼。別怕,用了autoprefixer,寫正常的標準css就好了,autoprefixer會自動幫你新增瀏覽器字首的,哈哈。

Postcss還有許多功能,壓縮合並它都可以,只要你感興趣,完全可以運用到專案當中(不建議,當然如果你願意折騰,請隨意)。

不廢話,上程式碼。

任務思路:新增瀏覽器字首->編譯css4->合併所有css檔案->壓縮處理好的css->移動至目標資料夾(實時監測css這個task)

gulp.task('css', function () {
    gulp.src(['./src/css/*.css'])
        .pipe(changed('dist/css', {hasChanged: changed.compareSha1Digest}))
        .pipe(postCss([
            autoprefixer({
                browsers: ['last 4 version','Android >= 4.0'],//新增瀏覽器最近的四個版本需要的字首,相容安卓4.0以上版本
                cascade: false,//是否美化屬性,預設true
                remove: true//移除不必要的字首
            }), cssNext()]))
        .pipe(concat('main.css'))
        .pipe(cleanCSS())
        .pipe(gulp.dest('dist/css'))
        .pipe(browserSync.reload({stream:true}));
});

你需要安裝的有gulp、gulp-concat、gulp-postcss、autoprefixer、gulp-clean-css、gulp-changed、cssnext、browser-sync。

2017.6.19更新:不建議使用cssnext,css檔案不支援@、$等符號,less和scss本身對於這些符號有自己的定義。cssnext依賴於autoprefixer,css4的屬性需要新增瀏覽器字首,並且cssnext實現的功能以後瀏覽器會怎麼具體實現還存疑,沒有實用價值。為了專案穩定,建議大家瞭解一下就好。二-11已經被主流瀏覽器支援,實測ie和360不行

二:上文提到了還未提案的css4、接下來介紹一下css4的新特性都有哪些?(習慣之後會很強大,cssnext支援的css4點選檢視

1、父元素選擇器:$div>span 

      例:.wrap>$div>span{color:red;}  此時樣式會落在帶有$的div身上

      例2:$ol>li:only-child{list-style:none;}  此時樣式會落在只有一個li子元素的ol身上。

2、連結地址偽類:分割線////      :any-link(用於所有連結)      :local-link(用於站內連結)

3、文字偽類:分割線////    :dir(ltr)從左到右   :dir(rtl)從右到左

      例:p:dir(rtl){font-size:20px;} 將會渲染成字型大小為20px,文字排列方向從右向左的一行文字。

4、組合對映選擇器:分割線////     :matches()

      例:p:matches( :first-child , .main ){ color: red; }  結果 p:first-child , p.main{ color: red; }

      例2:label:matches(:hover,:focus) input{box-shadow:0px 0px 10px red;} 當label獲取焦點或者hover時,相對應的input會被高亮。對應關係當然是for和id了。

5、ID屬性匹配

      例:li:hover /data-type/ p{background-color:yellow;} 當li的data-type屬性與p的id屬性值相同時且當li處於hover狀態下,對應的p會高亮。

6、wrap-flow:both;文字會在元素的四周包圍。

7、圍繞圖形排列shape,僅在浮動元素上設定會生效

      例:.shape{float:left;shape-outside:circle(50%)} 此時文字會在圖片的周圍按照圖片的輪廓曲線排列

8、包含元素選擇器  :has

      例:table:has(tr:nth-of-type(11)){background-color:red} 若table元素內有超過10個tr,樣式生效。

      例2:div:has(p:nth-child(28)) 若div內的第28個元素為p,該div被選中

9、不包含元素選擇器  :not

      例:a:not(href*=['baidu'])  這樣會選擇所有連結中不包含baidu的連結

      例2:div:not([class|='W_content'],:has(img)) 將會選中所有class不是以W_content開頭或W_content_開頭並且子元素沒有img的div

10、塊級樣式scoped

         例:此時style內的樣式僅在div內部生效,即內部文字會變成紅色

         <section>
             <h1>外部文字</h1>
             <div>
                 <style scoped>
                     h1{
                         color:red;
                     }
                 </style>
                 <h1>內部文字</h1>
             </div>
         </section>

11、var()定義變數:定義變數只能在:root裡面定義,定義變數的方法類似less和scss,因為@和$已經被less和scss佔用了,所以使用‘--’作為變數的標識,使用var()呼叫

        :root {  --mainColor: red;  --commonColor: green; --fontSize: 1rem; }        

        a {  color: var(--commonColor); background-color: var(--mainColor); }     

        結果:a{  color:green;  background-color:red; }

12、定義程式碼塊@apply:在:root內定義,識別符號是 ' -- ' ,@apply呼叫

        :root{ --centered{ display:flex; align-items:center; justify-content:center; } }  .centered{ @apply --contered; }

         結果:.centered{ display:flex; align-items:center; justify-content:center; }

13、calc函式

         例:.wrap{background-position:calc(100%-25px) calc(100%-25px)} 當你不知道容器的寬和高的時候,calc函式可以將背景圖片定位到距離右下角25px的位置

         例2:body{ font-size: calc( var( --fontSize ) * 2 ); }   結果: body{ font-size: 2rem; }

14、blackness:用於顏色,向黑色加深。

         例:a{ color:color(red blackness(10%)); }   結果:a{ color: rgb(230, 0, 0) } //顏色加深了一點

         例2:a{ color:color(red blackness(80%)); }   結果:a{ color: rgb(51, 0, 0); } //已經很接近黑色了

15、alpha:用與顏色,用更清晰的方式改變透明度,rgba中的a

         例:a{ color: color(red alpha(-50%)); }   結果:a{ color: color: rgba(255, 0, 0, 0.5); }

16、gray():灰度,值越大顏色越淺

         例:a{ color: gray(10); }   結果:a{ color:rgb(10,10,10); }   //特別深的灰色,看起來像黑色

         例2:a{ color: gray(200); }   結果:a{ color:rgb(200,200,200); }   //特別淺的灰色,看起來像銀色

三:css4封裝的功能非常強大,目前這些草稿還未完全定稿,還有變化的可能,也許還會有許多新屬性發布。當css4正式提案時,可能就是我放棄less和scss的時候到了,因為less或者scss與css4有些操作符是一樣的,這會產生衝突,例如@、$。還有一些複雜的屬性和選擇器瀏覽器還不能支援。