安装和使用

安装

  1. // 安装
  2. gem install sass
  3. gem install compass
  4. // 更新sass
  5. gem update sass
  6. // 查看sass版本
  7. sass -v
  8. // 查看compass版本
  9. compass -v
  10. //查看sass帮助
  11. sass -h

使用

编译sass

sass编译有很多种方式,如命令行编译模式、sublime插件SASS-Build、编译软件koala、前端自动化软件codekit、Grunt打造前端自动化工作流grunt-sass、Gulp打造前端自动化工作流gulp-ruby-sass等。

命令行编译;
  1. //单文件转换命令
  2. sass input.scss output.css
  3. //单文件监听命令
  4. sass --watch input.scss:output.css
  5. //如果你有很多的sass文件的目录,你也可以告诉sass监听整个目录:
  6. sass --watch app/sass:public/stylesheets

命令行编译配置选项;

命令行编译sass有配置选项,如编译过后css排版、生成调试map、开启debug信息等,可通过使用命令sass -v查看详细。我们一般常用两种--style``--sourcemap

  1. //编译格式
  2. sass --watch input.scss:output.css --style compact
  3. //编译添加调试map
  4. sass --watch input.scss:output.css --sourcemap
  5. //选择编译格式并添加调试map
  6. sass --watch input.scss:output.css --style expanded --sourcemap
  7. //开启debug信息
  8. sass --watch input.scss:output.css --debug-info
  • --style表示解析后的css是什么排版格式;
    sass内置有四种编译格式:nested``expanded``compact``compressed
  • --sourcemap表示开启sourcemap调试。开启sourcemap调试后,会生成一个后缀名为.css.map文件。

四种编译排版演示;
  1. //未编译样式
  2. .box {
  3. width: 300px;
  4. height: 400px;
  5. &-title {
  6. height: 30px;
  7. line-height: 30px;
  8. }
  9. }
  • nested 编译排版格式(很奇怪)
  1. /*命令行内容*/
  2. sass style.scss:style.css --style nested
  3. /*编译过后样式*/
  4. .box {
  5. width: 300px;
  6. height: 400px; }
  7. .box-title {
  8. height: 30px;
  9. line-height: 30px; }
  • expanded 编译排版格式(正常不压缩css)
  1. /*命令行内容*/
  2. sass style.scss:style.css --style expanded
  3. /*编译过后样式*/
  4. .box {
  5. width: 300px;
  6. height: 400px;
  7. }
  8. .box-title {
  9. height: 30px;
  10. line-height: 30px;
  11. }
  • compact 编译排版格式(行内元素感)
  1. /*命令行内容*/
  2. sass style.scss:style.css --style compact
  3. /*编译过后样式*/
  4. .box { width: 300px; height: 400px; }
  5. .box-title { height: 30px; line-height: 30px; }
  • compressed 编译排版格式(非常紧缩)
  1. /*命令行内容*/
  2. sass style.scss:style.css --style compressed
  3. /*编译过后样式*/
  4. .box{width:300px;height:400px}.box-title{height:30px;line-height:30px}

语法内容

css变量

基础语法

  • 声明
    • $ 开头,例如$color;
    • 中划线和下划线都支持,但指向的会是一个变量,$a-b等同于$a_b
    • 赋值支持所有css支持的类型;
  1. $color: #999;
  2. /* 现在$color这个变量的值为#999了 */
  • 使用
  1. background: $color;

默认变量值(!default)
  • 为了防止import进来的样式表覆盖别人已经命名好的变量,可以使用!default,这个标签的含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。

局部变量转换全局变量(!global)
  • 在变量的value后面追加!global,可以将块中的变量作用域转换为全局。

块状结构

选择器嵌套

  1. /* 在子块中中为父元素添加属性,使用&代指父元素 */
  2. .test {
  3. &:hover {
  4. color: $color;
  5. }
  6. }

元素嵌套

  1. /**
  2. * 元素子属性
  3. */
  4. nav {
  5. border: {
  6. style: solid;
  7. width: 1px;
  8. color: #ccc;
  9. }
  10. }
  11. /* 解析成↓ */
  12. nav {
  13. border-style: solid;
  14. border-width: 1px;
  15. border-color: #ccc;
  16. }
  17. /**
  18. * 元素缩写属性的例外情况
  19. */
  20. nav {
  21. border: 1px solid #ccc {
  22. left: 0px;
  23. right: 0px;
  24. }
  25. }
  26. /* 解析成↓ */
  27. nav {
  28. border: 1px solid #ccc;
  29. border-left: 0px;
  30. border-right: 0px;
  31. }

文件导入(@import)

与css的异同

  • css的import
    • 只有执行到@import时,浏览器才会去下载其他css文件,这导致页面加载起来特别慢。
  • sass的import
    • 在生成css文件时就把相关文件导入进来。这意味着所有相关的样式被归纳到了同一个css文件中,而无需发起额外的下载请求

局部文件

  • 当通过@importsass样式分散到多个文件时,你通常只想生成少数几个css文件。那些专门为@import命令而编写的sass文件,并不需要生成对应的独立css文件,这样的sass文件称为局部文件。对此,sass有一个特殊的约定来命名这些文件。
  • 此约定即,sass局部文件的文件名以下划线开头。这样,sass就不会在编译时单独编译这个文件输出css,而只把这个文件用作导入。当你@import一个局部文件时,还可以不写文件的全名,即省略文件名开头的下划线。举例来说,你想导入themes/_night-sky.scss这个局部文件里的变量,你只需在样式表中写@import "themes/night-sky";

嵌套导入

  • sass允许@import命令写在css规则内。这种导入方式下,生成对应的css文件时,局部文件会被直接插入到css规则内导入它的地方
  1. /* _blue-theme.scss */
  2. aside {
  3. background: blue;
  4. color: white;
  5. }
  6. /* 将这个文件导入到css中 */
  7. .blue-theme {@import "blue-theme"}
  8. /* 生成的结果跟你直接在.blue-theme选择器内写_blue-theme.scss文件的内容完全一样。*/
  9. .blue-theme {
  10. aside {
  11. background: blue;
  12. color: #fff;
  13. }
  14. }

静默注释(注释内容在生成的css中不存在)

  1. .blue-theme {
  2. color: #000; // 这样的类java注释,是css原本不存在的,不会被解析
  3. background/* 或者使用css原本允许的注释,但是写在不允许的位置 */: #999;
  4. }

混合器(@mixin)

语法

  • 通过使用@mixin可以给一大段样式赋予一个名字,再通过@include导入,以实现大段样式的重用。
  1. /* 声明一大段跨浏览器圆角的项目为rounded-corners */
  2. @mixin rounded-corners {
  3. -moz-border-radius: 5px;
  4. -webkit-border-radius: 5px;
  5. border-radius: 5px;
  6. }
  7. // 使用
  8. notice {
  9. background-color: green;
  10. border: 2px solid #00aa00;
  11. @include rounded-corners;
  12. }
  • 需要注意的是,大量使用@mixin会导致生成的样式表过大,导致加载缓慢。

给混合器(mixin)传参

  1. // 声明
  2. @mixin link-colors($normal, $hover) {
  3. color: $normal;
  4. &:hover { color: $hover; }
  5. }
  6. // 使用
  7. // 1. 直接传值(类函数),顺序需根据声明的顺序
  8. a {
  9. @include link-colors(blue, red);
  10. }
  11. // 2. 对象传值(类prop),顺序无所谓
  12. a {
  13. @include link-colors(
  14. $hover: red,
  15. $normal: blue
  16. );
  17. }
  • 但是有一些也可以允许不传值,这个时候我们可以使用默认值。
    • 默认值的取值可以是任何有效的css属性值,也可以是其他的参数
  1. @mixin link-colors(
  2. $normal,
  3. $hover: $normal, // 默认值为normal的传值
  4. $visited: #000 // 默认为#000,如果有传值会被重写
  5. )
  6. {
  7. color: $normal;
  8. &:hover { color: $hover; }
  9. &:visited { color: $visited; }
  10. }
  11. a {
  12. @include link-colors(red);
  13. }

选择器继承(@extend)

基础语法

  1. //通过选择器继承继承样式
  2. .error {
  3. border: 1px solid red;
  4. background-color: #fdd;
  5. }
  6. .seriousError {
  7. @extend .error;
  8. border-width: 3px;
  9. }
  10. // 上面这个部分转译出来就是
  11. .error, .seriousError {
  12. border: 1px solid red;
  13. background-color: #fdd;
  14. }
  15. .seriousError {
  16. border-width: 3px;
  17. }

和混合器@mixin的区别

  • 混合器@mixin复制的是属性,所以本质上会造成大量重复属性的出现
  • 继承@extend复制的是选择器,只是把一段属性应用到更多的选择器,代码量更少

媒体查询(@media)

与css中的区别

  • 增加了可嵌套的功能
  1. /* 编译前 */
  2. .sidebar {
  3. width: 300px;
  4. @media screen and (orientation: landscape) {
  5. width: 500px;
  6. }
  7. }
  8. /* 编译后 */
  9. .sidebar {
  10. width: 300px;
  11. }
  12. @media screen and (orientation: landscape) {
  13. .sidebar {
  14. width: 500px;
  15. }
  16. }