sass基本语法

1.定义一个变量,变量定义以$开头,以冒号分隔开。

$blue:#1875e7;
div{
color:$blue;
} 编译之后的css代码:
div {
color: #1875e7;
}

定义一个带默认值的变量。默认变量只需要在普通变量后面加上 !default

$baseLineHeight:1.5 !default;
$baseLineHeight:3;
body{
line-height:$baseLineHeight;
} 编译后的css代码:
body {
line-height:;
}

line-height的默认值是1.5,然后被3覆盖了,所以值是3. 和赋值的先后顺序无关,即使把默认值放到赋值的后面,结果也还是3.

此外,sass局部变量和全局变量(sass 3.4之后的版本才会有局部变量,3.4之前的都是全局变量)。变量值后面加上!global 变成全局变量。

/* sass3.4之后的版本 */
$fontSize:16px;
body{
$fontSize:20px;
font-size:$fontSize;
}
p{
font-size:$fontSize;
} 编译之后的css代码:
body {
font-size: 20px; } p {
font-size: 16px; }//3.4之前的版本值是20px,因为都是全局变量

使用全局变量之后,sass 3.4之后才能转换成功

$fontSize:16px;
body{
$fontSize:20px !global;
font-size:$fontSize;
}
p{
font-size:$fontSize;
} 转换之后css代码:
body {
font-size: 20px; }
p {
font-size: 20px; }

变量作为属性名来使用(一般我们定义的变量都是属性值),要以#{$variableName}形式。

$side:left;
div{
border-#{$side}-radius:5px;
}
//转化之后的css代码:
div {
border-left-radius: 5px; }

2.变量复杂一点的用法,多值变量。多值变量分为list类型和map类型,list类似js数组,map类似js中的对象。list数据可以通过空格,逗号,小括号分隔多个值,常用的函数,nth($list,$index), length($list), append($list, $value, [$separator]).

$pxs:5px 10px 15px 20px;
h8{
margin-left:nth($pxs,1);
&:hover{
margin-top:nth($pxs,2);
}
}
//转换之后的css代码:
h8 {
margin-left: 5px;
}
h8:hover {
margin-top: 10px;
}

list另外一个栗子,

$pxs:5px,10px,15px,20px;
h9{
$len:length($pxs);
margin-right:nth($pxs,$len);
}
//转换之后的css:
h15 {
margin-right: 20px;
}

map类型的例子。。。map数据以key和value成对出现。看看w3cplus上的一个例子。开始的时候,总是转换失败,后面发现是sass版本的问题,我sass用的是3.4.21版本,之前用的是3.2.13老是转换失败,还以为是语法写的有错误呢。。。

$headings: (h1: 2em, h2: 1.5em, h3: 1.2em);
@each $header, $size in $headings {
#{$header} {
font-size: $size;
}
}
//转化过后的css
h1 {
font-size: 2em;
}
h2 {
font-size: 1.5em;
}
h3 {
font-size: 1.2em;
}

3.嵌套,嵌套包括两种:选择器嵌套 和 属性嵌套。

选择器嵌套,在一个选择器中嵌套另一个选择器,通过&引用外层选择器。

$blue:#1875e7;
a{
color:red;
&:hover{
color:$blue;
}
}
//转换后的css
a {
color: red;
}
a:hover {
color: #1875e7;
}

属性嵌套,有些属性拥有相同的前缀,可以提取出来,书写更方便。

/*属性嵌套*/
h16{
margin:{
left:5px;
right:15px;
}
}
//转换之后的css
/*属性嵌套*/
h16 {
margin-left: 5px;
margin-right: 15px;
}

4.继承, 选择器的继承可以让选择器继承另一个选择器的所有样式,要使用关键词@extend ,后面紧跟要继承的选择器。

/*选择器的继承*/
.class1{
border:1px;
}
.class2{
@extend .class1;
font-size:120%;
}
//转换之后的css
.class1, .class2 {
border: 1px;
}
.class2 {
font-size: 120%;
}

占位选择器% ,占位选择器的优势是,对于预先定义的基础样式,需要的时候使用@extend去继承它,不需要的时候,不会继承到。

%ir{
color: transparent;
border:;
}
#header{
h1{
@extend %ir;
width:300px;
}
h2{
width:500px;
}
}
.ir{
@extend %ir;
}
//转换之后的css
#header h1, .ir {
color: transparent;
border:;
}
#header h1 {
width: 300px;
}
#header h2 {
width: 500px;
}

5.函数,sass已经定义好了很多函数,可以直接使用,如:length($list) ,nth($list,$n) .也可以自己定义一个函数使用@function。

下面是把px转换成rem的例子。

$baseFontSize:16px!default;
@function pxToRem($px){
@return $px/$baseFontSize*1rem;
}
body{
font-size:pxToRem(10px);
}
//转换之后的css
body {
font-size: 0.625rem;
}

6.混合(mixin),混合定义可重用的代码块,sass中通过@mixin来声明混合,@include来调用。

@mixin left($value:10px){
float:left;
margin-right:$value;
}
h16{
@include left(5px);
}
h17{
@include left();
}
//转换后的css
h16 {
float: left;
margin-right: 5px;
}
h17 {
float: left;
margin-right: 10px;
}

@content 用来解决css3的@media问题。。。。。。。。。。。。

@mixin 可以接受一整块样式,接受的样式从@content开始。

@mixin max-screen($res){
@media only screen and (max-width:$res){
@content;
}
}
@include max-screen(480px){
body{color:red;}
}
//转换后的css
@media only screen and (max-width: 480px) {
body { color: red; }
}

7.条件判断及循环。

a.@if{}@else{}

b.@if($condition,$if_true,$if_else)

c.@for($i from <start> through <end>) 包含end

d.@for($i from <start> to <end>) 不包含end

e.@each $item in <list or map>

之前在写@each 的时候碰到个问题。我之前使用的是sass3.2.13版本 对于对字段循环不支持,sass3.3.0之后的版本才会支持哦。不然转换时一直会报错,不能成功。

$headings: (h1: 2em, h2: 1.5em, h3: 1.2em);
@each $header, $size in $headings {
#{$header} {
font-size: $size;
}
}
//转换成css
h1 {
font-size: 2em;
}
h2 {
font-size: 1.5em;
}
h3 {
font-size: 1.2em;
}

把px转换成rem,支持同时输入多个值,以及一些特殊值如0的输入。

@function rem($values...) {
$all_rem: ();
$separator: list-separator($values);
@each $value in $values {
$rem: null;
@if type-of($value) == list {
// List: process each value on its own
$rem: rem($value...);
} @else if is_zero($value) {
// Zero: enforce no units
$rem: 0;
} @else if need_convert($value) {
// if need convert we will convert it to rem depend on the base font size.
$base_font_value: strip_units($rem_font_size);
$rem: (strip_units($value / $base_font_value) * 1rem);
} @else {
$rem: $value;
}
$all_rem: append($all_rem, $rem, $separator);
}
@return $all_rem;
} @function strip_units($num) {
@return $num / (($num * 0) + 1);
}
@function is_zero($value) {
@return
type-of($value) == number
and strip_units($value) == 0;
}
@function need_convert($value) {
$px_units: 'px', 'pt';
@return
type-of($value) == number
and not unitless($value)
and index($px_units, unit($value));
}

px convert to rem

测试一下

div{
padding:rem(0 5px 0 10px);
}
//转换之后的css
div {
padding: 0rem 0.3125rem 0rem 0.625rem;
}

sass 语法实例的更多相关文章

  1. SASS语法备忘

    sass语法 关于sass 3.3.0更新说明——3.3.0 sublime相关插件为:scss语法高亮,sass语法高亮,编译,保存即编译,格式化 文件后缀名 sass有两种后缀名文件:一种后缀名为 ...

  2. Esfog_UnityShader教程_UnityShader语法实例浅析

    距离上次首篇前言已经有一段时间了,一直比较忙,今天是周末不可以再拖了,经过我一段时间的考虑,我决定这一系列的教程会避免过于深入细节,一来可以避免一些同学被误导,二来会避免文章过于冗长难读, 三来可以让 ...

  3. 为sublime text2 添加SASS语法高亮

    以前写CSS时,都是直接写样式,没有任何的第三方工具,后面发现越是面向大网站,越难管理,上次参加完携程UED大会后,发现SASS对于前端团队多人协作和站点代码维护上很有帮助,很多同学都开始用了,我还是 ...

  4. jQuery的基础语法实例

    jQuery 基础语法 jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作. 基础语法是:$(selector).action() 美元符号定义 jQuery 选择符(sele ...

  5. JSON.stringify 语法实例讲解+easyui data-options属性+expires【申明:来源于网络】

    JSON.stringify 语法实例讲解+easyui data-options属性+expires[申明:来源于网络] JSON.stringify 语法实例讲解:http://www.jb51. ...

  6. (转)Esfog_UnityShader教程_UnityShader语法实例浅析

    距离上次首篇前言已经有一段时间了,一直比较忙,今天是周末不可以再拖了,经过我一段时间的考虑,我决定这一系列的教程会避免过于深入细节,一来可以避免一些同学被误导,二来会避免文章过于冗长难读, 三来可以让 ...

  7. 1-3 Sass 语法、编译、调试

    Sass 语法格式 这里说的 Sass 语法是 Sass 的最初语法格式,他是通过 tab 键控制缩进的一种语法规则,而且这种缩进要求非常严格.另外其不带有任何的分号和大括号.常常把这种格式称为 Sa ...

  8. Sass 语法格式及编译

    一.sass语法格式 这里说的 Sass 语法是 Sass 的最初语法格式,他是通过 tab 键控制缩进的一种语法规则,而且这种缩进要求非常严格.另外其不带有任何的分号和大括号.常常把这种格式称为 S ...

  9. SQLSERVER存储过程的基本语法实例

    SQLSERVER存储过程的基本语法实例 SQLSERVER存储过程的基本语法实例 一.定义变量--简单赋值 declare @a intset @a=5 print @a --使用select语句赋 ...

随机推荐

  1. centos6.5 Eclipse C/C++开发环境及项目创建测试

    1,新建C++ project

  2. 《UNIX环境高级编程》笔记--文件访问权限和新文件、目录所有权

    1.与进程关联的用户ID和组ID 与一个进程关联的ID有一下几个: 实际用户ID和实际组ID标识我们究竟是谁.通常在一个会话间值是不会改变的,但是超级用户进程有方法改变 他们,在以后的进程控制中会进行 ...

  3. JQuery UI 精品UI推荐

    1.JQuery MiniUi  http://www.miniui.com/

  4. HTML字符实体(Character Entities),转义字符串(Escape Sequence)【转】

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  5. oauth2认证

    using System; using System.Collections.Generic; using System.Security.Cryptography; using System.Con ...

  6. Swift中编写单例的正确方式

    在之前的帖子里聊过状态管理有多痛苦,有时这是不可避免的.一个状态管理的例子大家都很熟悉,那就是单例.使用Swift时,有许多方法实现单例,这是个麻烦事,因为我们不知道哪个最合适.这里我们来回顾一下单例 ...

  7. 动画原理——线性来回运动&&波动

    书籍名称:HTML5-Animation-with-JavaScript 书籍源码:https://github.com/lamberta/html5-animation 1.在正选函数中,随角度的增 ...

  8. How to select a CRAN mirror in R & use repos parameter(2)

    首次添加功能包需要设定CRAN镜像库: 方法是依据提示:--- Please select a CRAN mirror for use in this session ---,在弹出的窗口中选择CRA ...

  9. error C4996 The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name

    error C4996: 'strupr': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ co ...

  10. QF——网络之网络请求的几种方式,图片缓存

    同步请求和异步请求: 同步请求会阻塞主线程:不会开启新的线程,还是主线程,所以直到请求成功后,才能执行其它操作. 异步请求不会阻塞主线程.开启新的线程去请求服务器,而不影响用户的交互操作等其他动作. ...