k韶华 2019-06-21
sass是一种css预处理器,用专门的编程语言,进行网页样式设计,然后再编译成正常的CSS文件。Sass是CSS3的扩展,它增加了嵌套规则,变量,mixins,选择器继承等等。Sass生成格式良好的CSS,使样式表更易于组织和维护。
.sass和.scss区别:
.sass最初是为了配合haml而设计,所有有着和haml一样的缩进风格,从第三代开始,保留缩进风格,完全向下兼容普通的css代码。推荐使用.scss
compass 是一个开源的css创作框架(一个技术类库)。在sass基础上封装了一系列有用的模块和模板,补充sass的功能
推荐链接: sass中文网 | sass入门 | sass用法指南-阮一峰
ruby -v
。如安装成功会打印ruby版本号1.删除原gem源gem sources --remove https://rubygems.org/
2.添加国内淘宝源gem sources -a https://ruby.taobao.org/
3.打印是否替换成功gem sources -l
4.更换成功后打印如下:
*** CURRENT SOURCES *** https://ruby.taobao.org/
安装Sass和Compass
//安装如下(如mac安装遇到权限问题需加 sudo gem install sass) gem install sass gem install compass
sass常用更新、查看版本、sass命令帮助等命令:
//更新sass gem update sass //查看sass版本 sass -v //查看sass帮助 sass -h
sass编译有很多种方式,如命令行编译模式、sublime插件SASS-Build、编译软件koala、前端自动化软件codekit、Grunt打造前端自动化工作流grunt-sass、Gulp打造前端自动化工作流gulp-ruby-sass等。
//单文件转换命令 sass input.scss output.css //单文件监听命令 sass --watch input.scss:output.css //如果你有很多的sass文件的目录,你也可以告诉sass监听整个目录: sass --watch app/sass:public/stylesheets //编译格式 sass --watch input.scss:output.css --style compact //编译添加调试map sass --watch input.scss:output.css --sourcemap //选择编译格式并添加调试map sass --watch input.scss:output.css --style expanded --sourcemap //开启debug信息 sass --watch input.scss:output.css --debug-info
// 数字类型 $n1: 1.2; $n2: 12; $n3: 12px; // 字符串类型 $s1: content; $s2: 'content'; // bool类型 $true: true; $false: false; // Null 类型 $null: null; // color 类型 $c1: blue; $c2: #000; $c3: rbga(0,0,0,0.3); .#{$s1}{ @if $null == null { font-size: $n3 } }
sass的变量必须是$开头,后面紧跟变量名,而变量值和变量名之间就需要使用冒号(:)分隔开(就像CSS属性设置一样),如果值后面加上!default则表示默认值。
sass的默认变量仅需要在值后面加上!default即可。
sass的默认变量一般是用来设置默认值,然后根据需求来覆盖的,覆盖的方式也很简单,只需要在默认变量之前重新声明下变量即可
多值变量分为list类型和map类型,简单来说list类型有点像js中的数组,而map类型有点像js中的对象。
在{}内定义的变量,在{}外访问不到。如果需要在全局访问,需要在变量值后面加上!global即为全局变量。
一般我们定义的变量都为属性值,可直接使用,但是如果变量作为属性或在某些特殊情况下等则必须要以#{$variables}形式使用。
未编译样式 Scss
body { $c_blue: blue; header { // 局部变量 $c_red: red; // 全局变量 $c_yellow: yellow !global; color: $c_red; // 默认变量 $fz: 14px; $fz: 12px !default; font-size: $fz; // 多值变量 $padding: 2px 4px 6px 8px; // 类似数组 padding: $padding; padding-left: nth($padding, 1); // 下标从1开始 $maps: (color:red, fz: 13px); // 类似json background: map-get($maps, color); // 特殊变量 $display: disp; .#{$display}{ width: 10px; height: 10px; } } footer { color: $c_blue; color: $c_yellow; // color: $c_red; // Undefined variable: "$color". } }
编译后样式 Css
body header { color: red; font-size: 14px; padding: 2px 4px 6px 8px; padding-left: 2px; background: red; } body header .disp { width: 10px; height: 10px; } body footer { color: blue; color: yellow; } /*# sourceMappingURL=test.css.map */
sass的导入(@import)规则和CSS的有所不同,编译时会将@import的scss文件合并进来只生成一个CSS文件。
如果在sass文件中导入css文件如@import 'reset.css
',那效果跟普通CSS导入样式文件一样,导入的css文件不会合并到编译后的文件中,而是以@import方式存在。
以下为原生css导入:
@import '***.css'
@import 'http://***'
@import
url(*.css)所有的sass导入文件都可以忽略后缀名.scss。一般来说基础的文件命名方法以_开头,如_mixin.scss。这种文件在导入的时候可以不写下划线,可写成@import "mixin"
。
选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性。
&表示父元素选择器,常用 &:hover
.container { h1, h2, h3 {margin-bottom: .8em} }
article > section { border: 1px solid #ccc }
header + p { font-size: 1.1em }
article ~ article { border-top: 1px dashed #ccc }
属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头。
border后面必须加上冒号。
未编译样式 Scss
body { header { border: { color: red; radius: 5px; } a { text-align: center; &:hover { text-align: left; } @at-root .content { width: 100px; } } } } @media screen and (max-width:520px){ @at-root (without:media rule){ .content { height: 200px; } } } @at-root .text-info { color: red; @at-root nav &{ color: blue; } }
编译后样式 Css
body header { border-color: red; border-radius: 5px; } body header a { text-align: center; } body header a:hover { text-align: left; } .content { width: 100px; } .content { height: 200px; } .text-info { color: red; } nav .text-info { color: blue; }
选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词@extend,后面紧跟需要继承的选择器。
一个选择器中有多个继承
.b 继承.a, .c 继承.b ...
不支持包含选择器(.a .b),相邻兄弟选择器(.a + .b)
a如果有:hover ,hover状态也被继承
如果不调用则不会有任何多余的css文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了@extend去继承相应的样式,都会解析出来所有的样式。占位选择器以%标识定义,通过@extend调用。
未编译样式 Scss
.header { background: blue; } .footer { font-size: 12px; } .sidebar { width: 12px } .content { height: 13px } // 多继承 .content-header { @extend .header; @extend .footer; @extend .sidebar, .content; color: red; } // 链式继承 .a { width: 12px } .b { @extend .a; height: 13px; } .c { @extend .b; border: 2px; } // 占位选择器 % %d { width: 12px } .e { @extend %d; height: 13px }
编译后样式 Css
.header, .content-header { background: blue; } .footer, .content-header { font-size: 12px; } .sidebar, .content-header { width: 12px; } .content, .content-header { height: 13px; } .content-header { color: red; } .a, .b, .c { width: 12px; } .b, .c { height: 13px; } .c { border: 2px; } .e { width: 12px; } .e { height: 13px; }
sass中使用@mixin声明混合,可以传递参数,参数名以$符号开始,多个参数以逗号分开,也可以给参数设置默认值。声明的@mixin通过@include来调用。
混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。
//sass style //------------------------------- @mixin content { margin-left:auto; margin-right:auto; } .demo{ @include content; } //css style //------------------------------- .demo{ margin-left:auto; margin-right:auto; }
@mixin cont($fz: 14px){ font-size: $fz; } body { @include cont(12px) }
调用时可直接传入值,如@include传入参数的个数小于@mixin定义参数的个数,则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。除此之外还可以选择性的传入参数,使用参数名与值同时传入。
@mixin cont($color: red,$fz: 14px){ color: $color; font-size: $fz; } body { @include cont($fz: 12px) }
如果一个参数可以有多组值,如box-shadow、transition等,那么参数则需要在变量后加三个点表示,如$shadow...
@mixin box-shadow($shadow...){ -moz-box-shadow: $shadow; -webkit-box-shadow: $shadow; box-shadow: $shadow; } .shadow{ @include box-shadow(0px 2px 3px #ccc, 4px 5px 6px #f2f) }
可以用来解决css3的@media等带来的问题。它可以使@mixin接受一整块样式,接受的样式从@content开始。
@mixin style-for-iphone { @media only screen and (min-device-width: 320px) and (max-device-width: 568px){ @content; } } @include style-for-iphone{ font-size: 12px; }