查看原文
其他

Sass 与 Compass 实战经验总结

2016-09-28 grace_xhw 前端圈

文章主要面向对Sass和Compass还不熟悉的同学,相信对你有一定的帮助。大牛请补充,欢迎留下建议或补充说明。


一、Sass 和 Compass 的安装

Sass和Compass的安装大家可以参考它们各自的官网,里面有详细的install步骤。以下是它们的官网:


:http://sass-lang.com/

:http://compass-style.org/


这里需要提下,安装Sass和Compass之前,请先确保本地已经装了Ruby环境,因为这两者都是用Ruby语言开发的。至于Ruby环境的安装,本文提供两个途径:


一个是:https://ruby.taobao.org/

一个是Ruby China上的:https://ruby-china.org/wiki/install_ruby_guide


二、Sass 的常用方法

Sass有两种语法规则 -- Sass 和 Scss, 以下所说的都是针对Scss语法。以下示例只给出Scss的写法,如有需要了解编译后样式的,推荐参考官网。


编译
Scss有四种编译风格,分别是:

  • nested(默认): 嵌套缩进

  • expanded: 扩展的

  • compact: 简洁格式

  • compressed: 压缩

至于怎么编译,我们放在下面跟Compass一起讲,因为这里主要分享和compass结合使用。如果要单独编译Sass,可以参考官网上提供的在线编辑器,或者用koala软件,一款Less、Sass编译器,如果项目中有用Gulp或Webpack,可以用它们的插件自行编译即可。

注释

以下两种注释方式,大家自取所需即可。

//这种注释方式,不会被编译到css文件中,只能保留在源文件

/* 这种注释可以被编译到css文件中 */

变量

Scss语法支持使用变量,变量都以$符号开头,以下给出简单示例:

$font-color: #ff637c; $sm-padding: 6px; .main {    color: $font-color;    padding-top: $sm-padding; }

嵌套

Scss支持选择器嵌套使用,省去我们写很多相同的选择器名称,如:

.prev-item {    border: 1px solid $primary-color;    padding: $sm-padding;    p {        line-height: 28px;    } }

这里提醒一点,嵌套层级太深会影响网页性能,一般推荐嵌套不超过3层。


复用

scss代码的复用,这里讲以下几种:

1、@mixin 和 @include

@mixin size($width, $height: $width) {    width: $width;    height: $height; } .containter {    @include size(60px); }

2、class / placeholder 和 @extend

请大家看看以下两种形式,注意两种形式的编译结果:

%auto {    margin-left: auto;    margin-right: auto; } .box {    @extend %auto;    width: 80px; }.auto {    margin-left: auto;    margin-right: auto; } .content {    @extend .auto;    width: 80px; }

第一种写法是Scss的placeholder的用法,编译结果如下,也就是”%auto“的样式是不会单被编译出来的,只在引用它的选择器里面生效:

.box {    margin-left: auto;    margin-right: auto;    width: 80px; }

而第二个编译结果是

.auto {    margin-left: auto;    margin-right: auto; } .content {     margin-left: auto;     margin-right: auto;     width: 80px; }

因此,如果你的html中需要用到诸如”auto“这个类的,选用第二种方法,如果html中不需要用到“auto”这个类,scss中的“auto"纯属用来服务其他类的,那我们选择第一种方法,减少css中多余的样式。

3、@import

@import命令在css模块化的运用中起着重要的作用,它用来引入外部的文件。比如我们已经写好了_reset.scss、header.scss和modal.scss,如下:




这里我们在写index.scss时,需要用到header和modal的样式,那么我们直接在index.scss里面,通过@import命令引进来就行,如图:




这里提醒注意两点

  • scss文件的文件名如果是有下划线“—”,则不会单独被编译成一份css文件,而只会在引用它的文件里面编译。但是在引用它时,不用加上下划线, 如上面的 @import 'reset';

  • 确保每份scss文件最上面都有 @charset 'utf-8', 以防编译中文注释时,出现乱码。

Sass还有很多高级用法,如自定义函数、条件语句等, 有兴趣的同学可以看看官方文档。

三、Compass 与 Sass结合使用


Compass和Sass结合使用,可以大大加快我们编写css的速度,因为Compass里面已经有很多现成的sass模板,我们可以直接拿来用。先看看在项目里面装了Compass以后,compass里面会有一个config.rb文件、一个存放Sass文件的文件夹和一个存放编译后的css文件夹(文件夹名称可自行修改),你也可以放入其他文件,如下图的images文件夹。




我们看看下图config.rb文件:




在代码的6~9行,我们可以设置文件的路径,在14行设置编译后的css格式,20行设置 line_comments = false 去除默认状态下大量的注释,如果需要去除缓存文件,则加上一句 cache = false 即可。


编译


如果项目中没有使用gulp或者webpack,单纯用compass来编译的话,可以命令行中项目的根目录下,执行 compass compile ,这样compass就会把Scss文件夹中的scss文件, 编译成css 并存放在css(或默认名为stylesheets)的文件夹里面。Compass 也可以像gulp或者webpack一样,实时编译,只需要在项目的根目录下,打 compass watch , 这样compass就会实时监听scss文件,一旦sass文件有改动,及立即编译到css文件。


模块引用


有了compass,我们不用再自己写一个reset.scss文件,或者定义一大堆css3的@mixin等,可以直接在scss文件里面引用compass的现成模块。具体模块很多,有兴趣的同学可以浏览官网,上面有详细的用法说明,这里只给出简单示例:



这样这份scss文件在编译后,就会自动生成 css reset 的代码,我们也可以通过 @include 来直接引用compass/css3中的19种命令,如 clearfix 、 box-sizing 或者其他css3新属性border-radius 等,参考下图:



此外,值得推荐的是,我们可以把项目里面 共用的变量 和 计划用到的工具,包括自定义的 @mixin, 放在一个base文件里面,这样,我们就不用在每个sass文件里面都声明、引用一些相同的东西,直接通过 @import 命令,在其他文件里面引用一个base文件就行。下面是定义好的base文件:



这时我们需要在application.scss里面用到base里面的这些变量和工具,我们直接在 application.scss 里面这样写就行:

@import 'base';

更多模块操作,请细读官方教程。


函数

Compass有很多封装好的函数,方便我们直接使用,这里挑个比较常用的讲下. 比如,我们在图片路径时,可以引用 image-url 函数,直接在config.rb文件里面,配置好图片的路径,然后在scss文件中,直接把图片名称作为参数传给 image-url 即可,如图:


你也可以拿它再和scss结合使用,封装出更实用的代码,如封装一个兼容1倍屏和2倍屏图片的@mixin,代码如下:

@mixin bg-img($image1, $image2) {    background: image-url($image1);    background: -webkit-image-set(image-url($image1) 1x, image-url($image2) 2x); }

在需要用到的地方,通过 @include 引进来,并传入图片名称,如下所示:

.icon-bg {    @include bg-img('icons.png','icons@2x.png'); }

更多实例,请参考:http://compass-style.org/index/functions/

篇幅有限,就先写这么多了,如果你有更多的发现,欢迎一起分享...

四、资料推荐


:http://www.ruanyifeng.com/blog/2012/06/sass.html

:http://www.ruanyifeng.com/blog/2012/11/compass.html



【读书会往期回顾】

一、[活动]中秋读书会,你买书,我付钱!

二、[活动]中秋读书会获奖名单公布

三、[活动]《CSS揭秘》签名版等您拿,第二期读书会来啦!


【React启蒙系列文章】

一、[React启蒙系列] 初探React

二、[React启蒙系列] 学习React前需要理解的名词

三、[React启蒙系列] React和Babel的基本使用

四、[React启蒙系列]React节点

五、[React启蒙系列]使用JSX

六、[React启蒙系列]React 组件属性

七、[React启蒙系列]React 组件状态


【您可能感兴趣的文章】

一、手把手教你用react

二、React入门及资源指引

三、利用ESLint检查代码质量

四、构建一个安全的 JavaScript 沙箱

五、入门Webpack,看这篇就够了

六、第三届CSS大会广州找场地啦~~求介绍~~

七、Web Components 是个什么样的东西

八、JavaScript 被忽视的细节

九、[心得] 如何提高 React App 的性能

十、[心得] 自己动手打造 ES7 开发环境

十一、[译文] 如何运用新技术提升网页速度和性能

十二、你应该知道的HTTP基础知识

十三、Webpack from First Principles

十四、没时间阅读?佐克伯、比尔盖兹、马斯克教你「5小时原则」

十五、没快速成长,别说你在创业

十六、TCP三次握手&Render Tree页面渲染=>从输入URL到页面显示的过程?

十七、前端知识普及之HTML

十八、[翻译]React最佳实践与实用函数

十九、[翻译]从JS模块化现状阐释选择ES6模块的重要性

二十、前端进阶-让你升级的网络知识

二十一、GitHub 2016 年度开源项目报告导读

二十二、正则之基本入门

二十三、你所不知道的 Console

二十四、谈谈React

二十五、[Javascript] 关于 JS 中的浅拷贝和深拷贝

二十六、准时!英国维珍集团大老给上班族的唯一忠告

二十七、前端知识普及之页面加载

二十八、[Node.js] 理解 Node.js 事件驱动

二十九、浏览器的缓存



前端圈--打造专业的前端技术会议

为web前端开发者提供技术分享和交流的平台

打造一个良好的前端圈生态,推动web标准化的发展

官网:http://fequan.com

微博:fequancom | QQ群:41378087


长按二维码关注我们

投稿:content@fequan.com

赞助合作:apply@fequan.com

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存