Sass学习笔记

参考《Sass入门篇》《侧栏工具条开发》强烈推荐后者,良心课程。

 

Sass 和 SCSS 其实是同一种东西,我们平时都称之为 Sass,两者之间不同之处有以下两点:

文件扩展名不同,Sass 是以“.sass”后缀为扩展名,而 SCSS 是以“.scss”后缀为扩展名 语法书写方式不同,Sass 是以严格的缩进式语法规则来书写,不带大括号({})和分号(;),而 SCSS 的语法书写和我们的 CSS 语法书写方式非常类似。

 

安装

安装ruby  brew install ruby 

安装 sass sudo gem install sass 

更新  gem update sass 

卸载  gem uninstall sass 

编译  sass source.scss:target.css 

实时编译  sass --watch source.scss:target.css 

多文件编译  sass sourceDir/:targetDir/ 

输出风格:

嵌套输出方式 nested  sass --watch test.scss:test.css --style nested 

展开输出方式 expanded

紧凑输出方式 compact

压缩输出方式 compressed

 

语法

语法比较多 只写几条看起来常用的吧。

1. 注释

// 单行注释 在css中不可用 所以转换成css也不会显示这些注释

/*多行注释 在css中可用*/

 

2. 变量 

// 声明 全局变量
$variableName: variableValue; 

selector {
    // 局部变量 会覆盖全局变量
    $variableName: variableValue;
    // 使用变量
    label: $variableName;
}
// !default 如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。
$variableName: variableValue !default;
// 全局变量
$variableName: variableValue !global;

// 一般我们定义的变量都为属性值,可直接使用,但是如果变量作为属性或在某些特殊情况下等则必须要以 #{$variables}形式使用。
//应用于class和属性
.border-#{$borderDirection}{
  border-#{$borderDirection}:1px solid #ccc;
}

 

3. 嵌套

/* 选择器嵌套 */
nav a {
  color:red;
}

header nav a {
  color:green;
}
/** 用scss表示 */
nav {
  a {
    color: red;
    
    header & { // & 表示当前选择器
      color:green;
    }
  }  
}

/* 属性嵌套 */
.box {
    border-top: 1px solid red;
    border-bottom: 1px solid green;
}
/** 在 Sass 中我们可以这样写:*/
.box {
  border: {
    top: 1px solid red;
    bottom: 1px solid green;
  }
}

/* 伪类/伪元素 嵌套 */
.clearfix{
  &:before,
  &:after {
      content:"";
      display: table;
  }
  &:after {
      clear:both;
      overflow: hidden;
  }
  &:hover {
     ...  
  }
}

 

4. 混合宏 @mixin @include

用法和C语言的宏基本类似。可以带参数。

/* 定义宏 */
/* 不带参数 */
@mixin border-radius{
    -webkit-border-radius: 5px;
    border-radius: 5px;
}
/* 带参数 */
@mixin center($width,$height){
  width: $width;
  height: $height;
}
/* ...可以表示所有参数 */
/*当 $shadow 的参数数量值大于或等于“ 1 ”时,表示有多个阴影值,反之调用默认的参数值“ 0 0 4px rgba(0,0,0,.3) ”。*/
@mixin box-shadow($shadow...) {
  @if length($shadow) >= 1 {
    @include prefixer(box-shadow, $shadow);
  } @else{
    $shadow:0 0 4px rgba(0,0,0,.3);
    @include prefixer(box-shadow, $shadow);
  }
}
/* 调用宏 */
button {
    @include border-radius;
}
.box-center {
    @include center(500px,300px);
}

 

5. 继承 @include & 占位符 %

继承一个类的所有属性

.btn {
  border: 1px solid #ccc;
}
.btn-primary {
  background-color: #f36;
  color: #fff;
  @extend .btn; 
  /* 相当于把btn的样式全部都挪过来 */
  /* 或者是其实是在.btn 选择器那里添加当前选择器 .btn ,.btn-primary */
}
/* 只有被@extend调用时才生效 */
%mt5 {
  margin-top: 5px;
}
%pt5 {
  padding-top: 5px;
}
.btn { 
  @extend %mt5; 
  @extend %pt5; 
} 

 

6. 数学运算

可以直接在属性值的地方使用数学运算符

$width: 15px;
.button {
  width: $width;
  height: $width * 2;
}

 

7. 引入文件 @import

 @import "foo.scss"; @import "foo"; // 两者都将引入 foo.scss 文件 

可以在文件名前加下划线如  _colors.scss  防止生成.css文件,引入时通过 @import "colors"; 就可以引入,所以在同一个目录不能同时存在带下划线和不带下划线的同名文件。

如果文件的扩展名是 .css。 如果文件名以  http://  开头。 如果文件名是 url()。 如果 @import 包含了任何媒体查询(media queries)。它会被编译成 CSS 的 @import 规则。

也可以通过一个 @import 引入多个文件。 @import "rounded-corners", "text-shadow"; 

 

实例

项目目录(https://github.com/G-lory/front-end-practice/tree/master/sass-toolbar)

_style.scss,fonts是下载的字体文件(https://icomoon.io/app/#/select)

没想过写个CSS也要写这么多注释。。。

_mixin.scss

// 设置过渡的属性 时间
@mixin transition($transition) {
    -webkit-transition: $transition;
    -moz-transition: $transition;
    -ms-transition: $transition;
    -o-transition: $transition;
    transition: $transition;
}
// 设置转换时 以哪个点为基准点做变换
@mixin transform-origin($origin) {
    -webkit-transform-origin: $origin;
    -moz-transform-origin: $origin;
    -ms-transform-origin: $origin;
    -o-transform-origin: $origin;
    transform-origin: $origin;
}
// 设置缩放
@mixin scale($origin) {
    -webkit-transform: scale($origin);
    -moz-transform: scale($origin);
    -ms-transform: scale($origin);
    -o-transform: scale($origin);
    transform: scale($origin);
}
// 设置透明度
@mixin opacity($opcity) {
    opacity: $opcity;
    filter: alpha(opacity=$opcity * 100);
}

 

index.scss

@import "mixin";
@import "style";

$toolbar-size: 50px;
.toolbar {
    position: fixed;            // 固定定位
    right: 10px;
    bottom: 10px;
}
.toolbar-item {
    position: relative;         // 子代使用absulote定位 所以这里要设置relative定位
    display: block;             // 因为a标签是内联元素 默认不能设置宽高
    margin-top: 1px;            // 几个小方块的间距为1px
    width: $toolbar-size;
    height: $toolbar-size;

    &:after {
        content: '';
        position: absolute;
        right: $toolbar-size;
        bottom: 0;
        width: 300px;
        height: 300px;
        background-repeat: no-repeat;
        white-space: pre;
        @include opacity(0);
        @include scale(0.01);
        @include transition(all 1s);
        @include transform-origin(95% 95%);
    }

    &:hover {    // 当鼠标经过的时候 要向上移动显示文字说明
        .toolbar-btn {
            &:before {
                top: -$toolbar-size;
            }
            &:after {
                top: 0;
            }
        }
        &:after {
            @include opacity(1);    // 设置透明度变为完全不透明
            @include scale(1);      // 设置大小变为100%
        }
    }
}
.toolbar-item-qq {
    &:after {
        background-image: url(../img/qq.png);
        width: 180px;
        height: 180px;
    }

    .toolbar-btn {
        @extend .icon-qq;    // 继承字体样式 将 before 元素变为字体图标
        &:before {
            color: #26b8f2;
        }

        &:after {
            content: '加我\AQQ'; // \A 表示换行
        }
    }
}
.toolbar-item-pay {
    &:after {
        background-image: url(../img/pay.png);
    }

    .toolbar-btn {
        @extend .icon-paypal;    // 继承字体样式 将 before 元素变为字体图标
        &:before {
            color: #f3281b;
        }

        &:after {
            content: '为我\A捐款'; // \A 表示换行
        }
    }
}
.toolbar-item-wechat {
    &:after {
        content: "\A不告\A诉你";
        color: #fff;
        font-size: 20px;
        line-height: 1.2;
        text-align: center;
        background-color: #000;
        width: 100px;
        height: 100px;
    }

    .toolbar-btn {
        @extend .icon-wechat;    // 继承字体样式 将 before 元素变为字体图标
        &:before {
            color: #46b942;
        }

        &:after {
            content: '加我\A微信'; // \A 表示换行
        }
    }
}
.toolbar-item-cool {
    .toolbar-btn {
        @extend .icon-cool;    // 继承字体样式 将 before 元素变为字体图标
        &:before {
            color: #000;
        }

        &:after {
            content: '我最\A可爱'; // \A 表示换行
        }
    }
}
.toolbar-btn {
    &, &:before, &:after {
        width: $toolbar-size;
        height: $toolbar-size;
        position: absolute;
        left: 0;
    }

    top: 0;
    overflow: hidden;            // 让文字默认位于溢出位置 然后将溢出部分隐藏
    @extend [class^="icon-"];    // 继承字体的样式

    &:before, &:after {
        content: '';
        color: #fff;
        text-align: center;
        @include transition(top 1s);
    }

    &:before {                   // 默认的图标显示
        top: 0;
        background-color: #d0d6d9;
        font-size: 30px;
        line-height: $toolbar-size;
    }

    &:after {                    // 鼠标悬浮时的文字显示
        top: $toolbar-size;
        background-color: #98a1a6;
        font-size: 12px;
        padding-top: 12px;
        line-height: 1.2;
        white-space: pre;        // 为了实现文字换行
    }
}

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" href="css/index.css">
    </head>
    <body>
        <div class="toolbar">
            <a href="javascript:;" class="toolbar-item toolbar-item-qq">
                <span class="toolbar-btn">
                    <!-- 用 before 元素表示默认显示 -->
                    <!-- 用 after 元素表示鼠标经过显示 -->
                </span>
            </a>
            <a href="javascript:;" class="toolbar-item toolbar-item-pay">
                <span class="toolbar-btn"></span>
            </a>
            <a href="javascript:;" class="toolbar-item toolbar-item-wechat">
                <span class="toolbar-btn"></span>
            </a>
            <a href="javascript:;" class="toolbar-item toolbar-item-cool">
                <span class="toolbar-btn"></span>
            </a>
        </div>
    </body>
</html>

 

显示效果:

鼠标悬浮-->

 

posted @ 2018-03-06 19:17  我不吃饼干呀  阅读(271)  评论(0编辑  收藏  举报