Scss 在项目中的使用

1、在使用 Scss 之前,我们要知道 Sass、Scss 有什么不同?

Scss 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强大功能。也就是说,任何标准的 CSS3 样式表都是具有相同语义的有效的 Scss 文件,官方解释

大家都知道 Scss 是一个 css 预处理语言。 在这里要明确一个概念,什么是 css 预处理语言呢?

简单来说 CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性,将 CSS 作为目标生成文件,然后开发者就只要使用这种语言进行编码工作。在编程语言中的一些基本特性,可以让你的 CSS 更加简洁、适应性更强、可读性更佳,更易于代码的维护等诸多好处。

基本概念理解清楚了,Scss 有这么多好用的功能,但是我要如何把 Scss 用到我的项目当中呢?

2、安装和使用

Scss 需要经过编译为 css 才能被浏览器识别,所以我们这里用到了工程化工具 Webpack 来进行编译。

首先安装 node-sass、sass-loader。

npm install node-sass sass-loader --save-dev

创建一个App.scss文件,接着在入口文件中引入。

import './App.scss';

后面我们将在 App.scss 中编写 scss 代码。

3、语法介绍

1、注释

1.1、单行注释

单行注释,在编译成css的时候,不会被编译(不会出现在编译出的CSS文件中)

//  这是单行注释

1.2、多行注释

多行注释,在编译成css的时候,会被编译(注释内容将出现在已编译的CSS文件中。)

/* 这是多行注释 */

1.3、特殊多行注释

$tip:"这是多行特殊注释"
/*
    #{$tip}
*/

编译后

2、变量

2.1、定义

scss定义变量很简单,以 $ 开头就行,就好像js中的 var,let...

$color:#fff;
$color2: blue;

2.2、使用

使用也非常简单,直接把定好的变量拿过来用就可以

body{
  color:$color;
  background-color:$color2;
}

2.3、作用域

全局作用域
在最外定义的变量,在哪里都可以用

$color:yellow;
body{
  color:$color;
}
p{
  color:#color
}

局部作用域

body{
  $color:yellow;
  color:$color;
}
// 如果想在p中,用在body定义好的$color变量是用不到的,编译会报错
p{
  background-color:$color;
}

特殊的全局作用域

// 假如非要在body里面定义一个变量,又想在body外调用,那就只能加上!global了
body{
  $color:yellow !global;
  color:$color;
}
div{
  color:$color;
}

3、混合的使用(@mixin 与 @include)

前面我们已经知道 sass 中的变量了,但是变量能记录的毕竟只是一个值,顶多把一个属性的所有值全部记录进去,比如这样:

$primary-border:1px solid #899;
.box{
  border:$primary-border;
}

这样固然可以让 box 这个选择器很轻松地获得一个边框样式,但是如果我有大量公用的样式呢?比如文字颜色,字体大小这些东西其实都可以统一起来,那这时候如果我们再一条一条的去存变量,然后再去使用的话就不太方便了。混合(Mixin)就是用来解决这个问题的,它可以把一整段代码打包,然后像一个变量一样在其他地方使用。

混合在官方的解释是这样的:混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。

3.1、声明一个函数(@mixin)

使用 @mixin 指令声明一个函数,看一下自己的css文件,有重复的代码片段都可以考虑使用混合器将他们提取出来复用。

@mixin border-radius{
    -moz-border-radius: 5px;
    -webkit-border-radius: 5px;
    border-radius: 5px;
    color:red;
}

混合器作用域内的属性都是return的值,除此之外,还可以为函数传参数。

@mixin get-border-radius($border-radius,$color){
    -moz-border-radius: $border-radius;
    -webkit-border-radius: $border-radius;
    border-radius: $border-radius;
    color:$color;
}

也可以设置混合器的默认值。

@mixin get-border-radius($border-radius:5px,$color:red){
    -moz-border-radius: $border-radius;
    -webkit-border-radius: $border-radius;
    border-radius: $border-radius;
    color:$color;
}

3.2、函数使用(@include)

使用函数的关键字为 @include

.container {
    border:1px solid #aaa;
    @include get-border-radius;         //不传参则为默认值5px
    @include get-border-radius(10px,blue);   //传参
}
/*多个参数时,传参指定参数的名字,可以不用考虑传入的顺序*/
.container {
    border:1px solid #aaa;
    @include get-border-radius;         //不传参则为默认值5px
    @include get-border-radius($color:blue,$border-radius:10px);   //传参
}

我们可能会想到,直接将混合器写成一个 class 不就行了,但是写成一个 class 的时候是需要在 html 文件中使用的,而使用混合器并不需要在html文件中使用 class 既可达到复用的效果。

3.3、可变参数

有时,不能确定一个混入(mixin)或者一个函数(function)使用多少个参数,这时我们就可以使用 ... 来设置可变参数。

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

3.4、在项目中的应用

/**
  * 文本溢出隐藏
  * $rowCount:显示行数,默认为:1(最小为:1)
  */
@mixin ellipsis($rowCount: 1) {
  // 单行文本溢出
  @if $rowCount <=1 {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  // 多行文本溢出
  @else {
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    word-break: break-all; // 允许在单词内换行。
    -webkit-line-clamp: $rowCount; // 限制在一个块元素显示的文本的行数。
    -webkit-box-orient: vertical; // 设置或检索伸缩盒对象的子元素的排列方式
  }
}

// flex 布局复用
@mixin flex ($direction: row, $justify-content: flex-start, $align-items: flex-start, $flex-wrap: nowrap) {
    display: flex;
    flex-direction: $direction;
    justify-content: $justify-content;
    align-items: $align-items;
    flex-wrap: $flex-wrap;
}

// 背景图片
@mixin bgImg($w:0,$h:0,$img:'',$size:contain) {
  display: inline-block;
  width: $w;
  height: $h;
  background: url($img) no-repeat center;
  background-size: $size;
}

/**
    * 四边 0.5px 线的实现
    * $color:颜色,默认为:#000
    * $border-radius:圆角,默认为:0px
    */
@mixin border($color: #000, $border-radius: 0px) {
  & {
    position: relative;
  }

  &:after {
    content: " ";
    position: absolute;
    top: 0;
    left: 0;
    width: 200%;
    height: 200%;
    transform: scale(0.5);
    transform-origin: left top;
    box-sizing: border-box;
    border: 1px solid $color;
    border-radius: $border-radius;
    pointer-events: none; //穿透伪元素点击
  }
}

/**
    * 单边 0.5px 线的实现
    * $color:颜色,默认为:#000
    * $type:圆角,默认为:left
    */
@mixin border-1px($color: #000, $type: left) {
  & {
    position: relative;
  }

  &:after {
    content: '';
    position: absolute;
    background: $color;
    transform-origin: 0 0;
  }

  @if $type==left {
    &:after {
      top: 0;
      left: 0;
      width: 1px;
      height: 100%;
      transform: scaleX(0.5);
    }
  }

  @else if $type==top {
    &::after {
      top: 0;
      left: 0;
      width: 100%;
      height: 1px;
      transform: scaleY(0.5);
    }
  }

  @else if $type==right {
    &::after {
      top: 0;
      right: 0;
      width: 1px;
      height: 100%;
      transform: scaleX(0.5);
    }
  }

  @else if $type==bottom {
    &::after {
      left: 0;
      bottom: 0;
      width: 100%;
      height: 1px;
      transform: scaleY(0.5);
    }
  }
}
... ...

最后

以上是本期分享内容,希望今天的分享能帮助到大家。

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

推荐阅读更多精彩内容