全局安装css
npm install sass -g
编译html
watch 单一文件web
sass watch scss/app.scss css/app.css
watch 整个文件夹npm
sass watch scss:css
注意中间有个冒号!!!sass
你能够建立一些只包含不多的代码片断的partial Sass files,而后能够把它们 import 到其余 Sass文件中。这种方式能够很好地模块化你的 CSS, 便于之后维护。一个 partial Sass 文件命名一般如下划线开头,好比 _partial.scss
.bash
这样命名的好处是:Sass 会知道这是一个 partial 文件,它须要被import到其余文件中,在编译时,不会单独编译它。app
例如:定义了如下 partial 文件,并在 app.scss 中引入。模块化
// app.scss // IMPORT ALL SASS DIRECTORY FILES @import '0-plugins/_plugins-dir'; @import '1-base/_base-dir'; @import '2-layouts/_layouts-dir'; @import '3-modules/_modules-dir'
在 import 文件时,并不须要包含文件的扩展名.scss
不须要写。函数
当watch整个文件夹,在terminal敲入插件
sass --watch scss:css
会发现,Sass只编译了 app.scss
这是咱们想要的结果,不会编译其余多余的partial 文件。若是命名不是如下划线开始,全部文件都会编译了。就会变成这样:
另外,在 app.scss 中 import partial 文件时,能够不加下划线。
// IMPORT ALL SASS DIRECTORY FILES @import '0-plugins/plugins-dir'; @import '1-base/base-dir'; @import '2-layouts/layouts-dir'; @import '3-modules/modules-dir'
编译是没有问题的。
关于如何组织Sass文件的结构
推荐的 是SMACSS,一本书《Scalabel and Modular Architectrue for CSS》,介绍了模块化CSS的一些规则和建议。
能够在线阅读和下载。
变量能够帮助咱们保存一些想要重复使用的信息,好比 colors, font stacks, padding的值等等。 Sass 使用 $
来识别一个变量名.
// _box.scss // VARIABLES $base-color: yellow; .box { height: 100px; width: 100px; background-color: $base-color; }
//_base.scss // VARIABLES $font-stack-serif: Georgia, Times, serif; $font-stack-sans-serif: Helvetica, Arial, sans-serif; body { background: orangered; color: white; } h1 { font-family: $font-stack-serif; } h2, h3 { font-family: $font-stack-sans-serif; }
若是咱们在不一样的 scss 文件中都定义了本身的变量,会显得很乱,也不便于之后维护。
推荐的作法是,定义一个全局的_variables.scss
文件,将全部的变量放在这里。
// GLOBAL VARIABLES $brand-color:pink; $base-color: yellow; $base-font-color: white; $font-stack-serif: Georgia, Times, serif; $font-stack-sans-serif: Helvetica, Arial, sans-serif; $font-size-base: 18px;
而后在 app.scss 的第一行引入它。
// app.scss // IMPORT ALL SASS DIRECTORY FILES @import 'variables'; @import '0-plugins/plugins-dir'; @import '1-base/base-dir'; @import '2-layouts/layouts-dir'; @import '3-modules/modules-dir'
在其余文件中使用变量。
// _base.scss body { background: $brand-color; color: $base-font-color; font-size: $font-size-base; } h1 { font-family: $font-stack-serif; } h2, h3 { font-family: $font-stack-sans-serif; }
mixin 是用来解决重复代码的,比较像没有返回值的函数,能够传入参数。
官网示范的一个用法是,解决CSS3属性的不一样vender prefies的问题。其实,任何你须要reuse的代码,均可以使用mixin。
在CSS3的一些属性中,有些属性因为不一样 vender prefixes的存在,变得很是冗长,例如 transform
box-shadow
border-radius
等等。
.box { -webkit-transform: rotate(30deg); -ms-transform: rotate(30deg); transform: rotate(30deg); }
rotate(30deg) 写了3遍。
使用 mixin 能够解决这个问题,由于 mixin 能够像函数同样传入参数。
@mixin transform($property) { -webkit-transform: $property; -ms-transform: $property; transform: $property; } .box { @include transform(rotate(30deg)); }
在Angular中,编译器会自动加上vender prefixes,因此在写scss时,能够不加这些prefixes。
再复杂一点:
// _box.scss .box { height: 100px; width: 100px; display: inline-block; -webkit-border-radius: 100%; -moz-border-radius: 100%; border-radius: 100%; -webkit-box-shadow: 0 5px 10px #555; -moz-box-shadow: 0 5px 10px #555; box-shadow: 0 5px 10px #555; background: orangered; background: -webkit-linear-gradient(orangered, yellow); background: -o-linear-gradient(orangered, yellow); background: -moz-linear-gradient(orangered, yellow); background: linear-gradient(orangered, yellow); }
为了保持各个module的清爽,新建一个文件_mixins.scss
来设置全局的mixins。在 app.scss 中导入它。
// app.scss @import 'variables'; @import 'mixins'; @import '0-plugins/plugins-dir'; @import '1-base/base-dir'; @import '2-layouts/layouts-dir'; @import '3-modules/modules-dir'
定义mixin
// _mixins.scss // GLOBAL MIXINS @mixin box($radius, $shadowColor, $gradientColor1, $gradientColor2) { -webkit-border-radius: $radius; -moz-border-radius: $radius; border-radius: $radius; -webkit-box-shadow: 0 5px 10px $shadowColor; -moz-box-shadow: 0 5px 10px $shadowColor; box-shadow: 0 5px 10px $shadowColor; background: $gradientColor1; background: -webkit-linear-gradient($gradientColor1, $gradientColor2); background: -o-linear-gradient($gradientColor1, $gradientColor2); background: -moz-linear-gradient($gradientColor1, $gradientColor2); background: linear-gradient($gradientColor1, $gradientColor2); }
在 _box.scss 中使用
// BOX .box { height: 100px; width: 100px; display: inline-block; @include box(100%, #555, orangered, yellow); }
这样能够传入不一样的参数来实现不一样的box啦。
#box2 { @include box(20px, #000, #639, #fc3); } #box3 { @include box(5px, #ddd, black, teal); }
消除了不少重复性代码。
Bourbon is a lightweight Sass tool set
https://www.bourbon.io/
若是不知道怎么组织本身的mixin,能够参考它的写法。
例如 clearfix
@mixin clearfix { &::after { clear: both; content: ""; display: block; } }
使用:
.element { @include clearfix; }
Sass的这一特性依然是为了遵循Dry principle
,减小重复代码。你可使用 @extend
来共享属性。
好比,咱们要建立一个message module,它有3个状态,success、warning和error。
// index.html <body> <div class="message success"></div> <div class="message warning"></div> <div class="message error"></div> </body>
咱们可使用嵌套,将样式定义成这样:
// _message.scss .message { width: 100%; height: 50px; background: #000; margin: 10px auto; &.success { background: green; } &.warning { background: orange; } &.error { background: red; } }
还可使用extend来共享属性。
%message { width: 100%; height: 50px; background: #000; margin: 10px auto; } .success { @extend %message; background: green; } .warning { @extend %message; background: orange; } .error { @extend %message; background: red; }
html中不须要再加message class,更加简洁。
<body> <div class="success"></div> <div class="warning"></div> <div class="error"></div> </body>
Sass提供了能够保存键值对的Maps结构。
$map: (key1: value1, key2: value2, key3: value3);
例如,咱们在scss中会定义不少颜色值,通常使用变量就能够了。
$primary-color: #005DFF; $accent-color: #FFF6BB; $border-color: #ddd; // other variables body { background-color: $primary-color; color: $accenet-color; }
当还定义了其余不少变量后,就显得十分杂乱。能够单独将全部颜色值封装成一个Maps结构,再使用map-get($map,$key)
来获取值。
$colors: ( primary: #005DFF, accent: #FFF6BB, border: #ddd ); body { background-color: map-get($colors, primary); color: map-get($colors, accent); }
function是有返回值的,最后要加 @return
好比在上例中,为了获取颜色值,咱们会屡次使用map-get($map,$key)
,看起来代码很长,能够自定义一个获取颜色的function来reuse这段代码。
$colors: ( primary: #005DFF, accent: #FFF6BB, border: #ddd ); @function color($color-name) { @return map-get($colors, $color-name); } body { background-color: color(primary); color: color(accent); }