SCSS入门

CSS预处理器

  • 定义了一种新的专门的编程语言,编译后成正常的CSS文件。为CSS增加一些编程的特性,无需考虑浏览器的兼容问题,让CSS更加简洁,适应性更强,可读性更佳,更易于代码的维护等诸多好处。
  • CSS预处理器语言:scss(sass)、LESS等;

Sass和SCSS的区别

  • 文件扩展名不同:“.sass”和“.scss”;
  • Sass是以严格缩进式语法规则来书写的,不带大括号和分号;而SCSS的语法和CSS书写语法类似。

Sass安装(Windows版)

先安装ruby:Ruby 的官网(http://rubyinstaller.org/downloads)下载对应需要的 Ruby 版本

    安装sass:
  • 方法一(通过命令安装sass):打开命令终端,输入:gem install sass
  • 方法二(本地安装sass):从http://rubygems.org/gems/sass 下载sass安装包,然后在终端输入: “gem install [把下载的安装包拖到这里]”
    然后直接额回车即可安装成功。

sass编译

sass编译的方法:

  • 命令编译
  • GUI工具编译
  • 自动化编译

sass命令编译(在命令终端输入sass指令来编译sass,最直接,最简单)

单文件编译:

sass <要编译的Sass文件路径>/style.scss:<要输出CSS文件路径>/style.css

多文件编译:

sass sass/:css/

上面的命令表示将项目中“sass”文件夹中所有“.scss”(“.sass”)文件编译成“.css”文件,并且将这些 CSS 文件都放在项目中“css”文件夹中。

缺点及解决方法:

缺点:每次保存scss文件后都要重新编译太麻烦; 解决方法:开启“watch”功能:

sass --watch <要编译的Sass文件路径>/style.scss:<要输出CSS文件路径>/style.css

tip:

文件路径不要带中文,如果有中文,watch功能无法正常使用。

sass嵌套输出方式nested

只要在编译的时候带上参数“ --style nested”:

sass --watch test.scss:test.css --style nested

sass展开输出方式expanded

在编译的时候带上参数“ --style expanded”:

sass --watch test.scss:test.css --style expanded

sass展开输出方式compact

在编译的时候带上参数“ --style compact”:

sass --watch test.scss:test.css --style compact

sass展开输出方式compressed

在编译的时候带上参数“ --style compressed”:

sass --watch test.scss:test.css --style compressed

scss语法格式

css代码:

body {
font: 100% Helvetica, sans-serif;
color: #333;
}

使用scss代码:

$font-stack: Helvetica, sans-serif;
$primary-color: #333;
body {
font: 100% $font-stack;
color: $primary-color;
}

tip:如果使用sass旧语法(sass语法),文件后缀名应为“.sass”;如果使用sass新语法(scss语法),文件后缀名应为".scss“语法,否则编译时编译不出来。

sass变量声明

$+变量名+:+变量值;

$width:200px;

普通变量和默认变量

  • 普通变量声明后可以在全局范围内使用;
  • 默认变量仅需在值后面加上!default 即可;
  • 默认变量一般是用来设置默认值,然后根据需求来覆盖的,覆盖的方式是在默认变量之前重新声明下变量即可。
  • 默认变量的价值在进行组件化开发的时候会非常有用。
$baseLineHeight: 2;
$baseLineHeight: 1.5 !default;
body {
line-height: $baseLineHeight;
}

编译后的CSS代码:

body {
line-height:2;
}

局部变量和全局变量

  • 局部变量:在元素里面声明的变量;
  • 全局变量:在元素外面定义的变量;
  • 全局变量的影子:和全局变量名字相同的局部变量叫做全局变量的影子。
$color:green;//全局变量
$width:200px;//全局变量
$height:200px;//全局变量
body {
background-color:$color;//调用全局变量
}
div {
$color:yellow;//定义局部变量,全局变量$color的影子
.div {
background-color:$color;//调用局部变量
width:$width;//调用全局变量
height:$height;//调用全局变量
}
}

sass嵌套

选择器嵌套

<header>
<nav>
<a href="#">home</a>
<a href="#">page</a>
</nav>
</header>

css:

nav a {
color:red;
}
header nav a {
color:green;
}

scss:

nav {
a {
color: red;
header & {
color:green;
}
}
}

属性嵌套(有相同的属性前缀)

css:

.box {
font-size: 12px;
font-weight: bold;
}

scss:

.box {
font: {
size: 12px;
weight: bold;
}
}

伪类嵌套

scss:

.clearfix{
&:before,
&:after {
content:"";
display: table;
}
&:after {
clear:both;
overflow: hidden;
}
}

css:

clearfix:before, .clearfix:after {
content: "";
display: table;
}
.clearfix:after {
clear: both;
overflow: hidden;
}

sass混合宏

声明混合宏

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

@mixin :声明混合宏的关键词;border-radius:混合宏的名称;大括号内:复用的样式代码;

调用混合宏

@mixin border-radius{
-webkit-border-radius: 3px;
border-radius: 3px;
}//声明混合宏border-radius
button {
@include border-radius;
}//调用混合宏border-radius

编译为CSS:

button {
-webkit-border-radius: 3px;
border-radius: 3px;
}

混合宏的参数

不带任何值的参数

@mixin border-radius($radius){
-webkit-border-radius: $radius;
border-radius: $radius;
}//声明一个带有参数$radius的混合宏
.box {
@include border-radius(3px);//调用混合宏并给混合宏传参数“3px”
}

传一个带值参数(传入一个默认值)

@mixin border-radius($radius:3px){
-webkit-border-radius: $radius;
border-radius: $radius;
}//声明一个传入了默认参数值的混合宏
.btn {
@include border-radius;//使用默认参数值的混合宏
}
.box {
@include border-radius(50%);//可以自己传入参数值
}

编译出来的CSS:

.btn {
-webkit-border-radius: 3px;
border-radius: 3px;
}
.box {
-webkit-border-radius: 50%;
border-radius: 50%;
}

传多个参数值

@mixin size($width,$height){
width: $width;
height: $height;
}
.box-center {
@include size(500px,300px);
}

编译出来的CSS:

.box-center {
width: 500px;
height: 300px;
}

sass 继承

scss:

.btn {
border: 1px solid #ccc;
padding: 6px 10px;
font-size: 14px;
}
.btn-primary {
background-color: #f36;
color: #fff;
@extend .btn;
}

编译为CSS:

.btn, .btn-primary {
border: 1px solid #ccc;
padding: 6px 10px;
font-size: 14px;
}
.btn-primary {
background-color: #f36;
color: #fff;
}

在sass中的继承,可以继承类样式块中所有样式代码,而且编译出来的css会将选择器合并在一起,形成组合选择器。

sass占位符%

用占位符声明的代码,如果不被@extend调用就不会被编译。

%mt5 {
margin-top: 5px;
}
%pt5{
padding-top: 5px;
}
.btn {
color:red;
}

编译为CSS:

.btn {
color:red;
}//%占位符声明的代码没有被编译产生css代码

使用@extend调用:

%mt5 {
margin-top: 5px;
}
%pt5{
padding-top: 5px;
}
.btn {
@extend %mt5;//使用@extend调用占位符代码
@extend %pt5;
}
.block {
@extend %mt5;
span {
@extend %pt5;
}
}

编译为CSS:

.btn, .block {
margin-top: 5px;
}
.btn, .block span {
padding-top: 5px;
}

通过@extend调用的占位符,编译出来的代码会将相同的代码合并在一起,代码变得十分简洁。

sass插值

用占位符声明的代码,如果不被@extend调用就不会被编译。

$properties: (margin, padding);
@mixin set-value($side, $value) {
@each $prop in $properties {//对每个在$properties中的$prop,即$properties中的margin、padding
#{$prop}-#{$side}: $value;//$prop连接参数$side,值为参数$value
}
}
.login-box {
@include set-value(top, 14px);//调用混合宏
}

编译为CSS:

.login-box {
margin-top: 14px;
padding-top: 14px;
}

不可以:

$margin-big: 40px;
$margin-medium: 20px;
$margin-small: 12px;
@mixin set-value($size) {
margin-top: $margin-#{$size};
}
.login-box {
@include set-value(big);
}

也不可以:

@mixin updated-status {
margin-top: 20px;
background: #F00;
}
$flag: "status";
.navigation {
@include updated-#{$flag};
}

可以在使用@extend时使用插值:

%updated-status {
margin-top: 20px;
background: #F00;
}
.selected-status {
font-weight: bold;
}
$flag: "status";
.navigation {
@extend %updated-#{$flag};
@extend .selected-#{$flag};
}

sass 注释

  • /*注释内容*/ :会在编译出来的css文件中显示
  • //注释内容 :不会在编译出来的css文件中显示
//定义一个占位符
%mt5 {
margin-top: 5px;
}
/*调用一个占位符*/
.box {
@extend %mt5;
}

编译为CSS:

.box {
margin-top: 5px;
}
/*调用一个占位符*/

sass运算

sass 加法/减法

变量或属性中都可以做加法/减法运算

.box {
width: 20px + 8in;
height:20px - 5px;
}

编译为CSS:

.box {
width: 788px;
height:25px;
}

不用类型的单位做加法/减法会报错:

.box {
width: 20px + 1em;//不同类型单位不能做加法
}

sass 乘法

这样子会有问题:

.box {
width:10px * 2px;
}

应该这样子:

.box {
width: 10px * 2;
}

编译出来的css:

.box {
width: 20px;
}

同加法减法一样,不同类型单位做乘法也会报错。

sass除法

如果除式中没有变量或者不是在一个数学表达式中(有加法减法等),就要将除式运算用小括号括起来,否则“/”不会被当做除号运算。

p {
font: 10px/8px; // 纯 CSS,不是除法运算
$width: 1000px;
width: $width/2; // 使用了变量,是除法运算
width: round(1.5)/2; // 使用了函数,是除法运算
height: (500px/2); // 使用了圆括号,是除法运算
margin-left: 5px + 8px/2px; // 使用了加(+)号,是除法运算
}

编译出来的css:

p {
font: 10px/8px;//这种是无意义的css
width: 500px;
height: 250px;
margin-left: 9px;
}

除法中相同单位相除不会报错,会产生一个无单位的值:

.box {
width: (1000px / 100px);
}

编译出来的css:

.box {
width: 10;
}

sass 变量计算

$content-width: 720px;
$sidebar-width: 220px;
$gutter: 20px;
.container {
width: $content-width + $sidebar-width + $gutter;
}

编译出来的css:

.container {
width: 960px;
}

sass数字运算

.box {
width: ((220px + 720px) - 11 * 20 ) / 12 ;
}

编译出来的css:

.box {
width: 60px;
}

sass颜色运算

所有算术运算都支持颜色值,并且是分段计算的。

p {
color: #010203 + #040506;
}

计算公式为 01 + 04 = 05、02 + 05 = 07 和 03 + 06 = 09, 并且被合成为:

p {
color: #050709;
}

数字和颜色一起运算:

p {
color: #010203 * 2;
}

计算公式为 01 2 = 02、02 2 = 04 和 03 * 2 = 06, 并且被合成为:

p {
color: #020406;
}

sass 字符运算

用“+”对字符串进行连接:

$content: "Hello" + "" + "Sass!";
.box:before {
content: " #{$content} ";
}

编译出来的css:

.box:before {
content: " Hello Sass! ";
}

可以使用“+”直接连接字符:

div {
cursor: e + -resize;
}

编译出来的css:

div {
cursor: e-resize;
}

有引号的字符串和没有引号的字符串相加,看哪个在“+”号的左边,如果有引号的在左边,结果为有引号的;如果没有引号的在左边,结果为没有引号的:

p:before {
content: "Foo " + Bar;
font-family: sans- + "serif";
}

编译出来的css:

p:before {
content: "Foo Bar";
font-family: sans-serif;
}

SCSS详解的更多相关文章

  1. 详解Bootstrap表单组件

    表单常见的元素主要包括:文本输入框.下拉选择框.单选框.复选框.文本域.按钮等.下面是不同的bootstrap版本: LESS:  forms.less SASS:  _forms.scss boot ...

  2. 详解Bootstrap按钮组件

    按钮组也是一个独立的组件,所以可以找到相应的源码文件: Less:buttons.less Sass:_buttons.scss Css:Bootstrap.css    3131行~3291行 按钮 ...

  3. SASS详解之沿袭(extend)

    SASS详解之继承(extend) 每一个类名都有可能有另一个类名的所有样式和它自己的特定样式的.当一个div的身上有两个类名,一个是“one”,另一个是“two”的时候.如下 HTML代码 < ...

  4. webpack4.x配置详解,多页面,多入口,多出口,新特性新坑!!

    花了差不多一天多的时间,重新撸了一遍webpack4.x的常用配置. 基本上常用的配置都熟悉了一遍,总体上来讲,为了对parcel进行反击,webpack从4.x开始,正在朝着尽可能的简化配置文件的方 ...

  5. webpack4配置详解之新手上路初探

    前言 经常会有群友问起webpack.react.redux.甚至create-react-app配置等等方面的问题,有些是我也不懂的,慢慢从大家的相互交流中,也学到了不少. ​ 今天就尝试着一起来聊 ...

  6. webpack4配置详解之常用插件分享

    前言 继上一次webpack的基础配置分享之后,本次将分享一些工作中项目常用的配置插件.也会包含一些自己了解过觉得不错的插件,如有分析不到位的,欢迎纠错,嗯,这些东西文档都有,大佬可绕过. Wepac ...

  7. vue-cli脚手架中webpack配置基础文件详解

    一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wep ...

  8. Sass map详解

    作为一个CSS预处理器,Sass正受到越来越多的青睐,诸如Github.Codepen.CSS-Tricks.SitePoint.w3cplus等网站采用Sass组织.管理CSS文件,Sass正在逐渐 ...

  9. vue 文件目录结构详解

    vue 文件目录结构详解 本篇文章主要介绍了vue 文件目录结构详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 项目简介 基于 vue.js 的前端开发环境,用于前后 ...

随机推荐

  1. [TypeScript] Use the TypeScript "unknown" type to avoid runtime errors

    The "any" type can be very useful, especially when adding types to an existing JavaScript ...

  2. Codeforces 553B Kyoya and Permutation

    problem 题意 本题题意不太easy看懂. 给定一个序列,我们能够把这个序列变成一些循环置换的和.然而这样的置换的方法是不止一种的.我们定义一种standard cyclic represent ...

  3. 使用Python发送电子邮件

    使用python发送邮件并不难,这里使用的是SMTP协议. Python标准库中内置了smtplib,使用它发送邮件只需提供邮件内容与发送者的凭证即可. 代码如下: # coding:utf-8 im ...

  4. mac 上多版本python 共存

    Mac上自带了Python2.x的版本,有时需要使用Python3.x版本做开发,但不能删了Python2.x,可能引起系统不稳定,那么就需要安装多个版本的Python. 1.安装Python3.x版 ...

  5. 【English】口头禅

    1. Absolutely! 毫无疑问! 2. Adorable! 可爱极了! 3. Amazing! 太神奇了! 4. Anytime! 随时吩咐! 5. Almost! 差不多了! 6. Awfu ...

  6. radiusd cisco限速问题

    http://puck.nether.net/pipermail/cisco-bba/2011-February/001349.html

  7. RabbitMQ 学习笔记(一)特点

    RabbitMQ 的具体特点 可靠性: RabbitMQ 使用一些机制来保证可靠性, 如持久化.传输确认及发布确认等. 令灵活的路由: 在消息进入队列之前,通过交换器来路由消息.对于典型的路由功能,R ...

  8. springboot学习(三) springboot文件配置

    1.简介 springboot没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特 ...

  9. WebApi异常处理解决方案

    一.使用异常筛选器捕获所有异常 首先在App_Start里面新建一个类WebApiExceptionFilterAttribute.cs,继承ExceptionFilterAttribute,重写On ...

  10. [转]js 获取浏览器高度和宽度值(多浏览器)(js获取宽度高度大全)

    IE中: document.body.clientWidth ==> BODY对象宽度 document.body.clientHeight ==> BODY对象高度 document.d ...