SASS有两种后缀文件:一种后缀名为sass,不适用大括号和分号;另一种是scss文件,这种和我们平时写的css文件格式相差不大,使用大括号和分号。本篇文章讲解主要为scss,建议使用后缀名为scss的文件。
//文件后缀名为scss的语法
body{
background:#eee;
font-size:12px;
p{
background:#145156;
}
}
导入
SASS导入(@import)规则和css有所不同,编译时会将@import的scss文件合并。但是如果导入css后缀名文件就和普通css导入无差别。
//a.scss
//----------------------------
body{
font-size:16px;
}
需导入样式的sass文件b.scss
@import "reset.css";
@import "a";
p{
font-size:12px;
}
编译出的css:
@import "reset.css";
body{
font-size:16px;
}
p{
font-size:12px;
}
注释
sass有两种注释方式,一种是标准的css注释样式/**/
,另一种是双斜杠形式的单行注释(不会转译到css中)。
变量
SASS的变量必须是$开头,后面紧跟变量名,而变量值和变量名之间需使用冒号(:)分隔开,如果值后面跟上 !default
则表示默认值。
普通变量
定义之后可以在全局范围内使用。
//sass style
//----------------------
$fontSize: 12px;
body{
font-size:$fontSize;
}
//css style
//-----------------------
body{
font-size:12px;
}
默认变量
sass的默认变量一般是用来设置默认值,然后根据需求来覆盖,覆盖的方式是在默认变量之前重新声明下变量即可
//sass style
//-------------------------------
$baseLineHeight: 2;
$baseLineHeight: 1.5 !default;
body{
line-height: $baseLineHeight;
}
//css style
//-------------------------------
body{
line-height:2;
}
在这里默认值被覆盖,并作用于全局。接下来,看一看选择器中定义局部变量和全局变量测试
//覆写default
$fontSize:16px;
//定义默认样式
$fontSize:12px !default;
//覆写测试
ul{
font-size:$fontSize;//16px
}
//局部覆写测试&&选择器中定义局部变量测试
li{
$fontSize: 18px;
font-size:$fontSize;//18px
}
a{
font-size:$fontSize;//16px
}
//选择器中定义全局变量测试
.demo2{
$fontSize: 20px !global;
font-size:$fontSize;//20px
}
.deom3{
font-size:$fontSize;//20px;
}
总结:scss实际上就是一个编程语言,有它的作用域,函数和变量。在全局定义的可在全局使用,在局部定义的局部变量只能在局部使用,定义加上!global
或者!default
便可以在其他选择器作用域中使用。
特殊变量
一般定义的变量都为属性值,可直接使用。但如果变量作为属性
或在某些特殊情况下等则必须要以#{$variables}形式使用。
//sass style
//-------------------------------
$borderDirection: top !default;
$baseFontSize: 12px !default;
$baseLineHeight: 1.5 !default;
//应用于class和属性
.border-#{$borderDirection}{
border-#{$borderDirection}:1px solid #ccc;
}
//应用于复杂的属性值
body{
font:#{$baseFontSize}/#{$baseLineHeight};
}
//css style
//-------------------------------
.border-top{
border-top:1px solid #ccc;
}
body {
font: 12px/1.5;
}
多值变量
多值变量分为list类型和map类型,简单说list类型有点像js中的数组,而map类型有点像js中对象。
list
list数据可通过空格,逗号或者小括号分隔多个值。可用nth($var,$index)取值。关于list数据操作还有很多其他函数如length($list),join($list1,$list2,[$separator]),append($list,$value,[$separator])等,具体可参考sass Functions(搜索List Functions即可)。
定义
//一维数据
$px: 5px 10px 20px 30px;
//二维数据,相当于js中的二维数组
$px: 5px 10px, 20px 30px;
$px: (5px 10px) (20px 30px);
使用
//sass style
//-------------------------------
$linkColor: #08c #333 !default;//第一个值为默认值,第二个鼠标滑过值
a{
color:nth($linkColor,1);
&:hover{
color:nth($linkColor,2);
}
}
//css style
//-------------------------------
a{
color:#08c;
}
a:hover{
color:#333;
}
map
map数据以key和value成对出现,其中value又可以是list。格式为:$map: (key1: value1, key2: value2, key3: value3);。可通过map-get($map,$key)取值。关于map数据还有很多其他函数如map-merge($map1,$map2),map-keys($map),map-values($map)等,具体可参考sass Functions(搜索List Functions即可)。
嵌套
所谓选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性。在选择器嵌套中,可以使用&表示父元素选择器.
选择器嵌套
//sass style
//-------------------------------
#top_nav{
line-height: 40px;
text-transform: capitalize;
background-color:#333;
li{
float:left;
}
a{
display: block;
padding: 0 10px;
color: #fff;
&:hover{
color:#ddd;
}
}
}
//css style
//-------------------------------
#top_nav{
line-height: 40px;
text-transform: capitalize;
background-color:#333;
}
#top_nav li{
float:left;
}
#top_nav a{
display: block;
padding: 0 10px;
color: #fff;
}
#top_nav a:hover{
color:#ddd;
}
属性嵌套
所谓属性嵌套指的是有些属性拥有同一个开始单词,如border-width,border-color都是以border开头。拿个官网的实例看下:
/sass style
//-------------------------------
.fakeshadow {
border: {
style: solid;
left: {
width: 4px;
color: #888;
}
right: {
width: 2px;
color: #ccc;
}
}
}
//css style
//-------------------------------
.fakeshadow {
border-style: solid;
border-left-width: 4px;
border-left-color: #888;
border-right-width: 2px;
border-right-color: #ccc;
}
@-root
sass3.3.0中新增的功能,用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。
普通跳出
//sass style
//-------------------------------
//没有跳出
.parent-1 {
color:#f00;
.child {
width:100px;
}
}
//单个选择器跳出
.parent-2 {
color:#f00;
@at-root .child {
width:200px;
}
}
//多个选择器跳出
.parent-3 {
background:#f00;
@at-root {
.child1 {
width:300px;
}
.child2 {
width:400px;
}
}
}
//css style
//-------------------------------
.parent-1 {
color: #f00;
}
.parent-1 .child {
width: 100px;
}
.parent-2 {
color: #f00;
}
.child {
width: 200px;
}
.parent-3 {
background: #f00;
}
.child1 {
width: 300px;
}
.child2 {
width: 400px;
}
@at-root (without: ...)和@at-root (with: ...)
默认@at-root只会跳出选择器嵌套,而不能跳出@media或@support,如果要跳出这两种,则需使用@at-root (without: media),@at-root (without: support)。这个语法的关键词有四个:all(表示所有),rule(表示常规css),media(表示media),support。我们默认的@at-root其实就是@at-root (without:rule)。
/sass style
//-------------------------------
//跳出父级元素嵌套
@media print {
.parent1{
color:#f00;
@at-root .child1 {
width:200px;
}
}
}
//跳出media嵌套,父级有效
@media print {
.parent2{
color:#f00;
@at-root (without: media) {
.child2 {
width:200px;
}
}
}
}
//跳出media和父级
@media print {
.parent3{
color:#f00;
@at-root (without: all) {
.child3 {
width:200px;
}
}
}
}
//sass style
//-------------------------------
@media print {
.parent1 {
color: #f00;
}
.child1 {
width: 200px;
}
}
@media print {
.parent2 {
color: #f00;
}
}
.parent2 .child2 {
width: 200px;
}
@media print {
.parent3 {
color: #f00;
}
}
.child3 {
width: 200px;
}
@at-root与&配合使用
//sass style
//-------------------------------
.child{
@at-root .parent &{
color:#f00;
}
}
//css style
//-------------------------------
.parent .child {
color: #f00;
}
混合(mixin)
sass中使用@mixin声明混合,可以传递参数,参数名以$符号开始,多个参数以逗号分开,也可以给参数设置默认值。声明的@mixin通过@include来调用。
无参数mixin
/sass style
//-------------------------------
@mixin center-block {
margin-left:auto;
margin-right:auto;
}
.demo{
@include center-block;
}
//css style
//-------------------------------
.demo{
margin-left:auto;
margin-right:auto;
}
有参数mixin
/sass style
//-------------------------------
@mixin opacity($opacity:50) {
opacity: $opacity / 100;
filter: alpha(opacity=$opacity);
}
//css style
//-------------------------------
.opacity{
@include opacity; //参数使用默认值
}
.opacity-80{
@include opacity(80); //传递参数
}
更多用法请参考Sass
继承
ass中,选择器继承可以让选择器继承另一个选择器的所有样式,并联合声明。使用选择器的继承,要使用关键词@extend,后面紧跟需要继承的选择器。
//sass style
//-------------------------------
h1{
border: 4px solid #ff9aa9;
}
.speaker{
@extend h1;
border-width: 2px;
}
//css style
//-------------------------------
h1,.speaker{
border: 4px solid #ff9aa9;
}
.speaker{
border-width: 2px;
}
占位符
sass 3.2.0以后就可以定义占位选择器%。这种选择器的优势在于:如果不调用则不会有任何多余的css文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了@extend去继承相应的样式,都会解析出来所有的样式。占位选择器以%标识定义,通过@extend调用。
//sass style
//-------------------------------
%ir{
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
%clearfix{
@if $lte7 {
*zoom: 1;
}
&:before,
&:after {
content: "";
display: table;
font: 0/0 a;
}
&:after {
clear: both;
}
}
#header{
h1{
@extend %ir;
width:300px;
}
}
.ir{
@extend %ir;
}
//css style
//-------------------------------
#header h1,
.ir{
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
#header h1{
width:300px;
}
基本运用到这,关于函数以及其他可以参考SASS。
制定SCSS规范
1、所有导入文件以 _ 开头
2、可覆盖变量定义时加上 !default
3、变量及@function采用驼峰式命名
4、@mixin,%采用中划线命名
5、@mixin中参数有默认值的放在没有默认值前面
6、模块文件的变量在模块文件头部申明
7、如需@extend,请先设计成%