最近在慕课网学习Sass和Compass,学习链接地址:https://www.imooc.com/learn/364,现在整理笔记如下:

一、使用Sass和Compass的优点:

a.使用Sass和Compass可以写出更优秀的CSS。

b.解决CSS编程过程中的痛点问题,例如精灵图合图等。

c.有效地组织样式,图片,字体等项目元素。

二、Sass简介

1.Sass是为了让我们写出更高效的可维护性的CSS代码。

2.Sass的语法:

使用缩进式语法:.sass作为文件的扩展名,这种语法是:对空格敏感,所以选择器下面的属性有缩进,并且不适用花括号,每个属性之间通过换行分隔,而不是分号,这是一种类Ruby的语法。

h1
color:#000
background:#fff

Sass在3.0版本引入了.scss的语法,使用.scss作为文件的扩展名,和css语法一样。

h1{
color:#000;
background:#fff;
}

注:不能在一个文件中使用两种语法,可以在一个项目下用两种不同的语法的文件。

三、Sass安装

因为Sass引擎使用Ruby写的,所以我们需要安装Ruby的运行环境。Ruby的官网地址是:http://www.ruby-lang.org/en/,rvm (Ruby Version Manager)安装管理协同多个Ruby环境变得简单的命令行工具。

mac电脑自带ruby环境,但是版本比较老,建议升级一下,推荐安装ruby的管理工具rvm,管理各个版本的ruby(官网:rvm.io)。但是安装rvm需要安装gpg,这个我目前还没有找到正确的安装gpg的方法(在win10环境下),所以这部分暂时搁置,以后补充。

下面我先介绍关于rvm的一些命令行的指令含义。

 指令名称  含义
 rvm list known  列出所有已知的ruby版本
 rvm list  列出本机通过rvm安装的ruby环境版本
 =*  当前使用的ruby版本也是默认使用的ruby版本
 *  默认使用的ruby版本
 =>  当前正在使用的ruby版本
 rvm install 2.0.0  安装2.0.0版本的ruby环境
 rvm use 2.0.0  切换到2.0.0版本的ruby环境
 rvm use --default 2.2.0  默认使用2.2.0版本的ruby
 rvm use system  使用系统自带的ruby

下面介绍怎样在windows环境下安装ruby环境。

1.首先进入Ruby官网,点击Download,选择RubyInstaller(Windows),点击进去,根据自己的电脑,选择合适的版本(32位还是64位),下载合适的程序包。

2.下载好了之后直接点击安装,点击下一步,选择“I accept the license”,点击下一步。

3.选择一个安装目录,因为我们要在命令行里面使用ruby,所以把ruby可运行文件加载到我们的system path里,也就是勾选“Add ruby executables to your PATH”,然后点击install安装。点击finish。

4.进入控制台,输入ruby -v打印出ruby的版本,说明安装成功。

下面介绍gem。

gem是ruby的包管理工具,类似于npm。安装好了ruby,也就安装好了gem,相当于安装好了node,npm也就安装好了一样。

正式使用之前,需要先修改一下ruby软件包的sources。由于国内网络的原因,导致rubygems.org放在亚马逊的资源文件经常间歇性的连接失败,所有我们更换成国内淘宝镜像提供的ruby sources。命令如下:

gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
//使用下面的指令查看list当前所有的源是否上一步操作成功
gem sources -l

安装Sass和Compass都是根据gem进行安装。以下就是gem的一些常用指令:

指令名称 含义
gem update  更新ruby程序
gem install sass --version=3.3  安装3.3版本的sass
gem list  列出本地安装的所有ruby程序包
gem uninstall sass --version=3.3.0  卸载3.3.0版本的sass程序
gem uninstall sass  卸载sass
gem install compass  安装compass

我们使用命令gem install sass安装Sass,安装好了之后,使用命令sass -v查看Sass是否安装完毕。

新建一个目录,命名为“learn-sass-cli”,在这个目录下,新建一个文件main.scss。在这个文件里随便写一个常用的代码。例如:*{margin:0;padding:0}

然后我们根据命令切入到目录为learn-sass-cli的下面,在控制台输入以下命令。

sass main.scss main.css
//当前目录执行sass命令,把main.scss编译成main.css

执行完上面的命令,在当前文件夹多出main.css文件,main.css.map文件以及.sass-cache。

main.css.map:用来映射scss和css文件的每条规则,方便我们在Chrome里面调试。

.sass-cache:存放的是sass编译过程中生成的临时文件,这些临时文件让编译更加迅速。

四、Compass的安装

Compass是一个开源的CSS书写框架。

//安装compass
gem install compass
//查看compass安装版本
compass -v

Compass可以直接搭建前端项目样式部分,如下命令:

//搭建learn-compass
compass create learn-compass init

五、Sass语法

下面主要以.scss进行说明。怎么转换成.sass,在命令行输入以下命令:

//把.scss文件转换为.sass文件
sass-convert main.scss main.sass
//用compass创建一个测试项目
compass create learn-sass-syntax
//切换到learn-sass-syntax项目下
cd learn-sass-syntax
//实时监听sass文件的变化
compass watch 

进入learn-sass-syntax文件夹下面的screen.css。

1)变量语法:

假设现在我们把文章标题和文章内容的字体抽象为字体变量,一般的做法把变量放在文件的行首。Sass通过一个"$"声明变量。例如:

//声明变量使用$
$headline-ff:[font-family];
//引用变量:
.selector{
font-family:$headline-ff;
}

对于常见变量,我们习惯于抽离出一个变量文件。因为不需要编译成CSS,所以我们命名为“_variables.scss”,加一个下划线的目的是这样就声明为局部文件。

在screen.scss中引入_variables.scss的方法是

@import "variables"

我们称screen.scss为宿主文件。

CSS中原生的@import指令的两大弊端:

1.放在代码最前面,否则会不起作用。

2.如果文件A是引入文件B,就会先去下载文件B,会造成网络堵塞对性能不利。

所以我们不建议使用CSS原生的@import指令。

Sass重新定义@import的功能,叫做control directives。Sass在编译阶段将被引入文件合并,并输出到了相应的CSS文件,重新定义后的@import可以在文档任何地方引入。如果被引入文件包含的是变量或者是mixin函数,则意味着在宿主文件中可以随意使用这些变量和函数。

Sass提供一个load_paths的选项,可以用来添加额外寻路路径,Compass通过配置这个选项,将compass的目录加入到了寻路目录当中。reset是compass提供的一个重置模块。

@import "compass/reset";//normalize:注重通用的方案,重置该重置的,保留有用的样式,进行一些bug修复,统一跨浏览器的默认样式差异,比如统一<p>标签的样式

使用CSS原生@import的既定规则:

1.当@import后面跟的文件名是以.css结尾的时候。

2.当@import后面跟的是http://开头的字符串的时候。

3.当@import后面跟的是一个url()函数的时候。

4.当@import后面带有media queries的时候。

基于Sass的既定规则:

1.没有文件后缀名的时候,Sass会添加.scss或者.sass的后缀。

2.同一文件下,局部文件和非局部文件不能重名,也就是所有的文件都不能重名。

sass的嵌套语法:

parent_class {
child_class{
...
}
}

嵌套中一个需要关注的点:

a {
&:hover{
color:blur;
}

使用&父类选择器将父类引入,并样式输出到父类上。否则这个:hover样式将应用到a标签的所有内容上。

sass除了提供类之间的嵌套,还提供了属性之间的嵌套:

.headline{
font:{
//注意!这里font(属性)后的冒号不可去掉
family: sans-serif,
size: 16px;
}
}

2)注释语法

sass支持css的注释语法。

//不会在编译好的css文件中输出
/**/会在编译好的css文件中输出

好的代码习惯:在主文件的开头声明块注释:

/**
* CONTENTS
*
*SETTING
*variables............变量几种存储的文件
*
*TOOLS
*reset.................Compass内置浏览器重置样式文件
*
*BUSINESS
*
*BASE
*screen.scss.........针对当前站点主页的样式修饰
*/

3)变量操作

1.直接操作变量,即变量表达式。

2.通过函数

 a.跟代码块无关的函数,多是自己内置函数,称functions。

b.可重用的代码块,称mixin

  •@include的方式调用

  •@extend的方式调用

下面介绍@mixin的用法:

一般我们把@mixin放在页面的顶部,@import之后,或者单独抽离出一个文件。调用方式通过@include调用即可。

//书写格式如下,下面只是举个例子
@mixin col-6 {
width: 50%;
float: left;
}
//调用格式如下
.webdemo-sec {
// 一个规则中可以引入多个mixin
@include col-6();
//一旦使用mixin,规则中也可以包含其他规则。
&:hover {
background:#f5f5f5;
}
}

@mixin在不调用的时候,是不会生成任何CSS内容的,在调用的时候,也只是把@mixin里面的内容输出到调用位置。

@mixin col-6 {
.col-6{
width: 50%;
float: left;
}
} //调用方式提到最外层
@include col-6()

不建议按照以上的方式去书写@mixin以及调用@mixin的方式,因为CSS是建议我们书写语义化的类名,而不是视觉化的表现。

我们也可以使用参数,来增加调用的灵活性,例如:

//书写方式
@mixin col($width){
width:$width;
float:left
} //调用方式
.webdemo-sec{
@include col(50%);
}

我们也可以调用的时候不用传参数,那么写法又发生了改变,如下:

//书写方式
@mixin col($width:50%){
width:$width;
float:left
} //调用方式
.webdemo-sec{
@include col();
}

下面介绍@extend:

@extend可以帮助我们明确的指定一个选择器去继承另一个选择器的样式,例如:

.error{
color:#f00;
} .serious-error{
// @extend的用法:把继承者的选择器插入到被继承者的选择器出现的地方
@extend .error;
border:1px #f00;
}

最后生成的CSS代码如下:

.error, .serious-error {
color: #f00;
} .serious-error {
border: 1px #f00;
}

@extend支持继承多个选择器,和@include一样。

@extend的两个知识点:

1.@extend不可以继承选择器序列,也就是不能继承嵌套选择器。例如:

结果直接报错,如下:

2.如果我们为Sass写插件,可能会有很多供别人继承的选择器,但是我们并不希望这些选择器被输出到CSS文件里面,因为别人可能用不着继承这个选择器,这样就会有冗余样式的生成,这时候我们可以使用%,用来构建只用来继承的选择器。例如:

生成的CSS文件样式为:

我们只看到.serious-error-2的选择器,没看到.error-2的选择器。

4)Sass中的@media跟CSS区别

区别是:Sass中的media query可以内嵌在CSS规则中,在生成CSS的时候,media query才会被提到样式的最高层级。

好处:避免我们重复书写选择器或者打乱样式表的流程。

浏览器在解析一个CSS选择器的时候,是按照从右往左的顺序解析的。例如:按照下面第一张图说明,浏览器会首先找到页面中所有的.headline的类名,然后再一层一层往上去遍历,遍历.headline的父级元素中有没有类名为.main-sec,直到找到或者遍历到html一级,这样往往导致样式渲染的低效。

通过嵌套还有一些副作用:增加了样式修饰的权重,制造了这种样式位置的依赖。最佳实践是给相应的元素起名.main-sec-headline和.main-sec-detail,对这两个类进行样式的修饰,如下。但是这样写多了以后,又不如嵌套清晰易维护,所以更好的办法是可以在嵌套的时候,使用Sass的@at-root指令,明确的指定被嵌套的内容会输出到样式表的顶层。这样虽然我们是用嵌套的方式去写的,但是在生成的CSS样式表中,却不包含嵌套。

通过一个例子说说其他Sass语法:

最后说说Sass的四种输出格式,打开config.rb,里面有一行叫做output_style,这一项就是控制CSS的输出样式。

output_style=expanded 默认格式,样式是展开的,跟我们手动书写CSS样式一样
output_style=nested 很好的反应了CSS修饰HTML的结构,根据嵌套,在输出的时候对应缩进,嵌套的越深,缩进的就越多
output_style=compact 将所有的属性汇总到一行,关注更多的是选择器之间的关系,而不是选择器内的属性
output_style=compressed 将样式表压缩,以占用最小的空间,上线前的CSS,我们一般会才有这种输出方式

注:

1.如果使用中文出现乱码,请在文件最开始使用@charset “UTF-8”;

2.Sass的计算是可以带单位的,意味着不能混用两种不同的单位。

3.CSS3引入了HSL的颜色模式,H:色调,S:饱和度,L:亮度,不过在IE6-8不支持。

4.Sass允许我们通过@function声明函数,但是一般很少使用。

Sass和Compass学习笔记系列之Sass的更多相关文章

  1. Sass和compass 安装 和配合grunt实时显示 [Sass和compass学习笔记]

    demo 下载http://vdisk.weibo.com/s/DOlfkrAWjkF/1401192855 为什么要学习Sass和compass ?提高站独立和代码产品化的绝密武器,尤其是程序化cs ...

  2. compass Sprites 雪碧图 小图片合成[Sass和compass学习笔记]

    demo 源码 地址 https://github.com/qqqzhch/webfans 什么是雪碧图? CSS雪碧 即CSS Sprites,也有人叫它CSS精灵,是一种CSS图像合并技术,该方法 ...

  3. 学习Sass 的基本语法规则[Sass和compass学习笔记]

    自从发现可编程的css语法 Sass和基于Sass的css库compass 一个给我的感觉像c# 另外一个给我的感觉像.NET Framework,一切都为了提升开发效率和降低开发大型web的门槛. ...

  4. Sass之Compass学习笔记

    compass Compass是Sass的工具库,就好像jQuery是js的库一样. sass有了compass的配合,就会更加事半功倍. Sass本身只是一个编译器,Compass在它的基础上,封装 ...

  5. compass reset和layout [Sass和compass学习笔记]

    reset 可以重置浏览器的的html的默认样式,因为各个浏览器对有些元素解析差别很大 通过重置样式可以让样式的浏览器兼容 更简单 使用方法简单 @import "compass/reset ...

  6. compass tables 表格 表格常见样式[Sass和compass学习笔记]

    demo 源码 地址 https://github.com/qqqzhch/webfans compass  的表格提供了集中常见样式 表格边框 outer-table-borders($width, ...

  7. compass General 常用api学习[Sass和compass学习笔记]

    compass 中一些常用api 包括一些浏览器hack @import "compass/utilities/general" Clearfix Clearfix 是用来清除浮动 ...

  8. compass color 颜色 对比色[Sass和compass学习笔记]

    最基本的api 是对比色,对与我这种菜鸟来说,没有什么比在一个背景色下 用什么颜色的文字坑蛋疼的事情了,这个工具可以帮助大家很好解决这个问题 api 地址 http://compass-style.o ...

  9. compass typography 排版 常用排版方法[Sass和compass学习笔记]

    Bullets 用来定义ul li 相关的样式 no-bullet  关闭 li的默认样式 那个小圆点 no-bullets 作用域ul 调用no-bullet 函数 不过用了reset 后 默认没有 ...

随机推荐

  1. Centos7搭建OpenNebula云平台

    OpenNebula概述 OpenNebula是专门为云计算打造的开源系统,用户可以使用Xen.KVM.VMware等虚拟化软件一起打造企业云.利用OpenNebula可以轻松构建私有云.混合云.公开 ...

  2. Spring cloud微服务安全实战-3-6API安全机制之数据校验

    校验:非空.唯一性等校验 密码的加密:密码加密来存储. 如何做https的访问 校验 一个层面是接口层面,另外一个层面是数据库层面. Springboot给我们提供了简单的封装 校验的包里面还有其他的 ...

  3. 使用 Ninja 代替 make

    使用 Ninja 代替 make 摘自:https://www.jianshu.com/p/d118615c1943 22017.01.14 11:41:44字数 1408阅读 26336 前言 在传 ...

  4. jQuery 属性操作 - toggleClass() 方法

    实例 对设置和移除所有 元素的 "main" 类进行切换: $("button").click(function(){ $("p").tog ...

  5. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  6. xps转换为pdf

    https://www.cnblogs.com/zeoy/archive/2013/01/09/2852941.html https://blog.csdn.net/jafucong/article/ ...

  7. Nodejs Client for FastDFS

    FastDFS 是分布式文件存储系统.这个项目是FastDFS的NodeJS客户端,用来与FastDFS Server进行交互,进行文件的相关操作.我测试过的server版本是4.0.6. githu ...

  8. web端自动化——Selenium3+python自动化(3.7版本)-火狐62版本环境搭建

    前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium3为基础. 一.selenium简介 Sel ...

  9. CountDownLatch和CyclicBarrier使用上的区别

    一.CountDownLatchDemo package com.duchong.concurrent; import java.util.Map; import java.util.concurre ...

  10. git的使用学习(五)git的分支管理

    分支管理 分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没啥影响.不过,在某个时间点,两个平 ...