前言:本文中所有sass文件都指后缀名为scss的文件。在此也建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错。

一、sass插件的安装:

gulp-sass-china

//  1.安装插件
npm install gulp-sass-china // 2.引入插件模块
let sass = require("gulp-sass-china"); // 3.定义指令
gulp.task("sass",()=>{
return gulp.src("sass/*.scss")
.pipe(sass().on("error",sass.logError))
.pipe(gulp.dest("css"))
.pipe(connect.reload());
}) // 4.监听文件更改
gulp.task("watch",()=>{
gulp.watch("sass/*.scss",["sass"])
}) // gulp-sass-china文档参考:
// https://www.npmjs.com/package/gulp-sass-china

二、sass介绍

    (1)sass是一种高效css编译模式,目前这种高效的css编译方式有两种:sass/less。
 
    (2)sass基于ruby语言,特点是没有大括号,换行需要用缩进表示,非常难受。
 
    (3)后来sass开发了两种后缀名文件:一种后缀名为sass,不使用大括号和分号。
    
    (4)另一种就是我们这里使用的scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号。
    
    (5)所有sass文件都指后缀名为scss的文件。在此也建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错。
    
    (6)sass是需要编译的,sass不能直接用于页面。它可以极大地提高编程效率(对于使用熟练的人来说)。
 
    (7)sass想要应用在项目中需要编译成css文件。这里使用gulp插件进行编译(gulp-sass-china)。
三、sass语法
(1)变量:
//    必须以$开头, 后面加上!default那就代表这个是当前变量的默认值。
$font-size:16px;
div{
font-size: $font-size;
}

 
(2)复杂变量的使用:

  nth()方法,第一个参数为复杂变量,第二个参数为复杂变量的第几个值,从1开始数一般我们都将变量当做属性值来使用,但是也有极特殊情况下我们会将变量当做class里的类来使用。这时候,我们必须以#($name)的方式来使用变量;

    $linkColor:#b6b6b6 #ddd!default;
div{
color: nth($linkColor,1);
&:hover{
color:nth($linkColor,2);
}
}
$name:top !default;
.class-#{$name}{
border-#{name}:1px solid #b6b6b6;
}

(3)多值变量:map 和 list(复杂变量):

// 多值变量代表的是多维数据的存储方式,换句话说,list相当于js中的数组map相当于js中的对象。
// list数据一般用空格分割, 但是也可以用 逗号 或者小括号分割多个值。 list:
$list:(20px 40px)(30px 20px)(40px 30px);//相当于多维数组,其他格式同理;
$list:20px 30px 40px 50px 60px;
$list:20px,30px,40px,50px,60px; // 使用:对于list的使用,可以使用 nth($list,num)去调用;
// 当然我们还可以去使用其他方式;
length($list) //返回list的长度
nth($list, $n) //返回索引的项目
set-nth($list, $n, $value) //设置list中第n个的值
join($list1, $list2, [$separator]) //将两个列表链接在一起
append($list1, $val, [$separator]) //追加一个值到列表最后
zip($lists…) //将几个列表组合成多维列表
index($list, $value) //返回一个列表中值的位置 $list:(top 20px 30px) (left 40px 50px) (right 60px 70px);
@each $name,$width,$height in $list{
.box-#{$name}{
width:$width;
height:$height;
}
} map:
// map的数据是以键值对形式出现的,期中value可以是list。格式为
$map:(key1:value1, key2:value2, key3:value3)。
// 最常用的取值方法就是用map-get($map,$key) 进行取值 // 关于map还有很多函数:
map-get($map, $key) //返回key值;
map-merge($map1, $map2) //合并两个$map;
map-remove($map, $keys…) //删除某个value并返回value值;
map-keys($map) //以list形式返回所有$map 的key;
map-values($map) //以list形式返回所有$map中的value;
map-has-key($map, $key) //查看当前的$map是否有这个key
keywords($args) //返回一个关键字 $headers:(h1:20px,h2:30px,h3:40px);
@each $key, $value in $headers{
#{$key}{
font-size: $value;
}
}
// 这里的each用法那和我们js中的for-in用法基本一致,只不过写法不同。
// $key 相当于for-in中的变量,$value 相当于for-in中的obj[i];

(4)嵌套

  // sass可以进行选择器的嵌套,表示层级关
// 选择器嵌套:
ul{
li{
list-style: none;
color:nth($linkColor,1);
}
}
// 属性嵌套:
.class{
border:{
style:solid;
left:none;
right:1px;
color:#b6b6b6;
}
}

(5)@at-root(不推荐使用):

//跳出当前选择器嵌套。
.class{
color:f10;
.child{
width:100px;
}
}
.class2{
@at-root .child{
color:#b6b6b6;
}
}
@at-root (without: ...) 和 @at-root (with: ...)
// 默认@at-root只会跳出选择器嵌套,而不能跳出@media或@support
// 如果要跳出这两种,则需使用@at-root (without: media),@at-root (without: support)。
// 这个语法的关键词有四个:
// all(表示所有)
// rule(表示常规css)
// media(表示media)
// support(表示support,因为@support目前还无法广泛使用,所以对其忽略)。
// 我们默认的@at-root其实就是@at-root (without:rule)。
@media screen and (max-width:641px){
.parent{
color:#b6b6b6;
@at-root .child{
width:100px;
}
}
}
// 在这里.child只会跳出.parent 和.parent类作为同级,
// 而不会跳出@media 那么我们如何让他跳出@media那?
@media screen and (max-width:641px){
.parent{
color:#b6b6b6;
@at-root (without:media) {
.child{
width:100px;
}
}
}
}
// 这种编译模式会将我们的css编译成
@media screen and (max-width: 641px) {
.parent {
color: #b6b6b6;
}
}
.parent .child {
width: 100px;
}
// 也就是说,这时候我们的 .child 带着他的父级跳出了media嵌套。
@media screen and (max-width:641px){
.parent{
color:#b6b6b6;
@at-root (without:all) {
.child{
width:100px;
}
}
}
}
// 和刚才的执行结果有稍微的一点差异,变成了这个样子;
@media screen and (max-width: 641px) {
.parent {
color: #b6b6b6;
}
}
.child {
width: 100px;
}
// 注意:这次的跳出是不带父级的。
// 小技巧:@at-root 其实有很多的组合配合,和 &配合可以改变css的从属关系;
.parent{
@at-root .child &{
color:#b6b6b6;
}
}

(6)@mixin:

// mixin(混合)
// sass中使用@mixin声明混合,可以传递参数,参数名以$符号开始,多个参数以逗号分开,
// 也可以给参数设置默认值。声明的@mixin通过@include来调用。sass中可用mixin定义一些代码片段,
// 且可传参数,方便日后根据需求调用。从此处理css3的前缀兼容轻松便捷。
// 无参数 mixin
@mixin marginCenter{
margin-left:auto;
margin-right:auto;
}
.cont{
@include marginCenter;
}
// 有参数 mixin
// 1)必须传参数的应用
@mixin transform($type){
-webkit-transform: $type;
-moz-transform: $type;
-ms-transform: $type;
-o-transform: $type;
transform: $type;
}
.box{
@include transform(scale(1.2))
}
// 2)设置默认情况的mixin(当你不传入参数直接使用的话那会调用默认值)
@mixin opacity($opacity:50){
opacity: $opacity/100;
filter:alpha(opacity=$opacity)
}
.box{
@include opacity()
}
// 多个参数 mixin
// 调用时可直接传入值,如@include传入参数的个数小于@mixin定义参数的个数,
// 、则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。
// 除此之外还可以选择性的传入参数,使用参数名与值同时传入。
@mixin line($border:1px border #ccc, $padding:10px){
border-bottom:$border;
padding-top:$padding;
padding-bottom:$padding;
}
.list ul{
@include line(1px solid #ccc);
}
.list p{
@include line($padding:15px);
}
// 多组值参数mixin
// 一个参数可以有多组值,如box-shadow、transition等,
// 那么需要在参数后加三个点表示,如$shadow...
@mixin box-shadow($shadow...) {
-webkit-box-shadow:$shadow;
box-shadow:$shadow;
}
.box{
border:1px solid #ccc;
@include box-shadow(0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),
0 4px 4px rgba(0,0,0,.3));
}
//  扩展/继承 
// sass可通过@extend来实现代码组合声明,使代码更加优越简洁。
.active{
border:1px solid #b6b6b6;
padding:10px;
color: #333;
}
.success{
@extend .active;
width:100px;
}

(7)运算:

// sass可进行简单的加减乘除运算等,当我们拿到一张需要转换成百分比或rem布局的设计稿,这时候我们有福了
.container{
width: 100%;
}
//百分比
.aside{
width:(600px/960px)*100%;
}
//rem
.article{
width:(300px/960px)*1rem;
}

(8)函数:

// sass定义了很多函数可供使用,当然你也可以自己定义函数,以@fuction开始。
// 实际项目中我们使用最多的应该是颜色函数,而颜色函数中又以lighten减淡和darken加深为最,
// 其调用方法为lighten($color,$amount)和darken($color,$amount),
// 它们的第一个参数都是颜色值,第二个参数都是百分比。
$baseFontSize:10px;
$gray:#ccc;
@function pxToRem($px){
@return ($px/$baseFontSize)*1rem;
}
body{
font-size:$baseFontSize;
color:lighten($gray,10%);
}
.test{
font-size:pxToRem(16px);
color:darken($gray,10%);
}
// 这个和我们JS中的函数那非常的相似,可以和我们js中的函数一样使用。
// 同时注意,这里的返回值几乎是必须的所以请在每个函数结束时,使用@return去返回需要的返回值。

  

项目开发---使用node.js中sass语法的更多相关文章

  1. 配置node.js中的express框架

    玩node.js,不玩后台那就是杀鸡牛刀,今天没事整理一下以前开发node.js后台的心得 1.首先安装node.js以及cnpm,在这儿我就不说了,看我node.js中的另一篇文章node.js的安 ...

  2. Node.js中的不安全跳转如何防御详解

    Node.js中的不安全跳转如何防御详解 导语: 早年在浏览器大战期间,有远见的Chrome认为要运行现代Web应用,浏览器必须有一个性能非常强劲的Java引擎,于是Google自己开发了一个高性能的 ...

  3. 前端走进机器学习生态,在 Node.js 中使用 Python

    这次给大家带来一个好东西,它的主要用途就是能让大家在 Node.js 中使用 Python 的接口和函数.可能你看到这里会好奇,会疑惑,会不解,我 Node.js 大法那么好,干嘛要用 Python ...

  4. Node.js 中的进程和线程

    线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢? 一.进程和线程 1.1.专业性文字定义 进程(Process),进程是计算机中 ...

  5. 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...

  6. Node.js中的Session,不要觉得简单哦。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...

  7. 在node.js中使用COOKIE

    node.js中如何向客户端发送COOKIE呢?有如下两个方案: 一.使用response.writeHead,代码示例: //设置过期时间为一分钟 var today = new Date(); v ...

  8. [转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    本文转自:https://www.cnblogs.com/kongxianghai/p/5582661.html Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用Ja ...

  9. 浏览器中的 JS 和 Node.js 中的 JS

    一个是前端技术,一个是后端技术 浏览器中的 JavaScript ECMAScript  语言基础,如语法.数据类型结构.一些内置对象 BOM(Browser Object Model)  一些操作页 ...

随机推荐

  1. InnoDB在MySQL默认隔离级别下解决幻读

    1.结论 在RR的隔离级别下,Innodb使用MVVC和next-key locks解决幻读,MVVC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读. 2.幻读 ...

  2. Android四大组件初识之Activity

    一.Activity的生命周期 Activity生命周期是一系列方法调用.熟悉各个方法调用时间,我们在创建activity就能根据具体实现选择合适的方法覆盖. 1.  覆盖Activity的生命周期方 ...

  3. Day 19 磁盘管理

    1.磁盘的基本概念 1.什么是磁盘 磁盘(disk)是指利用磁记录技术存储数据的存储器. 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失. *绝大多数人对硬盘都不陌 ...

  4. 快速获取dom到body左侧和顶部的距离,简单粗暴无bug-getBoundingClientRect

    获取dom到body左侧和顶部的距离-getBoundingClientRect 平时在写js的时候,偶尔会需要用js来获取当前div到 body 左侧.顶部的距离.网上查一查,有很多都是通过offs ...

  5. 给Xshell增加快速命令集

    一.显示快速命令栏 二.配置快速命令集 在工具中找到快速命令集 添加快速命令集 三.使用快速命令集

  6. 大白话讲解 BitSet

    原理 BitSet是位操作的对象,值只有0或1即false和true,内部维护了一个long数组,初始只有一个long,所以BitSet最小的size是64,当随着存储的元素越来越多,BitSet内部 ...

  7. [Leetcode][动态规划] 买卖股票的最佳时机IV

    一.题目描述 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 k 笔交易. 注意: 你不能同时参与多笔交易(你必须在再次购 ...

  8. hibernate保存中文mysql

    最近自己做测试的时候,发现中文入库成?号了,不由得想到是否某处编码设置问题. 1.检查数据库是否为utf8 2.检查配置文件,数据库链接地址是否指定编码,经检查本地配置文件 jdbc.url=jdbc ...

  9. mybatis 插件的原理-责任链和动态代理的体现

    目录 1 拦截哪些方法 2 如何代理 3 代理对象 4 责任链设计模式 @ 如果没有自定义过拦截器, 可以看我前面的文章.如果不知道 JDK 动态代理怎么使用的, 可以看我这文章. 责任链设计模式理解 ...

  10. 基于SpringBoot + Mybatis实现 MVC 项目

    1.预览: (1)完整项目结构 (2) 创建数据库.数据表: [user.sql] SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- ...