sass学习

Sass 可以通过以下三种方式使用:作为命令行工具;作为独立的 Ruby 模块 (Ruby module);或者作为 Rack-enabled 框架的插件(例如 Ruby on Rails 与 Merb)。

1.安装

ruby安装

由于SASS是在Ruby环境下运行,所以首先需要在自己的电脑上安装Ruby。

1.在Mac系统下,Ruby一般已内置在其中,查看是否安装:ruby -v

2.在windows系统下,先到官网下载个ruby
在安装的时候,请勾选Add Ruby executables to your PATH这个选项,添加环境变量,不然以后使用编译软件的时候会提示找不到ruby环境


sass安装

1.标准稳定版安装(推荐!!!)

  1. gem install sass

有的时候在LinuxOS X系统下,可能需要超级管理员权限才能安装:

  1. sudo gem install sass

2.Beat版本安装 ( 若想要获取SASS的一些最新变化和最新功能,安装一个Beat版本的SASS,会自动创建每次更改的主分支 )

  1. gem install sass --pre

3.从Git库中安装

  1. git clone git://github.com/nex3/sass.git
  2. cd sass
  3. rake install

Windows系统下安装SASS,可以点击这里

查看你安装的sass:sass -v


安装sass库

1.安装Compass

Compass是一个非常成熟的SASS库,可是一个很强大的框架,使用的频率也相当的高。如果您了解了Compass,那么他将会让你受益无穷。同样的,在你的项目中使用Compass,需要先安装Compass。

  1. gem install compass

2.安装Bourbon

  1. gem install bourbon

2.创建第一个sass项目

mySass

sass ==> 新建style.scss/style.sass

css <== 编译后的style.css文件

sass有两种后缀名文件:一种后缀名为.sass,不使用大括号和分号;另一种就是.scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号。

注:建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错。任何一种格式都可以直接导入(@import)到另一种格式之中使用,或者通过sass-convert命令工具转换格式:

  1. //sass To scss
  2. sass-convert style.sass style.scss;
  3. //scss To sass
  4. sass-convert style.scss style.sass;

Sass 还会自动缓存编译后的模板,这样做能够显著提升重新编译的速度,尤其在处理由 @import 导入多个子文件的大型项目时。单独使用 Sass,缓存内容保存在 .sass-cache 文件夹中。


3.sass语法

1.变量:sass允许使用变量,所有变量以$开头

  1. $blue : #1875e7;
  2. div {
  3. color : $blue;
  4. }

一个变量含有多个值,如$i : 12px 15px 16px 14px
取第index个值时nth($i,index)

如果变量需要镶嵌在字符串之中,就必须写在#{}之中。

  1. $side : left;
  2. .rounded{
  3. border-#{$side}-radius : 5px;
  4. }

普通(局部)变量:用$base:1.6 !global可以将局部变量转为全局变量

默认(全局)变量:用$base:1.6 !default声明为全局变量

注意:

  • 变量<font color="red">声明顺序</font>问题:必须在调用变量语句的上面,这样才能正确的调用变量。

  • 变量有<font color="red">作用域</font>的问题(全局变量、局部变量):代码段a内不可引用代码段b内定义的局部变量。

  • 变量<font color="red">重名</font>问题:3.4版本中无重名问题,但是早期的版本中如果我们在本地重新定义了一个全局变量,这将是新的全局变量。所以,在我们的示例中编译样式时取决于我们声明的变量的顺序和mixin的顺序。

2.计算功能:sass允许在代码中使用算式(运算的时候,会以空格作为分割,会操作相邻的两个数值)

  1. $a : 100px;
  2. body{
  3. padding-top : (14px / 2); //7px
  4. margin : 3px + 4px auto; //7px auto
  5. top : 50px + 100px; //150px
  6. right : $a * 10%; //10px
  7. }

a).sass中的加法
加法运算还可以做字符串拼接功能,如:

  1. p {
  2. cursor: e + -resize;
  3. }

输出为:p { cursor: e-resize; }

加法连接字符串时,对于引号的合并也有一定规则,如果前面字符串带有引号,后面字符串会自动包含在引号中,如果前面没有,后面带有引号的字符串也会去掉引号:

  1. p:before {
  2. content: "Foo " + Bar;
  3. font-family: sans- + "serif";
  4. }

输出为:

  1. p:before {
  2. content: "Foo Bar";
  3. font-family: sans-serif;
  4. }

如果在字符串中计算并输出,需要用到#{},例如:

  1. $w : 10;
  2. p:before{
  3. content : "I ate #{5 + $w} pies!";
  4. }

输出为:

  1. p:before{
  2. content : "I ate 15 pies!"
  3. }

b).sass中的除法

  1. p {
  2. font: 10px/8px; // 纯 CSS 不会运算
  3. $width: 1000px;
  4. width: $width/2; // 使用变量,执行运算
  5. width: round(1.5)/2; // 使用函数返回值,执行运算
  6. height: (500px/2); // 使用括号包裹,执行运算
  7. margin-left: 5px + 8px/2px; // 用了加法,作为表达式的一部分,执行运算
  8. }

编译后输出为:

  1. p {
  2. font: 10px/8px;
  3. width: 500px;
  4. height: 250px;
  5. margin-left: 9px;
  6. }

<mark>注意事项:</mark>

*建议运算符之间空开一个空格。

*注意运算单位。单位也会参与运算。

  • 加法:都没有单位输出纯数字;一方有单位,则结果输出该单位;两方相同单位,结果输出该单位;双方单位不同,如果能换算换算为前一个进行运算,单位为前者,如果不能则报错。

  • 减法:类似加法。

  • 除法:两方相同单位,结果无单位;都没有单位,结果无单位;一方有单位另一方无单位,报错。

  • 乘法:两方相同单位,报错;一方有单位,结果输出该单位;两方都无单位,输出无单位。

Tips:颜色的计算为分段计算,如:.main-col{ color: #106021 + #023212; }结果为:.main-col{color : #129233};
计算方法:10+02=12 、60+32=92 、21+12=33 ==>129233

3.嵌套:sass允许选择器嵌套

如,原始css方式:

  1. div{
  2. background : blue;
  3. }
  4. div h1{
  5. color : red;
  6. }

sass支持如下写法:

  1. div{
  2. background : blue;
  3. h1{
  4. color : red;
  5. }
  6. }

属性也可以嵌套。比如border-color,可以写成:

  1. p{
  2. border : {
  3. color : red;
  4. }
  5. }

<mark>注意:border后面必须加上冒号</mark>

我们也需要在嵌套结构中引用父级选择器,这时候就可以用 & 符号代替父级选择器。比如a:hover伪类,可以写成:

  1. a {
  2. &:hover { color: #ffb3ff; }
  3. }

4.导入:sass中如导入其他sass文件,最后编译为一个css文件,优于纯css的@import

@import命令,用来插入外部文件,注意默认无后缀名时是引入.sass.scss文件。

  1. @import "path/fileName";

导入Sass但不输出Css--局部文件:那些专门为 @import 命令而写的 Sass 文件,并不需要生成对应的独立 CSS 文件,这样的 Sass 文件被称为局部文件。对此,Sass约定局部文件的文件名以下划线 _ 开头。这样,Sass 就不会在编译时单独编译这个文件输出 CSS 了,而仅仅是把这个文件作为导入用途。Sass 更高效的地方在于,导入这样的文件时,我们还可以省略文件名中开头的下划线 _,例如,我们需要导入文件 themes/_night-sky.scss,我们可以仅仅写

  1. @import "/themes/_night-sky";

以下几种情况插入的是.css文件,则等同于css的import命令。

  1. @import "foo.css" //后缀名为.css
  2. @import "css/style.css" // 被导入文件的名字是 CSS 的 url() 值
  3. @import "url(.....)" //被导入文件是一个 URL 地址形式给出的

和css中@import的区别:

  • css中用到了再去下载,而sass编译时直接导入到当前文件

  • sass中导入可省略后缀名,默认为.sass格式或者.scss格式

5.扩展/继承(@extend):

sass允许一个选择器,继承另一个选择器。如,class2继承class1的属性:

  1. .class1{
  2. border : 1px solid #ddd;
  3. }
  4. .class2{
  5. @extend .class1;
  6. font-size : 12px;
  7. }

按需求输出的@extend,带有 % 符号的选择器不会被编译输出,但是可以被 @extend 到,替换之后输出,例如:

  1. #context a %extreme {
  2. color: blue;
  3. font-weight: bold;
  4. font-size: 2em;
  5. }
  6. .notice {
  7. @extend %extreme;
  8. }
  9. #context .title .notice2 {
  10. @extend %extreme;
  11. }

会输出:

  1. #context a .notice,
  2. #context a .title .notice2,
  3. #context .title a .notice2 {
  4. color: blue;
  5. font-weight: bold;
  6. font-size: 2em;
  7. }

6.Mixin:Mixin是可以重用的代码块。

a).基础用法

  1. @mixin left{
  2. float : left;
  3. margin-left : 10x;
  4. }
  5. //使用@include命令,调用这个mixin
  6. div{
  7. @include left;
  8. }

输出:

  1. div{
  2. float : left;
  3. margin-left : 10px;
  4. }

b).传递参数

  1. @mixin font($color, $fontSize: 14px) {
  2. color: $color;
  3. font-size: $fontSize;
  4. }
  5. p { @include font(blue); }
  6. h1 { @include font(blue, 20px); }
  7. h2 { @include font($fontSize: 18px,$color: red); }

输出:

  1. p {
  2. color: blue;
  3. font-size: 14px;
  4. }
  5. h1 {
  6. color: blue;
  7. font-size: 20px;
  8. }
  9. h2 {
  10. color: red;
  11. font-size: 18px;
  12. }

c).@mixin 传递多值参数

  1. @mixin box-shadow($shadows...) {
  2. -moz-box-shadow: $shadows;
  3. -webkit-box-shadow: $shadows;
  4. box-shadow: $shadows;
  5. }
  6. .shadows {
  7. @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
  8. }

输出:

  1. .shadows {
  2. -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  3. -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  4. box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  5. }

此外,多值参数还可以用在 @include 传參的时候,分解某个变量值,例如:

  1. @mixin colors($text, $background, $border) {
  2. color: $text;
  3. background-color: $background;
  4. border-color: $border;
  5. }
  6. $values: #ff0000, #00ff00, #0000ff;
  7. .primary {
  8. @include colors($values...);
  9. }
  10. $value-map: (text: #00ff00, background: #0000ff, border: #ff0000);
  11. .secondary {
  12. @include colors($value-map...);
  13. }

输出:

  1. .primary {
  2. color: red;
  3. background-color: lime;
  4. border-color: blue;
  5. }
  6. .secondary {
  7. color: lime;
  8. background-color: blue;
  9. border-color: red;
  10. }

d).向 @mixin 传递内容

定义的一个选择器或者一段代码片段,在其中添加了 @content 这个命令。当使用 @include 命令使用这条 mixin 的时候,将一段内容包裹了起来,这段被包裹的内容就会替换掉 @mixin 中的 @content。

  1. @mixin apply-to-iphone5 {
  2. @media only screen
  3. and (min-device-width : 320px)
  4. and (max-device-width : 568px) {
  5. @content;
  6. }
  7. }
  8. @include apply-to-iphone5 {
  9. #logo {
  10. background-image: url(/logo@2x.gif);
  11. }
  12. }

输出:

  1. @media only screen and (min-device-width: 320px) and (max-device-width: 568px) {
  2. #logo {
  3. background-image: url(/logo@2x.gif);
  4. }
  5. }

@mixin@extend的区别:

@mixin 定义的是一个片段,这个片段可以是类似变量的一段文字一条属性,也可以是一整个选择器和内容,也可以是一个选择器的一部分 CSS 代码。此外还可以传递参数,通过参数生成不同代码。它需要配合 @inclde 命令来引用这段代码,类似复制的效果。@mixin 定义的内容,不会编译输出。

@extend 就是简单的扩展,基于某个选择器,将其他类似需求的选择器挂靠上,以提高复用程度

7.流程控制语句(@if、@for、@each、@while)

a.)if判断

  1. p {
  2. @if 1 + 1 == 2 {
  3. width:30px;
  4. }@else {
  5. width:100px;
  6. }
  7. }

编译结果为p { width: 30px; } ;
这是半透明rgba背景的一段代码,高级浏览器用rgba,ie6-8如果开启滤镜用滤镜,不开启滤镜就用纯色,常用于图片下方浮现标题。至于多条件的,可以参考sass揭秘之@mixin,%,@function里面的神来之笔的@mixin prefixer

  1. $filter:false !default; //是否开启ie滤镜
  2. //背景色半透明
  3. @mixin bgcolor-alpha($bgcolor: rgba(0,0,0,.5)){
  4. color:#fff;
  5. @if $filter{
  6. filter:progid:DXImageTransform.Microsoft.gradient(enabled='true',startColorstr='#{ie-hex-str($bgcolor)}', endColorstr='#{ie-hex-str($bgcolor)}');
  7. }@else{
  8. background-color: #333;
  9. }
  10. background-color:$bgcolor;
  11. }

and,or,not分别表示与、或、非(@if not($a)、@if $a or $b)

==等于,!=不等于(@if $a != $b)

b).@forfor循环有两种形式,分别为:@for $var from through 和@for $var from to $i表示变量,start表示起始值,end表示结束值,这两个的区别是关键字through表示包括end这个数,而to则不包括end这个数。

  1. $gridColumns: 5 !default;
  2. $gridcolumnWidth: 60px !default;
  3. $gridGutter: 20px !default;
  4. %span-base{
  5. float:left;
  6. margin-left:$gridGutter / 2;
  7. margin-right:$gridGutter / 2;
  8. }
  9. @for $i from 1 through $gridColumns {
  10. .span#{$i} {
  11. @extend %span-base;
  12. width:($gridcolumnWidth + $gridGutter) * $i - $gridGutter;
  13. }
  14. }

输出为:

  1. .span1, .span2, .span3, .span4, .span5{
  2. float: left;
  3. margin-left: 10px;
  4. margin-right: 10px;
  5. }
  6. .span1 {
  7. width: 60px;
  8. }
  9. .span2 {
  10. width: 140px;
  11. }
  12. .span3 {
  13. width: 220px;
  14. }
  15. .span4 {
  16. width: 300px;
  17. }
  18. .span5 {
  19. width: 380px;
  20. }

c).@while@while 和 @for 命令是非常接近的,只不过 @while 循环可以自己定义步长,多次输出,直到该语句的嵌套样式的计算结果为false,如:

  1. $i: 6;
  2. @while $i > 0 {
  3. .item-#{$i} { width: 2em * $i; }
  4. $i: $i - 2;
  5. }

输出为:

  1. .item-6 {
  2. width: 12em; }
  3. .item-4 {
  4. width: 8em; }
  5. .item-2 {
  6. width: 4em; }

d).@each语法:@each $var in

  1. $sprite: puma sea-slug egret salamander !default;
  2. %sprite-animal{
  3. background: url('/images/animal.png') no-repeat;
  4. }
  5. @each $animal in $sprite {
  6. .#{$animal}-icon {
  7. @extend %sprite-animal;
  8. background-position:0 -(index($sprite,$animal)*30px);
  9. }
  10. }

输出为:

  1. .puma-icon, .sea-slug-icon, .egret-icon, .salamander-icon {
  2. background: url("/images/animal.png") no-repeat;
  3. }
  4. .puma-icon {
  5. background-position: -30px;
  6. }
  7. .sea-slug-icon {
  8. background-position: -60px;
  9. }
  10. .egret-icon {
  11. background-position: -90px;
  12. }
  13. .salamander-icon {
  14. background-position: -120px;
  15. }

8.自定义函数

SASS允许用户编写自己的函数。

  1. @function double($n) {
  2.     @return $n * 2;
  3.   }
  4.   #sidebar {
  5.     width: double(5px);
  6.   }

9.常用颜色函数

a).RGB 颜色只是颜色中的一种表达式,其中 R 是 red 表示红色,G 是 green 表示绿色而 B 是 blue 表示蓝色。在 Sass 中为 RGB 颜色提供六种函数:

  • rgb($red,$green,$blue):根据红、绿、蓝三个值创建一个颜色;

  • rgba($red,$green,$blue,$alpha):根据红、绿、蓝和透明度值创建一个颜色;
    rgba($color,$alpha):根据颜色和透明度值创造一个颜色

  • red($color):从一个颜色中获取其中红色值;

  • green($color):从一个颜色中获取其中绿色值;

  • blue($color):从一个颜色中获取其中蓝色值;

  • mix($color-1,$color-2,[$weight]):把两种颜色混合根据混合比例混合在一起,默认值50%。

b).lighten()darken()函数

lighten()darken()两个函数都是围绕颜色的亮度值做调整的,其中lighten()函数会让颜色变得更亮,与之相反的darken()函数会让颜色变得更暗。这个亮度值可以是0~1之间,不过常用的一般都在3%~20%之间。

  1. $baseColor: #ad141e;
  2. .lighten {
  3. background: lighten($baseColor,10%);
  4. }
  5. .darken{
  6. background: darken($baseColor,10%);
  7. }

c).ie-hex-str()函数

这个函数常配合IE滤镜使用,主要用来转译出适合IE滤镜的颜色代码,如:

  1. ie-hex-str(#abc) // "#FFAABBCC"
  2. ie-hex-str(#3322BB) // "#FF3322BB"
  3. ie-hex-str(rgba(0, 255, 0, 0.5)) // "#8000FF00"

10.注释

  • 标准的CSS注释 /*comment*/,会保留到编译后的文件。

  • 单行注释 //comment,只保留在sass源文件中,编译后被省略。

  • 重要注释 /*!comment*/,即使压缩模式编译,也会保留这行注释,通常可以用于声明版权信息。


4.sass转译

1.单文件转译

转译命令:

  1. sass sass/style.scss css/style.css

动态监听转译

使用sass转译.scss文件,有一个不足之处,就是我们修改了.scss文件,不会自动转译。这样一来,我们要时时查看转译出来的CSS样式就比较麻烦。那么我们只需要在sass命令的基础上添加一个参数--watch就可以。

  1. sass --watch sass/style.scss:css/style.css

这样一来,你可以看到提示:

  1. >>> Sass is watching for changes. Press Ctrl-C to stop.
  2. overwrite sass/style.css

2.多文件转译

虽然sasssass --watch都达到我们转译.scss文件功能,但在实际项目中,我们的项目中不可能只存有一个.scss文件。所以我们需要一种方法,可以<font color="red">同时将多个.scss文件转译成.css文件。</font>其实在SASS中,可以直接将整个目录中的所有.scss文件转译成所有的.css文件,并放到另一个CSS目录中,其命令如下所示:

  1. sass --watch sass/:css/

这样一来,只要是sass中所有的.scss文件都可以转译成.css文件,并且都放在了css目录中

<mark>特别强调:</mark>如果使用sass --watch转译.scss样式,首先需要安装rb-fsevent,如果没有安装就执行sass --watch将无法执行时时监控.scss转译成.css。安装方法:


  1. gem install --version `~>0.9` rb-fsevent

3.sass的四种编译风格(输出格式)

  • nested:嵌套缩进的css代码,它是默认值。

  • expanded:没有缩进的、扩展的css代码。

  • compact:简洁格式的css代码。

  • compressed:压缩后的css代码。

<mark>生产环境中一般使用最后一个选项</mark>

  1. sass --style compressed sass/style.scss css/style.css

4.css转译为sass

  1. sass-convert css/style.css sass/style.scss

参考资料:

Sass 安装到使用的更多相关文章

  1. sass 安装、配置,css规则

    http://blog.csdn.net/oyuemijindu/article/details/51036096 --sass 安装 一安装  1.ruby下载,可以到官网下载 ,注意如果是系统如果 ...

  2. Sass安装(windows版)

    Sass安装(windows版) 在 Windows 平台下安装 Ruby 需要先有 Ruby 安装包,大家可以到 Ruby 的官网(http://rubyinstaller.org/download ...

  3. win下sass安装失败的一种可能

    首先声明,本篇转自CSDN的LZGS_4. 今天我也遇到这个问题,就把文章擅自转载了,方便自己也方便更多的人吧. 因为sass和compass依赖于ruby环境,所以装之前先确认装了ruby.可到官网 ...

  4. windows下sass安装 以及一些要注意的问题

    都说sass 环境难配其时也没那么难 按照以下步骤一下一下来还是挺快的 如果你是喜欢less 那就当我没说 233333 1.sass 是基于ruby这门语言的需要使用 rubygem这个包管理器安装 ...

  5. sass安装 使用

    一 什么是sass      sass是一种css开发工具.提供了很多便利的写法,使得css开发变得简单  易维护       sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号:另一 ...

  6. SASS安装的那些事

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  7. sass安装及使用

    在Mac系统下,Ruby一般已内置在其中,如果您不能确认是否已安装,或者说你不知道你的Ruby使用的版本,你可以打开你的命令工具: $ ruby -v 安装sass 在大多数情况和大部分人群中,还是喜 ...

  8. lnmp git ruby sass 安装

    1 cd .. 2 ls 3 cd mzx/ 4 ls 5 cd 桌面 6 cd lnmp1.4-full/ //到lnmp 的官网上下载后,根据官网的提示来安装lump 7 ls 8 install ...

  9. sass学习之一:sass安装compass部署

    主要参考 http://www.jianshu.com/p/5bfc9411f58f -------------------------------------------- sass基于ruby 需 ...

  10. sass安装方法,绝对好用的方式

    系统重做了,很多东西都重装,sass也一样,结果在安装的过程中遇到了问题,这里记录下,也给同样遇到问题的朋友们一个思路.本方法是参照http://www.w3cplus.com/sassguide/i ...

随机推荐

  1. Codeforces1304F.Animal Observation

    分析一下得知是DP问题,时间复杂度符合,设dp[i][j]为从第i天开始,第j个位置能得到的最大值,其有三种转移状态 1.与上一天的选择有重合 2.与上一天的选择没有重合,且上一天的选择在左边 3.与 ...

  2. 题解 JSOI2010 找零钱的洁癖

    题解 JSOI2010 找零钱的洁癖 题面 BZOJ 个人体会 van全没有思路... 只能去看题解... 还是个bfs+贪心 不管怎样竟然乱搞过了... 听M_sea小姐姐说她有更正经的做法(线性规 ...

  3. 你知道Verilog HDL程序是如何构成的吗

    本节通过硬件描述语言Verilog HDL对二十进制编码器的描述,介绍Verilog HDL程序的基本结构及特点. 二十进制编码器及Verilog HDL描述 二十进制编码器是数字电路中常用的电路单元 ...

  4. python 网络爬虫(二)

    一.编写第一个网络爬虫 为了抓取网站,我们需要下载含有感兴趣的网页,该过程一般被称为爬取(crawling).爬取一个网站有多种方法,而选择哪种方法更加合适,则取决于目标网站的结构. 首先探讨如何安全 ...

  5. Java并发编程:Java内存模型JMM

    简介 Java内存模型英文叫做(Java Memory Model),简称为JMM.Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性. CPU和缓存一 ...

  6. zabbix开启对中文的支持--&&--中文乱码解决方法

    zabbix不支持中文图 开启zabbix对中文的支持 原来zabbix默认把对中文的支持给关闭了,我们需要修改zabbix的php源文件. 修改站点根目录下include/locales.inc.p ...

  7. ionic3记录之栅格布局使文字居中

    { display:flex; align-items:center; } 未完待续...

  8. ubuntu用命令行打开vscode

    1.打开终端 2.输入code即可

  9. JS截取腾讯视频和去除视频广告

    一:腾讯视频截取 H5视频播放除了video标签以外,还有iframe嵌套视频 项目需求是用户输入腾讯视频的html链接,如 https://v.qq.com/x/page/y0116k2vspw.h ...

  10. Linux CentOS7 VMware find命令、文件名后缀

    一.find命令 Linux系统中的 find 命令在查找文件时非常有用而且方便.它可以根据不同的条件来查找文件,例如权限.拥有者.修改日期/时间.文件大小等等.在这篇文章中,我们将学习如何使用 fi ...