vue使用--saas的引入與使用


 什么是saas、scss?

 saas是一種動態樣式語言,屬於CSS預處理器,為CSS增加了一些編程特性,比如變量、嵌套、函數、繼承、運算等等。開發人員可以像使用js等語言一樣使用saas進行css的編程開發。

 scss是saas改進版本saas 3的簡稱,它對原saas的語法兼容,區別於使用 {} 代替了原來的縮進;

 

 1.安裝與引入配置

 初始化vue-cli項目,這里就不詳述了,需要的可以查看之前寫的一篇隨筆,穿梭>>>

 依賴安裝,執行以下安裝命令:

npm install node-sass --save-dev
npm install sass-loader --save-dev

 

 配置webpack.base.conf.js --- 在module節點rules數組中添加以下代碼

{ 
   //配置編譯識別sass! 
   test: /\.scss$/,
   loaders: ["style", "css", "sass"]
} 

 

 2.使用示例

 ①變量定義 ($)

<style lang="scss" scoped>
$fontcolor: #88f1e8;  // 定義變量fontcolor, 格式'$變量名: value'

.myscss {
    color: $fontcolor; // 使用變量
}
</style>

  ✦定義格式: ‘$變量名: value’,注意value不需要引號一起來

  ✦使用:'$變量名'

  ✦注意:使用scss,style標簽的要設置 lang="scss"

 

  ②混合器使用(@mixin)

<style lang="scss" scoped>
// 定義mixin混合器
@mixin demoDiv ($height, $width, $bgColor: #eee) {
    width: $width;
    height: $height;
    background-color: $bgColor;
}

.myscss {
    // 使用
    @include demoDiv(300px, 300px)
    /*
        編譯后
        width: 300px;
        height: 300px;
        background-color: #eee;
    */
}
</style>

  ✦定義格式: ‘@mixin 名稱 (變量1,變量2...) {  // 樣式  }’, 也可以不帶變量,變量可以設置默認值(帶默認值的引用時可以不傳)

  ✦使用:'@include 名稱 (value1, value2...)'

  ✦優點:將相似的樣式提取出來,允許傳入參數的自定義設置,代碼簡潔、使用方便

 

  ③繼承(@extend)

<style lang="scss" scoped>
.myscss {
    .demo1 {
        width: 100px;
        font-size: 14px;
    }
    .demo2 {
        @extend .demo1;  // 使用@extend 繼承
        color: aqua;
    }
    /*
        編譯后
        .myscss .demo1, .myscss .demo2 {
            width: 100px;
            font-size: 14px;
        }
        .myscss .demo2 {
            color: aqua;
        }
    */
}
</style>

  ✦使用@extend 來實現繼承操作

  ✦繼承就是將一個樣式的數據引入到一個樣式中,個人覺得有點類似引用無參的混合器,混合器中存放一段相同的代碼

 

  ④屬性嵌套

<style lang="scss" scoped>
.myscss {
    .demo1 {
        width: 100px;
        font-size: 14px;
    }
    /*
        編譯后
        .myscss .demo1 {
            width: 100px;
            font-size: 14px;
        }
    */
}
</style>

  ✦屬性嵌套讓層級的樣式看起來更加直觀優美

 

  ⑤占位符(%)

<style lang="scss" scoped>
%comdiv {
    width: 300px;
    height: 300px;
    color: $titleColor;
}
.myscss {
    .demo1 {
        @extend %comdiv;
    }
    /*
        編譯后
        .myscss .demo1 {
            width: 300px;
            height: 300px;
            color: $titleColor;
        }
    */
}
</style>

  ✦占位符使用 % 聲明

  ✦占位符與普通樣式的區別在於,不被@extend調用就不會被編譯

 

  ⑥變量嵌套引用(#{})

<style lang="scss" scoped>
$divborder: left;
.myscss {
    .demo1 {
        border-#{$divborder}: 1px solid #eee;
    }
    /*
        編譯后
        .myscss .demo1 {
            border-left: 1px solid #eee;
        }
    */
}
</style>

  ⑦編程式方法  

//1. @if...@else...
.demo { 
    @if $ival > 3 { 
        // do something
    } @else {
        // do something
    } 
}    

//2. for循環
//@for $i from <start> through <end>  包含end
//@for $i from <start> to <end>  不包含end
@for $i from 1 to 3 {
    .demo_#{$i} {
        color: red;
    }       
}

//3.while 循環
// @while <表達式>
$wval: 3
@while $wval > 1 {
    //do something
    $wval: $wval - 1;
}

//4.each循環
//@each $var in <list>($var為變量值,list為sassscript表達式)
@each $var in demo1, demo2 {
    .#{$var} {
        color:red;
    }
}


//5.function函數(自定義函數)
//@function 
@function getcolor($sn){
    @if $sn = 1 {
        return red;
    } @else {
        return blue;
    }
}      

 

  其它功能的使用,后期再補充✨

 

 3.抽離共用

  對於變量、混合器、公共樣式等,我們如果像上面的示例一樣都寫在組件當中,問題就不僅是代碼的冗余,還失去了使用的意義,所以我們需要將變量、混合器等抽離出來,放到公共的scss文件中。

  ①文件目錄

  我們創建三個scss文件,變量文件(var.scss)、混合器文件(mixin.scss)、公共樣式文件(common.scss)

 

  ②引用

  在app.vue中引入公共樣式(變量和混合器不在此引入,具體一會說明)

<style>
@import "static/css/common.scss";   /*引入公共樣式,在組件中直接使用樣式即可*/
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

  在utils.js(build>utils.js)中引入變量和混合器文件,在utils.js中添加以下:

 

exports.cssLoaders = function (options) {
   // 其它默認代碼
   function generateSassResourceLoader () {
    var loaders = [
        cssLoader,
        'sass-loader',
        {
            loader: 'sass-resources-loader',
            options: {
                resources: [
                    path.resolve(__dirname, '../src/assets/var.scss'),
                    path.resolve(__dirname, '../src/assets/mixins.scss')
                ]
            }
        }
    ]
    if (options.extract) {
        return ExtractTextPlugin.extract({
            use: loaders,
            fallback: 'vue-style-loader'
        })
    } else {
        return ['vue-style-loader'].concat(loaders)
    }
  }

  return {
    css: generateLoaders(),
    postcss: generateLoaders(),
    less: generateLoaders('less'),
    sass: generateSassResourceLoader(),  //更改為generateSassResourceLoader
    scss: generateSassResourceLoader(),  //更改為generateSassResourceLoader
    stylus: generateLoaders('stylus'),
    styl: generateLoaders('stylus')
  }
}

  之所以不在vue文件中引用變量和混合器文件,是由於變量作用域的問題,需要在用到的vue組件中進行引用,這樣會造成到生成代碼的冗余。

  而不把common.scss放到utils中,是因為utils中的引入與手動import無差異,會造成生成代碼的冗余

  so,common.js在app.vue中引入,變量等在utils中引入

 


參考文章與資料:

https://www.jianshu.com/p/bb1cedade712

https://www.cnblogs.com/roashley/p/7731865.html

https://www.cnblogs.com/chenguangliang/p/9540518.html

https://www.jianshu.com/p/5c3d457fbec9

https://blog.csdn.net/zhouzuoluo/article/details/81010331

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM