css预处理器之sass

Sass的基本介绍:

1、sasscss的一个预编译处理器。增加了规则、变量、混入、选择器、继承等等特性。它是用ruby语言编写的,集合了两种语法:

  • 缩排语法(或者就称为 "Sass"

提供了一种更简洁的CSS书写方式。 它不使用花括号{},而是通过缩排的方式来表达选择符的嵌套层级,I而且也不使用分号,而是用换行符来分隔属性。类似于ruby语言,文件名以.sass为后缀。

    body
        color:#fff;
        font-size:14px;
    
  • 对css的扩展

语法格式跟css完全一样,用大括号将选择器的属性包裹起来。比较适合于前端工程师。

    body {
        color:#fff;
        font-size:14px;
    }

  • Sass的安装和基本命令[两种方式]

  • 标准的方式[方式一]

因为sass是基于ruby语言编写的,所有安装sass之前,得先安装ruby语言。可以去官网http://rubyinstaller.orghttp://rubyinstaller.org 下载。

检测是否安装成功,在cmd命令行中输入:

    ruby -v //检测版本号

ruby的可以通过它的包管理器gem安装程序,更改RubyGems的访问地址,默认是放在亚马逊的服务器上,国内难访问得到。通过命令:

    // 移除默认的地址
    gem sources -remove [https://rubygems.org/](https://rubygems.org/)
    
// 添加这个镜像地址,如果https协议可以用,就用https,不行就用http
    gem sources -a[http://gems.ruby-china.org/](http://gems.ruby-china.org/)

//    查看地址
 gem sources -l
    

安装sass:

 gem install sass                 //安装sass
 
 sass -v                         //查看sass的版本
 
 gem update                     //更新所有的ruby程序包
 
 gem list                      //列出所有安装的ruby程序包
 
 gem install sass --version=3.3.0     //安装特定版本的程序包
 
 gem uninstall sass --version=3.3.0    //移除当前程序包

SASS的一些常用命令:

 sass style.scss style.css           //将style.scss编译为 style.css
sass --watch style.scss:style.css   //实时更新style.css
sass-convert style.css style.sass   //将.css文件转换为.sass文件
sass-convert style.css style.scss   //将.css文件转换为.scss文件   
  • npm安装方式

随着 webpack模块化打包工具的越来越流行,安装sass,已经没必要像传统方式那样繁琐了。因为 webpackloader加载器插件已经有了对sass的支持,废话不多说。

首先得安装nodejs 和 webpack,这里不多余讲解webpack的用法了,只讲述使用sass 那一部分。

通过npm命令安装 sass依赖的包node-sass sass-loader css-loader style-loader

    npm i -D node-sass sass-loader css-loader

然后再 webpack.config.js 文件中配置支持sass 语法:

    // 省略了其他的配置项
    
    export.modules={
        ..... // 省略
        
        module:{
            rules:[
                {
                    test:/\.scss$/,
                    use:[
                        "style-loader",
                        "css-loader",
                        "sass-loader"
                    ]
                }
            ]
        }
    }

这样任何.js 文件中通过 require直接引用.scss文件了,比如:

    // main.scss文件中
    body {
        font:{
            size:14px;
            weight:400;
        }
    }

然后可以直接在index.js 中引入:

    require "./main.scss"

当编译的时候,通过webpacksass-loader配置,会自动的编译成浏览器能识别的css 样式。


  • sass语法:

    变量:

sass 可以像编程语言那样,通过对一个样式赋值给一个自定义的名字。任何需要这个样式的类名,就可以赋值这个名字。这就是变量的好处。
sass中变量通常以$ 开头,后面可以接任何英文字母。一般都会把变量的声明放在文件的头部,或者可以存放在一个单独的文件保存所有的变量,通过 @import 引入。例如:

$font_ss: 14px;  // 声明了变量
.head {font-size:$font_ss};  //引用变量

编译成CSS效果:

 ```
.head {font-size:14px;};
```

@import:

sass@importcss@import,本质上完全不一样。css@import指令最好不用,它有两大弊端:

1、css@import 必须放在代码的最开始,否则就不起作用。

2、对性能不利。我们假设是a文件引入b文件,只有当浏览器在解析到a中的@import 指令时,才会去下载 b 文件,浏览器处于一个阻塞的过程,大大影响了页面渲染的时间。

sass@import指令,在编译阶段将所有 @import 指令引入的文件,合并到相应的css文件中,而且@import指令可以用在文档的任何地方。默认sass的@import相对于宿主文件寻路。被引入的文件不需要添加后缀名.scss/.sass

例如,需要引入 name.scss 文件,只需要写成:

    @import  "name"

而且对于被引入的文件,通常以"_"开头的文件,引入时可以省略"_",例如:"_versital.scss" 文件,引入时:

@import "versital"

sass的选择器:

  • 嵌套选择器:

直接上实例代码,在.scss文件中

.class {
     margin:0; padding:0;
    .class-child {
        width:40px;
        height:40px;
    }
}

编译输出的.css文件:

.class {
    margin:0;auto
}
.class .class-child{
    width:40px;
    height:40px;
}

  • 伪类选择器:

默认 css 中的伪类选择器只需要在选择器后面添加 :hover 即可,而在sass 中,需要使用一个特殊字符"&",表示的是直接父元素,实例代码,在.scss文件中

a {
    &:hover {
        color:#f00;
    }
}

编译输出的.css文件:

a:hover{
    color:#f00
};

如果不加 "&",结果就变成了:

a  :hover {color:#f00};

就不是想要的效果了。

  • 群组选择器:

这个跟css使用方法完全一样,这里就不概述了。

sass不但可以对选择器进行嵌套,还可以对属性进行嵌套,实例代码,在.scss文件中:

.a{
    font:{
        weight:700;
        size:14px;
    }
}

.css文件中输出的结果:

a {
    font-size:14px;
    font-weight:700;
}

sass 选择器用法大致与css 相同,所以关键是要把css 的语法掌握好,自然的,sass语法就不在话下了!


  • sass的函数:

sass的函数主要分两大类:

  • 1、通过function定义的函数,这个使用的相对较少。这里不多说了!

  • 2、通过@mixin 创建函数,通过@include 调用函数。

  • @mixin 函数:

@mixin 函数跟普通函数的使用方法差不多。语法:

// 定义:
    @mixin name([params]){
        margin:0;
}
    

调用:

 .class{
    @include name([params]);
  }

输出在.css文件中:

    .class {
        margin:0;
    }

参数

==name:== 定义的函数的命名,

==params:== 定义时,需要传入的参数。可以省略的。比如:

@mixin name ($width){
    width:$width;
}

调用时:

 .class{ 
    @include name(700px) 
   }

编译输出在.css文件中:

.class {
    width:700px;
}

如果既不想在调用的时候写上参数,但又想有个默认值,怎么办?可以这样写:

@mixin name (@width:200px;) {
    width:@width;
}
    

调用时不填参数:

.class {
    @include name;
}

编译输出的结果:

.class {
    width:200px;
}

如果想更改参数的默认值,可以传一个新的数值:

.class1 {
    @include name (50%);
};

输出的结果:

.class1{
    width:50%
};

  • @extend:

css中,当一个class类,想拥有另外一个class类的样式属性时,通常的做法在html中给它添加相同的类名,比如:

    <div class="alert">今天你学习了吗?</div>
<div class="alert-sure">今天我学习了</div>

如果说 .alert-sureDIV中,也想要 .alertDIV 的样式。传统做法有两种:

  • 1、在css中,将alert 类的属性复制到一份到 .alert-sure

  • 2、在 html 中,给 .alert-sure 类再添加一个 .alert 类而在 sass中,可以通过 @extend 函数实现继承。不在需要这种多余的代码了。比如,在.scss 文件中:

.alert{
    font-size:14px;
    width:50px;
}
    

.alert-sure 类添加的样式:

.alert-sure {
    @extend .alert;
    height:50px;
}

在.css文件中输出的结果就是:

.alert,.alert-sure {
    font-size:14px;
    width:50px;
}
.alert-sure {
    height:50px;
}

这样很好的降低了代码的冗余。
@extend的继承有一个需要注意的问题。它的继承会影响到后代选择器中的元素样式,所有使用继承,尽量避免使用css层叠

  • 1、如果被继承的类仅仅只是为了继承,而对页面的样式无修饰作用,可以通过添加前缀"%"
    ,那样它就不会被渲染到.css文件中!
    比如:
    %alert{
        width:20px;
        margin:0;
    }
    .alert-sure {
        @extend %alert;
    }

输出的.css文件就只有 .alert-sure类:

.alert-sure {
    width:20px;
    margin:0;
}

%alert 类不会输出到.css 文件中

  • 2、另外,@extend是不能继承选择器序列的:
.A .B {
            /***这样的文件是无法继承的***/
}

  • @media query:

sass 中的 @mediaCSS 区别:

sass中的 media query 可以内嵌在css规则中,在生成CSS的时候,才会把media query 提到样式的最高层级。
这样的好处,避免了重复书写选择器。比如:

@mixin col-sm($width:50%){
    @media(min-width:768px)}{
        width:$width;
        float:left
    }
}

调用的时候:

 .webdemo-sec {
    @include col-sm();
  }

输出在.css文件中的结果就是:

@media (min-width:768px ){
    .webdemo-sec {
        width:50%;
        float:left;
    }      
}

  • @at-root指令:

在sass中,虽然它的嵌套规则确实很棒,但是也有个致命的缺点,对性能的影响不好,但如果不使用嵌套呢,代码的可读性又特别的差,所以sass中就有了一个 @at-root 指令,

它的作用就是把它包裹的所有选择器,提到样式的最外层
既保证了代码的可读性,又提高了性能。比如,在 .scss 中:

  .btn {
    width:50px;
    height:50px;
    @at-root {
        .btn-success{
            color:#f00;
            line-height:1;
        }
        .btn-info {
            color:#0f0;
            margin:0 auto;
        }
    }
  }  

输出的.css文件:

    .btn {
        width:50px;
        height:50px;
    }
    .btn-success {
        color:#f00;
        line-height:1;
    }
    .btn-info {
        color:#0f0;
        margin:0 auto;
    }

总结:

sass作为css 的一个强大的预处理器,可以有效的提高工作的效率,减少代码的冗余性。同时,也便利了代码的整理维护和修改。它的主要功能就是上面的这些。虽然简单,但首先必须需要CSS

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

推荐阅读更多精彩内容