标签:style class http tar ext color
less在处理CSS动画时,非常恶心,决定转向sass了。sass诞生得比less早,只是因为它是ruby写的,因此受众面够少。但我们不需要自己下编译器或使用命令行,我们可以koala这神器
首先几个注意点,sass可以用sass后缀名,也可以用scss后缀名。前者比较恶心,像python一样没有花括号,也不让写分号,散架子一样。因此推荐用scss,这个也是目前我遇到的大部分人的选择。
关于中文编译出错的问题,需要指定字符集。
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$fontSize: 12px;
body{
font-size:$fontSize;
}
/* 测试注释 */
$side : left;
.rounded {
border-#{$side}-radius: 5px;
}
注释的问题,sass有两种注释方式,一种是标准的css注释方式/* */,另一种则是//双斜杆形式的单行注释,不过这种单行注释不会被转译出来。
导入的问题,它还是用@import关键字,但做了一些处理,如果后缀名是css,那么它不会对此导入文件进行编译,如果是sass,scss或没有写,那么就会编译。
@import "reset.css";
@import "a";
p{
background: #0982c1;
}
好了,我们正式开始学习它的语法。sass既然是一门正统的编程语言,就有对应的变量,数据结构,函数等东西。
sass使用PHP风格的$开头的变量命名风格,使用ruby风格#{ }占位符
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$borderDirection: top !default;
$fontSize: 12px !default;
$baseLineHeight: 1.5 !default;
//应用于class和属性
.border-#{$borderDirection}{
border-#{$borderDirection}:1px solid #ccc;
}
//应用于复杂的属性值
body{
font:#{$fontSize}/#{$baseLineHeight};
}
$base: ".module";
#{$base} {
{$base}-something {
background: red;
}
}
//-------------------------------
.border-top {
border-top: 1px solid #ccc; }
body {
font: 12px/1.5; }
.module.module-something {
background: red; }
变量与占位符,可以让我们构建复杂可重用的属性值。
默认值,写法有点类似!important,但优先级最低。
$baseLineHeight: 2;
$baseLineHeight: 1.5 !default;
body{
line-height: $baseLineHeight;
}
//-------------------------------
body{
line-height:2;
}
编译后的line-height为2,而不是我们默认的1.5。默认变量的价值在进行组件化开发的时候会非常有用。
数据结构方面,它拥有类似数组的list类型,类似对象的map类型
sass的数组,是通过空格来划分元素,如果是二维组数,则需要用到小括号与逗号。
//一维数组 $array: 5px 10px 20px 30px; //二维数组 $array2: 5px 10px, 20px 30px; $array3: (5px 10px) (20px 30px);
sass的数组有一个特点,没有用[]包起来,也不能用[]来取其中的某一个元素,要用需要用到nth内置方法,并且nth与CSS3的nth-child一样,是从1开始。
$linkColor: #08c #333 #ccc;
a{
color:nth($linkColor,1);
&:hover{
color:nth($linkColor,2);
}
}
//css style
//-------------------------------
a{
color:#08c;
}
a:hover{
color:#333;
}
相关操作数组的方法
join($list1, $list2, $separator:auto) //合并两个数组 join(10px 20px, 30px 40px) => 10px 20px 30px 40px join((blue, red), (#abc, #def)) => blue, red, #abc, #def join(10px, 20px) => 10px 20px join(10px, 20px, comma) => 10px, 20px join((blue, red), (#abc, #def), space) => blue red #abc #def index($list, $value) //取得目标在数组的位置,以1开始 index(1px solid red, solid) => 2 index(1px solid red, dashed) => null index((width: 10px, height: 20px), (height 20px)) => 2 length($list) //取得数组的长度 length(10px) => 1 length(10px 20px 30px) => 3 length((width: 10px, height: 20px)) => 2 list_separator($list) //取得数组的分隔符 list-separator(1px 2px 3px) => space list-separator(1px, 2px, 3px) => comma list-separator(‘foo‘) => space nth($list, $n) //取得数组在某一位置上的元素 nth(10px 20px 30px, 1) => 10px nth((Helvetica, Arial, sans-serif), 3) => sans-serif nth((width: 10px, length: 20px), 2) => length, 20px
sass的对象与JS的对象很相似,唯一不同的是,它是用小括号括起来,因为花括号用作各种嵌套边界。同时,为了操作sass对象,它提供了比JS丰富多的函数,它们基本是以map-开头(全部小写并且用“-”连起来是纯正的ruby风格)。
$heading: (h1: 2em, h2: 1.5em, h3: 1.2em);
下面是方法演示
map-get
//取得对象的某一属性的值
map-get(("foo": 1, "bar": 2), "foo") => 1
map-get(("foo": 1, "bar": 2), "bar") => 2
map-get(("foo": 1, "bar": 2), "baz") => null
map-remove($map, $key)
//删掉某一键值对
map-remove(("foo": 1, "bar": 2), "bar") => ("foo": 1)
map-remove(("foo": 1, "bar": 2), "baz") => ("foo": 1, "bar": 2)
map-keys($map)
//取得它的所有属性名,以数组形式返回
map-keys(("foo": 1, "bar": 2)) => "foo", "bar"
map-values($map)
//取得它的所有属性值,以数组形式返回
map-values(("foo": 1, "bar": 2)) => 1, 2
map-values(("foo": 1, "bar": 2, "baz": 1)) => 1, 2, 1
map-has-key($map, $key)
//判定它是否拥有某一个属性
map-has-key(("foo": 1, "bar": 2), "foo") => true
map-has-key(("foo": 1, "bar": 2), "baz") => false
map-merge($map1, $map2)
//合并两个对象
map-merge(("foo": 1), ("bar": 2)) => ("foo": 1, "bar": 2)
map-merge(("foo": 1, "bar": 2), ("bar": 3)) => ("foo": 1, "bar": 3)
流程控制: @if,@else, @for,@each和@while
@if非常简单,我们直接看例子
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$boolean: true !default;
@mixin simple-mixin {
@if $boolean {
display: block;
} @else {
display: none;
}
}
.some-selector {
@include simple-mixin;
}
//------------------------------
.some-selector {
display: block; }
说到这个,sass有一个if内置方法,用于模拟三目运算符。
@if $width != auto {
$width: if(unitless($width), $width + px, $width);
}
@for有两种形式, @for xxx form yyy through zzz或@for xxx form yyy to zzz,需要用户指定开始值与结束值,它们都应该是数字。
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$name: for !default;
//相当于JS的 for(var $i = 1; $i <= 4; $i++){}
@for $i from 1 through 4 {
.#{$name}-#{$i}{
width: 60px + $i;
}
}
//------------------------------
.for-1 {
width: 61px; }
.for-2 {
width: 62px; }
.for-3 {
width: 63px; }
.for-4 {
width: 64px; }
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$name: for !default;
//相当于JS的 for(var $i = 1; $i < 4; $i++){}
@for $i from 1 to 4 {
.#{$name}-#{$i}{
width: 60px + $i;
}
}
//------------------------------
.for-1 {
width: 61px; }
.for-2 {
width: 62px; }
.for-3 {
width: 63px; }
@for循环指令除了可以从小数值到大数值循环之外,还可以从大数值循环到小数值。而且两种形式都支持。
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$name: for !default;
//由于开始值大于结束值,因此是递减,相当于for(var $e = 5; $e >= 1; $e--){}
@for $e from 5 through 1 {
.#{$name}-#{$e}{
width: 60px + $e;
}
}
//------------------------------
.for-5 {
width: 65px; }
.for-4 {
width: 64px; }
.for-3 {
width: 63px; }
.for-2 {
width: 62px; }
.for-1 {
width: 61px; }
@each 是用于遍历数组与对象的。
如果是遍历数组, @each跟着的是元素的变量名,随便起,接着是in,最后是数组名。
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$list: adam john wynn mason kuroir;
@mixin author-images {
@each $author in $list {
.photo-#{$author} {
background: url("/images/avatars/#{$author}.png") no-repeat;
}
}
}
.author-bio {
@include author-images;
}
//------------------------------
.author-bio .photo-adam {
background: url("/images/avatars/adam.png") no-repeat; }
.author-bio .photo-john {
background: url("/images/avatars/john.png") no-repeat; }
.author-bio .photo-wynn {
background: url("/images/avatars/wynn.png") no-repeat; }
.author-bio .photo-mason {
background: url("/images/avatars/mason.png") no-repeat; }
.author-bio .photo-kuroir {
background: url("/images/avatars/kuroir.png") no-repeat; }
如果是遍历对象,后面跟着两个变量,分别是键名与键值,逗号隔开,接着是in,最后是对象名。
@charset "utf-8";//必须设置了这个才能编译有中文的注释
@each $key, $val in (h1: 2em, h2: 1.5em, h3: 1.2em) {
#{$key} {
font-size: $val;
}
}
//------------------------------
h1 {
font-size: 2em; }
h2 {
font-size: 1.5em; }
h3 {
font-size: 1.2em; }
@while与JS的while非常相似
@charset "utf-8";//必须设置了这个才能编译有中文的注释
$types: 4;
$type-width: 20px;
@while $types > 0 {
.while-#{$types} {
width: $type-width + $types;
}
$types: $types - 1;
}
//------------------------------
.while-4 {
width: 24px; }
.while-3 {
width: 23px; }
.while-2 {
width: 22px; }
.while-1 {
width: 21px; }
今天就到这里吧,大家看了,不要指望可以用它来写CSS,因为还有一些重要的概念没介绍。但光凭我们现在了解的东西,对于那些学过less的人来说,真是打击极大。显然,从易用性,功能等方面,已远胜less了。
to be continue...
标签:style class http tar ext color
原文地址:http://www.cnblogs.com/rubylouvre/p/3794292.html