学习Sass(二)
前面简单介绍了sass的安装,特点和使用方法等,这里记录下sass的基本语法。

一、变量
变量以$开始,像css属性那样赋值,如:
$color: #ccc;
div {
color: $color;
}
若变量定义在的选择器内,则仅在嵌套层级的范围内可用(可理解为块级作用域)。不在任何选择器内定义的变量则在任何地方可用(可理解为全局变量)。
$color: #ccc; /*全局范围内可用*/
div {
$width: 200px; /*仅在定义的选择器内可用*/
width: $width;
color: $color;
}
p {
color: $color;
}
若在选择器内定义的变量后面加上!global标志,则可“升级”为“全局变量”,在任何地方可用。
$color: #ccc; /*全局范围内可用*/
div {
$width: 200px; /*仅在定义的选择器内可用*/
width: $width;
color: $color;
$height: 100px !global;/*全局范围内可用*/
}
p {
color: $color;
height: $height;
}
字符串类型变量,有两种类型:带引号(包括单、双引号)和不使用引号。css文件会保留其字符串形式。特殊情况:在字符串中使用#{}引用字符串变量时会去掉引号,这样主要是为了便于使用,比如mixins中的选择器名称。例如:。
$name: "peter";
$job: 'programmer';
$weight: bold; body.chrome{
content:"Hi #{$name},chrome users!My job is #{$job}";
//也可写成如下形式content:"Hi "+ $name+",chrome users!The job is "+$job;
font-weight:$weight;
}
编译为:
body.chrome {
content: "Hi peter,chrome users!My job is programmer";
font-weight: bold;
}
变量值后面加!default,当变量被赋予其他值时引用新值,没有就使用默认的值,换句话说就是个“备胎”啊!
$content: "First content";
$content: "Second content?" !default;
$new_content: "First time reference" !default; #main {
content: $content; /* 引用新值 */
}
#main:after{
content: $new_content; /* 引用默认值 */
} 编译为:
#main {
content: "First content";
} #main:after {
content: "First time reference";
}
注:变量中的连字符下划线_和划线-可以互换的,如定义了$body_height,可以使用$body-height访问。
二、运算
SassScript 支持对数字标准的算术运算(加法+,减法 - ,乘法*,除法/和取模%)。数字支持关系运算符(<, >, <=, >=),并且所有类型支持相等运算符(==, !=)。这里介绍常用的除法和加法。
2.1 除法
原生CSS允许‘/' 出现在属性值之间作为分隔数字的方式,sass是CSS属性语法的扩展,所以也必须支持这一点。那么‘/’何时被作为除法预算符呢?
如果该值,或值的任何部分,存储在一个变量中或通过函数返回。
如果该值被括号括起来,作为列表的外部括号除外。
- 如果该值被用作算数表达式的一部分。
例如:
p {
font: 10px/8px; // 原生的CSS,不作为除法
$width: 1000px;
width: $width/2; // 使用了变量, 作为除法
width: round(1.5)/2; // 使用了函数, 作为除法
height: (500px/2); // 使用了括号, 作为除法
margin-left: 5px + 8px/2px; // 使用了 +, 作为除法
font: (italic bold 10px/8px); // 在一个列表(list)中,括号可以被忽略。
}
编译为:
p {
font: 10px/8px;
width: 500px;
width:;
height: 250px;
margin-left: 9px;
font: italic bold 10px/8px;
}
2.2 加法
加法可用于连接字符串
p {
cursor: e + -resize;
}
编译为:
p {
cursor: e-resize;
}
用作运算表达式
p {
margin: 3px + 4px auto;
}
编译为:
p {
margin: 7px auto;
}
三、嵌套
sass允许选择器嵌套
div {
h1 {
color: red;
}
}
编译为:
div h1 {
color: red;
}
属性嵌套
div {
border: {
width: 1px;
color: #ccc;
style: solid;
}
}
编译为:
div {
border-width: 1px;
border-color: #ccc;
border-style: solid;
}
注意:border必须加上后面的冒号。
在嵌套的代码块内,使用&引用父元素。
a {
color: #000;
&:hover{
color: blue;
}
}
编译为:
a {
color: #000;
}
a:hover {
color: blue;
}
如果没有父选择器,&的值将是空。这意味着你可以在一个mixin中使用它来检测父选择是否存在:
@mixin does-parent-exist {
@if & {
&:hover {
color: red;
}
} @else {
a {
color: red;
}
}
}
四、代码复用
4.1 @import
@import可以导入css文件也可导入sass文件。通常,@import会寻找 Sass 文件并将其导入,但在以下情况下,@import 仅作为普通的 CSS 语句,不会导入任何 Sass 文件。
- 如果文件的扩展名是
.css。 - 如果文件名以
http://开始。 - 如果文件名是
url()。 - 如果
@import中包含任何的媒体查询(media queries)。
//以下代码导入的是css文件
@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);
@import可同时导入多个文件
@import “reset.css”, "style";
@import导入的css文件在编译后不会被合并,但sass会被编译合并到css文件中。如果你有一个 SCSS 或 Sass 文件要导入,但不希望将其编译到一个CSS文件中,你可以在文件名的开头添加一个下划线,告诉Sass不要将其编译到一个正常的CSS文件中。但注意,在导入语句中不要添加下划线。例如:要导入的文件为"_main.scss",导入语句要写成:@import "main.scss";。另外注意,请不要将带下划线与不带下划线的同名文件放置在同一个目录下,因为带下划线的文件将会被忽略。
4.2 @extend
sass允许一个选择器继承另一选择器的样式,这也是工作中常遇到的需求。例如现在有class1
.class1 {
border: 1px solid #ccc;
background-color: #fff;
}
class2要继承class1的样式,可以使用@extend
.class1 {
border: 1px solid #ccc;
background-color: #fff;
}
.class2 {
@extend .class1;
font-size: 16px;
}
编译为:
.class1, .class2 {
border: 1px solid #ccc;
background-color: #fff;
}
.class2 {
font-size: 16px;
}
4.3 @mixin
混入(mixin)允许您定义可以在整个样式表中重复使用的样式,而避免了使用无语意的选择器。通过@mixin 加名称 就可以定义一个Mixins模块,在模块内你可以添加任何你想重复使用的样式。
@mixin btn {
height: 40px;
padding: 5px 10px;
text-decoration: none;
}
.btn-block{
@include btn;
display: block;
}
编译为:
.btn-block {
height: 40px;
padding: 5px 10px;
text-decoration: none;
display: block;
}
@mixin也可以包含在任何规则的外部(即,在文档的根),但注意不能被其他父选择器引用。
@mixin silly-links {
a {
color: blue;
background-color: red;
}
}
@include silly-links;
/*以下p选择器会报错*/
p{
font-size: 14px;
@include still-links;
}
编译为:
a {
color: blue;
background-color: red;
}
@mixin另一个重要用处是可以指定参数和缺省值。
@mixin left($value: 10px) {
float: left;
margin-left: $value;
}
div {
@include left(20px);
}
编译为:
div {
float: left;
margin-left: 20px;
}
利用混入,生成浏览器前缀的实例:
@mixin rounded($vert, $horz,$radius: 10px){
border-#{$vert}-#{$horx}-radius: $radius;
-moz-border-#{$vert}-#{$horx}radius: $radius;
-webkit- border-#{$vert}-#{$horx}-radius: $radius;
}
#navbar li { @include rounded(top, left); }
编译为:
#navbar li {
border-top-left-radius: 10px;
-moz-border-radius-topleft: 10px;
-webkit-border-top-left-radius: 10px;
}
五、高级语法
sass支持基本的控制语句和表达式。
5.1 @if...@else
$type: monster;
p {
@if $type == ocean {
color: blue;
} @else if $type == matador {
color: red;
} @else if $type == monster {
color: green;
} @else {
color: black;
}
} 编译为:
p {
color: green;
}
5.2 @for语句
该指令有两种形式:@for $var from <start> through <end> 和 @for $var from <start> to <end>。
@for $var from <start> through <end>:范围包括<start>和<end>的值。
@for $var from <start> to <end>:从<start>开始运行,但不包括<end>的值。
当<start>比<end>大的时候,计数器将递减,而不是增量。$var可以是任何变量名,比如$i。
@for $i from 1 through 3 {
.item-#{$i} {
border: #{$i}px solid #ccc;
}
}
@for $i from 3 to 1 {
.list-#{$i} {
border: #{$i}px solid #ccc;
}
}
编译为:
.item-1 {
border: 1px solid #ccc;
}
.item-2 {
border: 2px solid #ccc;
}
.item-3 {
border: 3px solid #ccc;
}
.list-3 {
border: 3px solid #ccc;
}
.list-2 {
border: 2px solid #ccc;
}
5.3 @while语句
$i:6;
@while $i > 0{
.item-#{$i} {
width: #{$i}em;
}
$i: $i - 2;
} 编译为:
.item-6 {
width: 6em;
} .item-4 {
width: 4em;
} .item-2 {
width: 2em;
}
5.4 @each
@each指令通常格式是@each $var in <list or map>。$var 可以是任何变量名,<list or map>是一个返回列表或map 的 SassScript 表达式。
@each $animal in puma, sea-slug, egret, salamander {
.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
}
}
编译为:
.puma-icon {
background-image: url("/images/puma.png");
}
.sea-slug-icon {
background-image: url("/images/sea-slug.png");
}
.egret-icon {
background-image: url("/images/egret.png");
}
.salamander-icon {
background-image: url("/images/salamander.png");
}
还可以多重赋值
@each $animal, $color, $cursor in (puma, black, default),(sea-slug, blue, pointer),(egret, white, move) {
.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
border: 2px solid $color;
cursor: $cursor;
}
}
编译为:
.puma-icon {
background-image: url("/images/puma.png");
border: 2px solid black;
cursor: default;
}
.sea-slug-icon {
background-image: url("/images/sea-slug.png");
border: 2px solid blue;
cursor: pointer;
}
.egret-icon {
background-image: url("/images/egret.png");
border: 2px solid white;
cursor: move;
}
@each 用在maps键值对中。注意maps用圆括号括起来,而不是大括号。
@each $key, $value in (h1:6em, h2:4em, h3:2em){
#{$key}{
height: $value;
}
}
编译为:
h1 {
height: 6em;
}
h2 {
height: 4em;
}
h3 {
height: 2em;
}
六、自定义函数
sass支持自定义函数,并能在脚本上下文中使用。
@function add($a, $b) {
@return $a + $b;
}
#sidebar {
width: add(5px,25px);
}
编译为:
#sidebar {
width: 30px;
}
学习Sass(二)的更多相关文章
- 学习Sass(一)
一.什么是sass? 写过css的都知道,css是用来改变页面样式的.但它不是一种编程语言,没有变量,函数,继承等功能,只能一条条抒写样式语句很死板.在这个工具决定效率的时代,这是不能容忍的事情.怎样 ...
- crawler4j 学习(二)
crawler4j 学习(二) 实现控制器类以制定抓取的种子(seed).中间数据存储的文件夹.并发线程的数目: public class Controller { public static voi ...
- 从零开始学习jQuery (二) 万能的选择器
本系列文章导航 从零开始学习jQuery (二) 万能的选择器 一.摘要 本章讲解jQuery最重要的选择器部分的知识. 有了jQuery的选择器我们几乎可以获取页面上任意的一个或一组对象, 可以明显 ...
- Android Animation学习(二) ApiDemos解析:基本Animators使用
Android Animation学习(二) ApiDemos解析:基本Animatiors使用 Animator类提供了创建动画的基本结构,但是一般使用的是它的子类: ValueAnimator.O ...
- AspectJ基础学习之二搭建环境(转载)
AspectJ基础学习之二搭建环境(转载) 一.下载Aspectj以及AJDT 上一章已经列出了他的官方网站,自己上去download吧.AJDT是一个eclipse插件,开发aspectj必装,他可 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- 学习Sass之安装Sass(一)
为什么使用Sass 作为前端(html.javascript.css)的三大马车之一的css,一直以静态语言存在,HTML5火遍大江南北了.javascript由于NODE.JS而成为目前前后端统一开 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- MyBatis学习 之 二、SQL语句映射文件(2)增删改查、参数、缓存
目录(?)[-] 二SQL语句映射文件2增删改查参数缓存 select insert updatedelete sql parameters 基本类型参数 Java实体类型参数 Map参数 多参数的实 ...
随机推荐
- beanutils中WrapDynaBean
public class Emp { private String firstName="李"; private String lastName; public ...
- MVC之验证
MVC之验证 有时候我觉得,很多人将一个具体的技术细节写的那么复杂,我觉得没有必要,搞得很多人一头雾水的,你能教会别人用就成了,具体的细节可以去查MSDN什么的,套用爱因斯坦的名言:能在网上查到的就不 ...
- document对象属性documentMode与CompatMode
DOCTYPE DOCTYPE全称Document Type Declaration(文档类型声明,缩写DTD) DTD的声明影响浏览器对于CSS代码及Javascript脚本的解析. 渲染模式 渲染 ...
- 开源Asp.Net MVC网上商城BrnShop
开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载 BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一 ...
- grep、egrep、fgrep的用法与特性详解
[转载自]http://tanxw.blog.51cto.com/4309543/1361993 开篇 学习Linux也有一段时间了,对Linux多少也算是有点了解了,越是了解也就越对这 ...
- 如何给非AppCompatActivity添加Toolbar?--关于5.0新特性兼容5.0以下设备的探索
Android支持包22.1引进了AppCompatDelegate 最新22.1版本的支持包引入了大量酷炫的新特性,这些特性将允许我们轻易地将材料设计/API 21+的特性应用到之前的那些老的,不兼 ...
- 重温HTML的基础
新年新气象,新的一年要有自己的学习计划与工作计划.希望大家能够共享. 经过一段时间,我想重新复习与学习一下HTML的基础,我呢打算整理一下W3C里面的知识,也许对某些人没有任何作用,但是对我来说这是我 ...
- 【IOS开发】如何画1像素的线
最近在项目中画了一根1像素的线,我是通过直接花一个但是通过PS查看,画了不止1个像素. 原代码语句: label1 = [[UILabel alloc] initWithFrame:CGRectMak ...
- OSGI原形(.NET)
OSGI原形(.NET) 目前只做了基础的功能,比如: 各个模块单独的AppDomain容器 Activator激活 导出的服务检查 不过,虽说这样,但目前的这个版本已经能实现模块分离.互相依赖调用等 ...
- Java 快速开发平台 WB 6.8 发布
WebBuilder是一款开源的可视化Web应用开发和运行平台. 基于浏览器的集成开发环境,采用可视化的设计模式,支持控件的拖拽操作,能轻松完成前后台应用开发: 高效.稳定和可扩展的特点,适合复杂企业 ...