Sass之SCSS基础语法
Sass之SCSS基础语法
书写风格跟CSS一样
常用命令
sass App.scss App.css
:编译App.scss输出到App.css,单个文件加上下面的
--watch
能持续的监视sass --watch app/sass:public/stylesheets
你可以使用文件夹路径作为输入和输出,并用冒号分隔它们来监视和输出到目录。
搞心态小技巧之静默注释
// 可使用两种注释
// 这样的/ 注释内容 / 这样在生成css时会去掉
// 这样的/* 注释内容 */ 这样不会
// 原因很简单,css只有/**/这种
变量
可看做别名一样,凡是对应属性值能在的都可以使用这个变量名代替,有作用域
声明
$变量名: 属性值1,属性值2;// 列表
$a: 10px;
// map映射
$icons: ("eye": "\f112", "start": "\f12e", "stop": "\f12f");
//使用
map-get($icons, "stop");
引用
凡是属性都能用
div{
background: $a, url("...");// 这也能用
color: $a;// 这更能用
}
默认变量值
$a = 1
$a = 2
// a为2,以最后定义为准
$a = 1 !default;// 含义:如果变量a在声明时赋值了,那就用赋值的,否则用当前的
插值语句 #{}
$name: foo;
$attr: border;
p.#{$name} {
#{$attr}-color: blue;
}
p.foo {
border-color: blue; }
嵌套CSS规则
基本原理:进行解套时,就是往父子级中间加空格
// 如果我要写同一个域下不同元素的样式,纯css那得重复写好几次父级选择器
// 现在有了scss,牛马狂喜,就像你想的那样使用
div{
color: red;
ul{
color: black;
li{
color: yellow;
}
}
}
// 编译后
div {
color: red;
}
div ul {
color: black;
}
div ul li {
color: yellow;
}
// 直接起飞
Info
简单嵌套没啥问题,但加上一些伪类之类的就不太行
但别急,scss怎么会让你失望
父选择器的标识符&
不用空格分开了,直接替换&
div{
&:hover{// ===>div:hover
color: red;
}
}
群组选择器的嵌套
群组:h1, h2, div{}// 同时选中这些元素
div{
p, a, span{// ==>>div p, div a, div span
}
}
// 或这种情况
div, p, a{
ul{// ====> div ul, p ul, a ul
}
}
// 再度让牛马狂喜
属性嵌套
// 真的让人不能。。。。
div{
border: {// :后面要加空格
width: 1px;
style: solid;
}
}
// 编译后
div {
border-width: 1px;
border-style: solid;
}
@规则
@use:
@use "file"
导入其他样式文件,但是以模块的方式导入,即导入命名空间
但注意,这个只是在当前样式表如果要用导入的样式表就得使用命名空间,
如果只是编译的时候包含它,直接导入就可以,这是可见的
scss// src/_corners.scss $radius: 3px; @mixin rounded { border-radius: $radius; } // style.scss @use "src/corners"; .button { @include corners.rounded; padding: 5px + corners.$radius; }
css.button { border-radius: 3px; padding: 8px; }
- as:
@use "src/corners" as cor;
太长了,可以起别名,或者直接as *
全部导入 - 私有变量:以
-
或_
开头的,这些不能再@use
中的文件使用
scss// _library.scss $black: #000 !default; $border-radius: 0.25rem !default; $box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default; code { border-radius: $border-radius; box-shadow: $box-shadow; } // style.scss 导入可以使用with去进行覆盖对应的值 @use 'library' with ( $black: #222, $border-radius: 0.1rem );
csscode { border-radius: 0.1rem; box-shadow: 0 0.5rem 1rem rgba(34, 34, 34, 0.15); }
- as:
@forward:
@forward "file"
只是加载样式,但是在本表中无法使用,就想隐藏起来了,但是被其他表
@use
就能访问之前@forward导入的样式,相当于转发一样
- as:
@forward "src/list" as list-*;
给这个命名空间添加前缀 - hide:
hide list-reset, $horizontal-list-gap;
这些成员不转发 - with:也能使用这个,不同的是,变量后可以加
!default
修改默认值,毕竟不是在这个文件中使用
- as:
@mixin:混合器
本质就是在使用
@include
地方,如果有参数的话,进行处理,之后将其替换@include
所有没引用一次,就生成一次代码
@mixin reset-list { margin: 0; padding: 0; list-style: none; }
通过
@include 名称
使用可接受参数
@mixin rtl($property, $ltr-value, $rtl-value: middle) {// 可以有默认值 #{$property}: $ltr-value; } .sidebar { @include rtl(float, left, right); }
收集参数
scss如果
@mixin
声明中的最后一个参数以...
结尾,则该 mixin 的所有额外参数都将作为 列表] 传递给该参数。该参数被称为参数列表。@mixin order($height, $selectors...) { @for $i from 0 to length($selectors) { #{nth($selectors, $i + 1)} { position: absolute; height: $height; margin-top: $i * $height; } } } @include order(150px, "input.name", "input.address", "input.zip");
cssinput.name { position: absolute; height: 150px; margin-top: 0px; } input.address { position: absolute; height: 150px; margin-top: 150px; } input.zip { position: absolute; height: 150px; margin-top: 300px; }
内容块
除了接受参数之外,mixin 还可以接受整个样式块,称为内容块。mixin 可以通过在其主体中包含
@content
at 规则来声明它采用内容块。内容块像 Sass 中的任何其他块一样使用大括号传递,并且它是代替@content
规则注入的。scss@mixin hover { &:not([disabled]):hover { @content; } } .button { border: 1px solid black; @include hover { border-width: 2px; } }
css.button { border: 1px solid black; } .button:not([disabled]):hover { border-width: 2px; }
@function:类似定义函数
@extend:继承样式,或扩展样式,
@extend .class
或@extend %a
,该关键字,会把所有继承或扩展的,单独拎出来然后使用css的群组选择器,将样式放入其中,所以不像@include
一样,只会生成一次代码占位符%
如果当前的内容没有被
@extend
扩展,那么最终的css中也不会有它scss%aaa{ color: red; font-size: 10px; } div{ @extend %aaa; margin: 0; } p{ @extend %aaa; margin: 1; }
cssp, div {// 把多个继承占位符的哪些抽出来,放到一起 color: red; font-size: 10px; } div { margin: 0; } p { margin: 1; }
@debug:后跟着输出内容,这就是调试用的
@at-root:也就是这后面的,不在父级的包裹下,而是相当于这段css从新选了父级
流程控制
@if
就像编程语言的if-else一样使用
@use "sass:math"; @mixin triangle($size, $color, $direction) { height: 0; width: 0; border-color: transparent; border-style: solid; border-width: math.div($size, 2); @if $direction == up { border-bottom-color: $color; } @else if $direction == right { border-left-color: $color; } @else if $direction == down { border-top-color: $color; } @else if $direction == left { border-right-color: $color; } @else { @error "Unknown direction #{$direction}."; } } .next { @include triangle(5px, black, right); }
@each
像python的for-in,不仅取一个值,还能
@each $name, $glyph in $icons
这样取scss$sizes: 40px, 50px, 80px; @each $size in $sizes { .icon-#{$size} { font-size: $size; height: $size; width: $size; } }
css.icon-40px { font-size: 40px; height: 40px; width: 40px; } .icon-50px { font-size: 50px; height: 50px; width: 50px; } .icon-80px { font-size: 80px; height: 80px; width: 80px; }
:::
@for
scss$base-color: #036; @for $i from 1 through 3 { ul:nth-child(3n + #{$i}) { background-color: lighten($base-color, $i * 5%); } }
cssul:nth-child(3n+1) { background-color: rgb(0, 63.75, 127.5); } ul:nth-child(3n+2) { background-color: rgb(0, 76.5, 153); } ul:nth-child(3n+3) { background-color: rgb(0, 89.25, 178.5); }
@while
scss@use "sass:math"; /// Divides `$value` by `$ratio` until it's below `$base`. @function scale-below($value, $base, $ratio: 1.618) { @while $value > $base { $value: math.div($value, $ratio); } @return $value; } $normal-font-size: 16px; sup { font-size: scale-below(20px, 16px); }
csssup { font-size: 12.3609394314px; }