Sass

中文官网:https://www.sass.hk

sass环境

1 自动化构建 (推荐)
2 命令行编译
  (1).sass基于ruby 先下载ruby http://www.ruby-lang.org
  (2).更换gem源
    $ gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
    $ gem sources -l
  (3).gem install sass //安装sass
3 vscode esay sass插件 是不需要装ruby环境的
  参考文章https://www.cnblogs.com/yangkangkang/p/11010563.html
4 koala软件编译

变量

//sass变量以$符号开头 ,  默认是最后的覆盖前面的变量, 如果加了!default, 这里结果则为200px
$baseWidth :200px;
$baseWidth :100px !default;

.box1{
    width: $baseWidth;
}

// $定义的 选择器,属性名,url '字符串'  使用时必须 #{$xx}使用  .
$color:pink;
$selector:wrap;
$margin:margin;
// $background_url:abc;
$background_url:'http://xx.jpg';
.#{$selector}{
    #{$margin}:20px;
    color:$color;
    // background-image: url('./img/'+$background_url+'.jpg');
    background-image: url('#{$background_url}');
    
}
变量类型
//1.数字类型
  100px  , 2
//2.颜色
  red, #fff
//3.字符串
  $str :'abc.jpg';
//4.数组  下标从1开始算 , nth() 获取指定下标, index()根据内容返回对应下标
  $list:(100px,200px,'abc.jpg',2);
  .div{
      width:nth($list,1);
      height:nth($list,2);
      background:url('images/'+nth($list,3));
      z-index:index($list,'abc.jpg');
  }
//5.map  map-get() 
$map :(top:10px,left:20px,right:30px,bottom:40px);
.div{
    top: map-get($map,top); // top:10px;
}
//each 遍历 map
.div3{
  @each $key ,$value in $map{
    #{$key}:$value;
  }
}
变量计算
//1.颜色运算
//案例 根据16进制获取rgb值 0-255
$color:#5e5e5e;
.div4{
    color: red($color);//94
    color: green($color);//94
    color: blue($color);//94
    color: rgb(red($color), green($color), blue($color));//#5e5e5e
}

文件引入

引入的文件如果是以 .css结尾 / http路径 / url()包裹 / media queries 则生成的文件是以原生css去引入
如果引入的文件和当前文件 有重名变量 , 然后文件引入的顺序又在当前文件的变量之后
可以在引入的文件变量使用 !default ,这样当前文件的变量就不会被覆盖了
@import 'index'   以scss/sass结尾的文件可以忽略后缀

mixin 混合, 就是将代码复制粘贴

//1. @mixin name {} 声明混合
@mixin helloMixin {
    display: inline-block;
    //相同前缀的属性名 可以简写成对象 ,最终生成 font-size,font-weight,甚至font-aa
    font: {
        size:20px ;
        weight: 500 ;
        aa:red;
    };
    color: red;
}

.div{
    //使用时 以@include 混合名
    @include helloMixin;
}

//2.带参数的mixin
@mixin mn2($w,$c) {
    width: $w;
    color: $c;
}

.div2{
    @include mn2(20px,red );
}
//3.mixin嵌套
@mixin mn3 {
    width: 10px;
}

@mixin mn4 {
    width: 40px;
    @include mn3;
    height: 60px;
}

.div3{
    background: red;
    @include mn4;
}
//最终生成 , sass不会自动去掉重复的属性, css一般(!important除外)是使用最后一个声明的属性, 晓得伐?
.div3{
  background:red;
  width:40px;
  width:10px;
  height:60px
}

继承 , 生成分组选择器和less继承差不多 , 比混合能省去很多重复代码

//1.简单继承
.div1{
    border: 1px solid #ccc;
}

.div2{
    width: 20px;
    @extend .div1;
}
//,最终生成
.div1,.div2{
  border:1px solid #ccc
}
.div2{
  width:20px
}
//2.关联继承 与.div1相关的也会被继承,
.div1.other{
    color:red;
}
//最终生成
.div1,.div2{border:1px solid #ccc}.div2{width:20px}.div1.other,.other.div2{color:red}
//3.链式继承
.div3{
    @extend .div2;
}
//最终生成
.div1,.div2,.div3{border:1px solid #ccc}.div2,.div3{width:20px}.div1.other,.other.div2,.other.div3{color:red}
//4.伪类继承
a:hover {
    text-decoration: underline;
}
div:hover{
    width: 10px;
}
.hoverlink{
    color: red;
    @extend :hover; //继承hover伪类
}
//生成的结果为 , 跟hover相关的选择器, 作为继承者最后生成 并且选择器的一部分
a:hover, a.hoverlink {
  text-decoration: underline;
}

div:hover, div.hoverlink {
  width: 10px;
}

.hoverlink {
  color: red;
}

if逻辑判断

$type: '1';
p{
    @if $type=='1' {
        color:red;
    } @else if $type == '2' {
        color:yellow;
    } @else if $type == '2' {
        color:blue;
    } @else {
        color:green;
    }
}
@if $type=='2' {
    div{
        color:red;
    }
    
} @else {
    div{
        color:yellow;
    }
}
//生成
p {
  color: red;
}

div {
  color: yellow;
}

for循环

//1.普通循环
// through和to的区别, through包含3, to不包含3
@for $i from 1 through 3 {
    .item#{$i} {
        width: 1px * $i;
    }
}
@for $i from 1 to 3 {
    .item#{$i} {
        width: 1px * $i;
    }
} 
//生成
.item1 { width: 1px; }
.item2 { width: 2px; }
.item3 { width: 3px; }

.item1 { width: 1px; }
.item2 { width: 2px; }
//2.数组循环 , length 获取数组长度
$arr : (5,4,3,2,1);
@for $i from 1 through length($arr){
    .item#{nth($arr,$i)}{
        width: 2px * nth($arr,$i);
    }
} 
//生成
.item5 { width: 10px; }
.item4 { width: 8px; }
.item3 { width: 6px; }
.item2 { width: 4px; }
.item1 { width: 2px; }

while循环

$i: 6;
@while $i > 0 {
    .item#{$i} {
        width: 1px * $i;
    }
    $i: $i - 2;
}
.item6 { width: 6px; }
.item4 { width: 4px; }
.item2 { width: 2px; }

each 遍历map

$map:(top: 1px,left:2px,bottom: 3px,right: 4px);

.div {
    @each $key , $value in $map {
        #{$key}:$value;
    }
}
//生成
.div { top: 1px; left: 2px; bottom: 3px; right: 4px; }

内置函数

@debug css调试 实时在控制台看到数据的结果 ,vscode暂时不会用
数学内置函数
percentage() 转成百分比, 就是加个%号
round() 四舍五入取整
ceil() 向上取整,小数舍去,整数加1
floor() 向下取整 小数舍去,整数不变
abs() 绝对值
min()/max() 取最小/最大值
random() 默认0-1
random(10) 0-10取整数

数组内置函数
length($list);//长度
nth($list, 2);//指定下标的元素
@debug set-nth($list, 1, "x"); 下标是1的元素替换成x
join($list, (6, 7, 8)); //拼接数组
append($list, '999'); //从数组尾部添加元素
index($list, "p"); //找到数组元素的位置

字符串内置函数
unquote($string):去除引号
quote($string):添加引号
str-length($string):获取字符串长度
str-insert($string,$insert,$index):在指定位置插入字符【$insert要插入的字符,$index要插入的位置】
str-index($string,$substring):返回指定字符在字符串中的位置。
to-upper-case($string):转换成大写
to-lower-case($string):转换成小写

map内置函数
map-get($map,$key):根据给定的key值,返回map中相关的值
map-merge($map1,$map2):将两个map合并成一个新的map
map-remove($map,$key):从map中删除一个key,返回一个新map,不更改原map数据
map-keys($map):以字符串形式返回map中所有的key
map-values($map):以字符串形式返回map中所有的value
map-has-key($map,$key):根据给定的key值判断map是否有对应的value值,如果有返回true,否则返回false
keywors($args):返回一个函数的参数,这个参数可以动态的设置key和value

@mixin foo($args...) {
    @debug keywords($args); // 返回参数和参数值, 类型应该是一个map , ($arg1:'abc',$arg2:'efg')
}

@include foo($arg1:'abc',$arg2:'efg');
$numberPercent: 7;
div{
    width:percentage( $numberPercent );//700%
}

$numberPercent: 0.7;

div{
    width:percentage( $numberPercent );//700%
}
$number: 70;
$number2: 71;
div{
    width:#{round(9.5)}px; //10px
    width:ceil(8.1) ; //9
    width: floor(7.8);//7
    width: abs(-3.4);//3.4
    width: min($number,$number2);//70
    width: max($number,$number2);//71
}

自定义函数

//定义函数
@function px2rem($px){
    $rem : 37.5px;
    //renturn 返回
    @return ($px / $rem) + rem;  
}
.div2 {
    width: px2rem(90px);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345