Sass作为CSS的一种延伸,我知道之后内心一直十分喜悦。
Sass可以做运算,可以配置,可以嵌套,非常灵活。
写在前面!
compass是基于SASS二次开发的工具。
1、SASS最后是生成CSS!!!
2、SASS自3.0以后就使用*.scss为后缀,而不再使用*.sass(空格敏感)
3、问题是bootstrapV4 需要写或生成sass吗?
4、尴尬的是学完之后,发现如果只是使用Bootstrap,则并会用到SASS的知识。因为Bootstrap已经封装好啦。
现在开始!
1、使用变量
1.1、声明变量
老版本用"!",新版用"$" ,理解为类似 JS 的 var 之类的
$highlight-color: #F90;
1.2、声明引用
$highlight-color:#F90;
$highlight-border: 1px solid $highlight-color;
.selected {
border: $highlight-border;
}//编译后
.selected {
border: 1px solid #F90;
}
PS:SASS中不分下划线_和短横线-
$link-color: blue;
a {
color: $link_color;
}
2、嵌套CSS规则
#content {
article {
h1 { color: #333 }
p { margin-bottom: 1.4em }
}
#content aside { background-color: #EEE }
}
/* 编译后 */
#content article h1 { color: #333 }
#content article p { margin-bottom: 1.4em }
#content aside { background-color: #EEE }
2.1、父选择器的标识符&
如果未加入&符号,则article所有的子元素都会被hover时变成红色。
加入后则,只有父类本身变色。
article a { color: blue;
:hover { color: red }
}
2.2、群组选择器的嵌套
所有.container的 h1、h2、h3同时嵌套,不用再重复书写。
.container {
h1, h2, h3 {margin-bottom: .8em}
}
nav, aside {
a {color: blue}
}
2.3、子组合选择器和同层组合选择器:>、+和~
> : 子组合选择器 : 代表直接紧跟的子元素
article section { margin: 5px }
article section { border: 1px solid #ccc }
上例中,第一个选择器会选择article下的所有命中section选择器的元素。
第二个选择器只会选 着的子元素中命中section选择器的元素。
+
: 同层相邻组合选择器 代表只关联同层且相邻的元素。
header p { font-size: 1.1em }
~ : 同层全体组合选择器:代表只要是同层,不管在是否相邻都能关联。
article ~ article { border-top: 1px dashed #ccc }
组合拳:
article {
~ article { border-top: 1px dashed #ccc }
> section { background: #eee }
dl > {
dt { color: #333 }
dd { color: #555 }
}
nav + & { margin-top: 0 }
}
SASS会自动解套并重新组合在一起:
article ~ article { border-top: 1px dashed #ccc }
article > footer { background: #eee }
article dl > dt { color: #333 }
article dl > dd { color: #555 }
nav + article { margin-top: 0 }
2.4、嵌套属性
只需要输入一个border~~~ 效率就是生产力!!!
nav {
border: 1px solid #ccc {
left: 0px;
right: 0px;
}
}
3、导入SASS文件
3.1、使用SASS部分文件
你想导入themes/_night-sky.scss
这个局部文件里的变量,你只需在样式表中写@import
"themes/night-sky";
引入sass可以重复利用。便于编程。
3.2、默认变量值 !default
一般情况下,你反复声明一个变量,只有最后一处声明有效且它会覆盖前边的值。
$fancybox-width: 400px !default;
.fancybox {
width: $fancybox-width;
}
含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。
如果用户在导入你的sass
局部文件之前声明了一个$fancybox-width
变量,那么你的局部文件中对$fancybox-width
赋值400px
的操作就无效。如果用户没有做这样的声明,则$fancybox-width
将默认为400px
。
3.3、嵌套导入
有一个文件 _blue-theme.scss
,内容如下:
aside {
background: blue;
color: white;
}
然后把它导入到一个CSS规则内,如下所示:
.blue-theme {@import "blue-theme"}
//生成的结果跟你直接在.blue-theme选择器内写_blue-theme.scss文件的内容完全一样。.blue-theme {
aside { background: blue;
color: #fff;
}
}
3.4、原生的CSS导入;
由于sass
兼容原生的css
,所以它也支持原生的CSS@import
。尽管通常在sass
中使用@import
时,sass
会尝试找到对应的sass
文件并导入进来,但在下列三种情况下会生成原生的CSS@import
:
被导入文件的名字以
.css
结尾;被导入文件的名字是一个URL地址(比如http://www.sass.hk/css/css.css),由此可用谷歌字体API提供的相应服务;
被导入文件的名字是
CSS
的url()值。
因为sass
的语法完全兼容css
,所以你可以把原始的css
文件改名为.scss
后缀导入进来。
4、静默注释
SASS生成CSS时,将会删掉注释。
body {
color: #333; // 这种注释内容不会出现在生成的css文件中
padding: 0; /* 这种注释内容会出现在生成的css文件中 */
}
5、混合器 @mixin
混合器使用@mixin
标识符定义。
@mixin rounded-corners {
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
我理解为它不带参数时,是一种嵌套。但在使用上,会更加灵活!另外,@mixin支持带参数,更加灵活。
notice {
background-color: green;
border: 2px solid #00aa00;
@include rounded-corners;
}
//sass最终生成:
.notice {
background-color: green;
border: 2px solid #00aa00;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
}
5.1、何时使用混合器
略。
5.2、混合器中的CSS规则
这是不带参数的混合器,并且说明,混合器内支持css嵌套。
设置一个混合器:
@mixin no-bullets {
list-style: none;
li {
list-style-image: none;
list-style-type: none;
margin-left: 0px;
}
}
在sass中使用这个混合器:
ul.plain {
color: #444;
@include no-bullets;
}
生成的样式如下:
ul.plain {
color: #444;
list-style: none;
}
ul.plain li {
list-style-image: none;
list-style-type: none;
margin-left: 0px;
}
5.3、给混合器传参
设置一个混合器:
@mixin link-colors($normal, $hover, $visited) {
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
当混合器被@include
时,你可以把它当作一个css
函数来传参。如果你像下边这样写:
a {
@include link-colors(blue, red, green);
}
//Sass最终生成的是:
a { color: blue;}
a:hover { color: red; }
a:visited { color: green; }
sass
允许通过语法$name: value
的形式指定每个参数的值。
a {
@include link-colors(
$normal: blue,
$visited: green,
$hover: red
);
}
5.4、默认参数值
为了在@include
混合器时不必传入所有的参数,我们可以给参数指定一个默认值。
@mixin link-colors(
$normal,
$hover: $normal,
$visited: $normal
)
{
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
如果这样调用:@include link-colors(red)
$hover
和$visited
也会被自动赋值为 red
。
6、使用选择器继承来精简CSS @extend
选择器继承是说一个选择器可以继承为另一个选择器定义的所有样式。
6.1、何时使用继承
其中一个类,是另外一个类的细化时。
比如,.error是基础 ;.seriousError是细化
6.2、默认参数值
.error{
color:red;
}
.seriousError{
@extend .error;
border:1px solid red;
}
6.3、继承的工作细节
关于@extend
有两个要点你应该知道。
跟混合器相比,继承生成的
css
代码相对更少。因为继承仅仅是重复选择器,而不会重复属性,所以使用继承往往比混合器生成的css
体积更小。如果你非常关心你站点的速度,请牢记这一点。继承遵从
css
层叠的规则。当两个不同的css
规则应用到同一个html
元素上时,并且这两个不同的css
规则对同一属性的修饰存在不同的值,css
层叠规则会决定应用哪个样式。相当直观:通常权重更高的选择器胜出,如果权重相同,定义在后边的规则胜出。
PS : @extend 不能用嵌套多种选择器。
7、小结
SASS文件是基于Ruby的,如果要使用,请安装Ruby。
SASS是CSS的高级编辑器,最后会生成CSS文件。
SASS自3.0开始,使用的是*.scss后缀。切所有*.scss文件放在同一目录下。
@mixin 混合器!
@include 加载混合器!
@extend 继承,各种继承。