scss变量
在编写CSS代码时,我们必须在每个地方重复相同的值和颜色。变量使我们能够在单个位置定义常用值,并解决代码中重复相同值的问题。
创建viaribles.scss文件
代码语言:javascript复制@import 'compass/utilities/color/contrast';
// scss-lint:disable ColerKeyword
$warning-color:orange;
$waring-font-color:contrast-color($warning-color)
.button-warning{
background-color: $warning-color;
border-color: darken($warning-color, 20%);
border-radius: 20px;
color: $waring-font-color;
padding: 20px;
&:hover{
background-color: darken($warning-color,30%)
}
};
然后通过下面的命令编译它。
代码语言:javascript复制scss --compass viariables.scss variables.css
--compass
会去加载compass相关的依赖。
此时,我们创建index.html
代码语言:javascript复制<button class='warning'>warning</button>
引入编译后的variables.css,则看到按钮如下:
我们定义了一些变量,这样,当样式需要改变时,我们只需要修改对应的变量值,然后重新编译scss即可。
变量的定义以$
符号开始,;
分号结束。
$variable:value;
变量的名字可以使用连字符和下划线。
除了SassScript支持的数据类型之外,任何其他有效的CSS值都可以分配给变量。SassScript支持七种数据类型:
- 数字
- 带引号和不带引号的字符串
- 颜色
- 布尔值
- 空值
- list
- map
在上面的例子中,darken()
函数用来加深颜色。contrast-color()
函数用来设置对应的属性。
变量的作用域
当我们真正使用变量时,有一点需要明白的是,变量是有作用域的。
定义在全局,则是全局变量,全局可用。定义在选择器内部,则是本地变量。本地变量只在嵌套的选择内部可用。比如:
代码语言:javascript复制$primary:red;
.link{
$primary green;
color:$primary;
&:hover{
color:$primary;
}
}
p{
color:$primary;
}
编译后则是这样:
代码语言:javascript复制.link{
color:green;
}
.link:hover{
color:green;
}
p{
color:red;
}
在link选择器内部,使用了内部定义的变量。
变量覆盖
在同一个作用域定义同一个变量,变量被覆盖。术语叫重载。比如:
代码语言:javascript复制$primary:red;
.link{
color:$primary
}
$primary:green;
.other-link{
color:$primary;
}
编译后:
代码语言:javascript复制.link{
color:red;
}
.other-link{
color:green;
}
!global关键字
!global
关键字用来提升局部变量的权限,将局部变量提升到全局。
$primary:red;
.link{
$primary:green !global;
color:$primary;
}
.other-link{
color: $primary;
}
编译后:
代码语言:javascript复制.link {
color: green; }
.other-link {
color: green; }
/*# sourceMappingURL=variables.css.map */
如果我们使用了一个未定义的变量,编译时也会报一个undefined的错误。
scss 中的运算
定义好了变量,我们可以对它们进行标准的加减乘除以及模运算。
我们创建operations.scss
代码语言:javascript复制$color1:blue;
$color2:red;
$distance:10px;
.operations {
color: $color1 $color2;
width: $distance * 100;
height: ($distance 10) * 5;
font-family: sans- 'serif';
}
然后在终端进行编译:
代码语言:javascript复制scss --wathch operations.scss
输出计算后的operations.css
.operations {
color: magenta;
width: 1000px;
height: 100px;
font-family: sans-serif; }
/*# sourceMappingURL=operations.css.map */
!default关键字
!default关键字
用来定义默认属性。
$color:red;
$color:green !default;
.green{
color: $color;
}
编译后:
代码语言:javascript复制.green {
color: red; }
/*# sourceMappingURL=default.css.map */
当我们移除$color:red;
。
.green {
color: green; }
/*# sourceMappingURL=default.css.map */
又变成了绿色。
!default关键字
用来定义默认属性。想要覆盖掉默认属性,我们只需要重新定义个相同的属性名。
我们可以定义一些默认的变量,然后通过@import
指令导入进来,从而让代码的重用行变得更好。
插值
插值语法在js中很好理解,其实scss也一样,无非是写法略有不同。
创建文件interpolation.scss:
代码语言:javascript复制$name:class;
$direction:left;
$units:px;
.#{name}{
margin-#{$direction}:20#{units};
}
编译后:
代码语言:javascript复制.class {
margin-left: 20px; }
/*# sourceMappingURL=interpolation.css.map */
scss的插值语法#{}
,可以让我们在属性中使用相应的变量。
mixins 混入
创建mixins.scss
代码语言:javascript复制@import './layouts/responsive'
$side-bar-background-color: orange !default;
.side-bar{
@include hidden-mobile;
background-color: $side-bar-background-color;
li{
list-style: square;
}
}
.banner{
@include hidden-mobile;
img{
float: right;
}
}
然后创建相应的responsive.scss
代码语言:javascript复制@mixin hidden-mobile {
@media (max-width:767px){
display: none !important;
}
}
然后编译mixins.scss
代码语言:javascript复制.side-bar{
background-color: orange;
@media (max-width:767px){
display: none !important;
}
}
.side-bar li{
list-style: square;
}
.banner{
@media (max-width:767px){
display: none !important;
}
}
.banner img{
float: right;
}
同时,mixins也支持传入参数,有兴趣的可以自己去了解一下传入参数的写法。
@function指令
@mixin
,@include
都是scss的指令,我们一起来了解一下@function
指令。
@function
指令创建的函数不会生成到编译后的css文件中,它只是返回一个值。
用我们经常使用的移动端px转rem做个例子,创建functions.scss:
代码语言:javascript复制$browser-context:16;
@function px_to_rem($pixels,$context:$browser-context){
@return ($pixels/$browser-context)*1rem;
}
h1{
font-size: px_to_rem(20);
}
编译后
代码语言:javascript复制h1 {
font-size: 1.25rem; }
/*# sourceMappingURL=functions.css.map */
当然,在函数中,我们还可以使用@if
指令根据不同的条件执行不同的逻辑,这里就 不再赘述了。
总结
这里简单介绍了scss中的变量,!global
和!default
关键字,以及插值语法和函数的写法。
后面将介绍选择器以及模块儿相关的内容