SCSS
SCSS发源于Sass,意思是Sassy CSS。这是sass官方为了对CSS开发者友好,试图弥合Sass和CSS之间的鸿沟而推出的全新语法。它的语法只是加了变量、嵌套规则、混入和导入等功能的CSS,熟悉CSS的开发者可以很快开始编码而不需要很长的学习时间。
下面来介绍SCSS的详细语法:
CSS扩展
嵌套规则
SCSS允许将一个CSS样式嵌套进另一个样式中,内层样式仅适用于外层样式的选择器范围内。例如:
#main p {
color: #00ff00;
width: 97%;
.redbox {
background-color: #ff0000;
color: #000000;
}
}编译为:
#main p {
color: #00ff00;
width: 97%; }
#main p .redbox {
background-color: #ff0000;
color: #000000; }这样有助于避免选择器重复,相对于复杂的CSS布局中的多层嵌套选择器要简单得多。
引用父选择器:&
需要直接使用嵌套外层的父选择器时,可以直接使用&字符来明确地表示插入指定父选择器。例如:
编译为:
&将替换为呈现在CSS文件中的父选择器。这意味着,如果你有一个多层嵌套的规则,父选择器将在被&替换之前完全分解。
&必须出现在的选择器的开头位置,但可以跟随后缀,将被添加到父选择的后面。例如:
编译为:
嵌套属性
CSS中有一些属性遵循相同的‘命名空间’;比如,font-family,font-size,和font-weight都在font命名空间中。SCSS为此提供了一个快捷方式:只需要输入一次命名空间,然后再其内部嵌套紫属性。SCSS提供:来定义命名空间,例如:
编译为:
SassScript
除了普通的CSS属性的语法,Sass支持一些扩展,名为SassScript。SassScript允许属性使用变量,算术和额外功能。SassScript可以在任何属性值被使用。
变量: $
$像下面这样定义一个变量:
然后再属性中引用他们:
变量仅在它定义的选择器嵌套层级的范围内可用,定义变量的时候可以后面带上!global标志,在这种情况下,变量在任何地方可见。
由于历史原因,变量名(以及其他所有Sass标识符)可以互换连字符和下划线。例如,如果你定义了一个名为$main-width,您可以使用$main_width访问它,反之亦然。
函数@
SCSS可以使用@符号定义函数,如下例所示:
插值: #{}
通过#{}插值语法在选择器和属性名中使用SassScript变量:
编译为:
它也可以使用#{}插值语句把SassScript插入到属性值中。在大多数情况下,这种做可能还不如使用直接变量来的方便,但使用#{}意味着靠近它的运算符都将被视为纯CSS,可以避免各种运算。
运算
除法/
/将/解析为除法三种情况。这些涵盖了绝大多数当做除法的案例。它们是:
如果该值,或值的任何部分,存储在一个变量中或通过函数返回。
如果该值是由括号括起来的,除非这些括号是在一个列表(
list)外部,并且值是括号内部。如果该值被用作另一个算术表达式的一部分。
例如:
编译为:
减法-
-遵循下面的规则安全地使用-:
减法的时候,总是在
-两侧保留空格。当表示一个负数和一个一元负运算符时,在
-前面加一个空格,后面不加空格。在一个空格隔开的list列表中,你可以将一元负运算符使用括号括起来,比如
10px (-$var)中。
颜色运算
所有算术运算都支持颜色值,颜色值的运算是分段进行计算的,也就是,依次计算红(red),绿(green),以及蓝(blue)的成分值。例如:
编译为:
字符串运算
+运算符可用于连接字符串。 如果带引号的字符串被添加到不带引号的字符串中(也就是说,带引号的字符串在+的左侧),那么返回的结果是带引号的字符串。同样,如果一个不带引号的字符串添加到带引号的字符串中(不带引号的字符串在+的左侧)那么返回的结果是一个不带引号的字符串。 例如:
编译为:
布尔运算
支持的布尔运算有and,or和not运算。
圆括号
圆括号可以影响运算的优先级。
@规则和指令
SCSS支持所有的CSS3的@规则以及一些其他特定的Sass指令。
@import
允许使用@import导入SCSS或Sass文件。被导入的全部SCSS或Sass文件将一起合并到同一个CSS文件中。
@media
SCSS中的@media指令的行为与CSS中一样,只是增加了一点额外的功能:它们可以嵌套在CSS规则。如果一个@media指令出现在CSS规则中,它将会冒泡到样式表的顶层,并且包含规则内所有的选择器。例如:
编译为:
@media的查询(queries)也可以相互嵌套。这些查询(queries)在编译时,将会使用and操作符号结合。
@extend
设计一个页面常常会遇到这种情况:当一个class含有另一个class的所有样式,并且它自己的特定样式。处理这种最常见的方法是在HTML同时使用一个通用样式类和特殊样式类。但是这会带来记忆成本,导致意外的错误。
@extend可以避免这些问题,告诉SCSS一个选择器的样式应该继承另一选择器。例如:
编译为:
控制指令和表达式
@if
@if@if指令可以控制判断流程。如果@if表达式返回值不为false或者null,那么后面的花括号中的内容就会返回。
编译为:
@if语句后面可以跟多个@else if语句和一个@else语句。 如果@if语句失败,SCSS将逐条尝试@else if语句,直到有一个成功,或如果全部失败,那么会执行@else语句。
@for
@for@for指令重复输出一组样式。对于每次重复,计数器变量用于调整输出结果。该指令有两种形式:@for $var from <start> through <end> 和 @for $var from <start> to <end>。注意关键字through和to的区别。$var可以是任何变量名,比如$i;<start> 和 <end>是应该返回整数的SassScript表达式。当<start>比<end>大的时候,计数器将递减,而不是增量。
@for语句将设置$var为指定的范围内每个连续的数值,并且每一次输出的嵌套样式中使用$var的值。对于from ... through的形式,范围包括<start>和<end>的值,但from ... to的形式从<start>开始运行,但不包括<end>的值。
使用through语法:
编译为:
@each
@each指令通常格式是@each $var in <list or map>。$var可以是任何变量名,像$length或者$name,和<list or map>是一个返回列表(list)或map的SassScript表达式。例如:
编译为:
混入指令
混入指令可以实现代码复用的功能。混入(mixin)通过@mixin指令定义。在它后面跟混入的名称和任选的arguments(参数),以及混入的内容块。
参考文献
Last updated