vscode 中实时 scss 转 css
vscode 中搜索并安装插件 Live Sass Compiler
在设置中搜索 Live Sass Compiler 配置如下。
"liveSassCompile.settings.formats": [
{
"format" : "expanded" ,
"extensionName" : ".css" ,
"savePath" : null
}
]
更多配置自行搜索 Live Sass Compiler
使用
ctrl+shift+P 键入Live Sass: Watch Sass 以开始实时编译,
键入 Live Sass: Stop Watching Sass 以停止实时编译。
常用语法
变量
$main-color: red;
div {
$this-color: blue;
color: $this-color;
background: $main-color;
}
// 编译后 css
div {
color: blue;
background: red;
}
注意
变量声明以 $ 开头如 $a
变量中下划线和中线可以互换兼容$a_b === $a-b
变量定义后可以修改 $a = red; $a = blue;
变量存在作用域 {} 中声明的变量外部无法使用
变量值中可以存在变量如 $main-border: 1px solid $main-color;
嵌套规则
// 1. 普通嵌套
div { .header {} }
// 输出 div .header {}
body { div,h1,h2 { } }
// 输出 body div,body h1,body h2 {}
// 2. 父选择器 &
div {
&.header {
color: #fff
}
}
// 输出 div.header { color: #fff }
.header {
&-txt {
color: #fff;
}
}
// 输出 .header-txt { color: #fff; }
// 3. 属性嵌套
div {
font: {
size: 10px;
weight: bold
}
}
// 输出 div { font-size: 10px; font-weight: bold }
导入
// _header.scss
@import 'header';
注意
导入代码后面要加分号否则出错
被导入 scss 文件一般使用 开头
导入 scss 文件可省略后缀和前面
导入 scss 不会产生 http 请求
导入 scss 嵌套中也可使用
导入 css 必须写后缀
导入 css 会产生 http 请求
导入 css 会自动提到文件开头
注释
scss
/* 多行注释 */
// 单行注释
css
/* 多行注释 */
注意
注释分为多行注释和单行注释
多行注释会被保留在输出的CSS中
而单行注释又叫静默注释不会出现在生成的css文件中
通用代码混合器、继承和占位符
/*
混合器 @mixin @include
使用 @mixin 标识符给一大段样式赋予一个名字name,这样你就可以通过 “@include name” 重用这段样式到任意地方。
*/
// 1. 普通用法
@mixin important-text {
font-size: 25px;
font-weight: bold;
border: 1px solid blue;
}
div {
@include important-text;
}
header {
span {
@include important-text;
}
}
// 生成 css
div {
font-size: 25px;
font-weight: bold;
border: 1px solid blue;
}
header span {
font-size: 25px;
font-weight: bold;
border: 1px solid blue;
}
// 2. 定义含参数的混合器
@mixin link-colors($normal, $hover, $visited) {
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
// 再样式规则中调用含参的混合器
a {
@include link-colors(blue, red, green);
}
// 还可以通过语法$name: value的形式指定每个参数的值。
span {
@include link-colors(
$normal: blue,
$visited: green,
$hover: red
);
}
// 生成 css
a {
color: blue;
}
a:hover {
color: red;
}
a:visited {
color: green;
}
span {
color: blue;
}
span:hover {
color: red;
}
span:visited {
color: green;
}
/*
继承 @extend
一个选择器的样式可以继承另一个选择器
如果一个样式与另外一个样式几乎相同,只有少量的区别,则使用 @extend 就显得很有用。
*/
.error {
border: 1px solid red;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
// 生成 css
.error, .seriousError {
border: 1px solid red;
background-color: #fdd;
}
.seriousError {
border-width: 3px;
}
/*
占位符 %
%placeholder 声明的代码,如果不被 @extend 调用的话,不会产生任何代码
*/
%mt5 {
margin-top: 5px;
}
%pt5{
padding-top: 5px;
}
.btn {
@extend %mt5;
@extend %pt5;
}
.block {
@extend %mt5;
span {
@extend %pt5;
}
}
// 生成 css
.btn, .block {
margin-top: 5px;
}
.btn, .block span {
padding-top: 5px;
}
注意
混合器 mixin 中可以嵌套其他样式 可以传参数
继承 extend 不能继承嵌套 不可传参数
占位符% 和继承很像只是不生成占位的源代码
Interpolation #{}
/*
Interpolation 可以说是 scss 中开挂般的存在
可以通过 #{} 给属性和类名进行变量替换
*/
$prop1: border;
@mixin set-one($side, $val){
#{$prop1}-#{$side}: $val;
}
.box-bor {
@include set-one(width, 2px);
@include set-one(style, dashed);
@include set-one(color, green);
}
// 生成 css
.box-bor {
border-width: 2px;
border-style: dashed;
border-color: green;
}
// 结合 @each
$prop2: padding, margin;
$name: 'name';
@mixin set-prop($side, $val) {
@each $prop in $prop2{
#{$prop}-#{$side}: $val;
}
}
.box-#{$name} {
@include set-prop(left, 16px);
}
// css
.box-name {
padding-left: 16px;
margin-left: 16px;
}
指令
条件控制指令:@if 条件{...}
循环控制指令:
@for $var from <开始值> through <结束值> -----------包括结束值
@for $var from <开始值> to <结束值> ------------不包括结束值
循环List项目的控制指令:@each $var in $List{}
条件判断循环:@while 条件{...}
警告和错误的提示:
@warn "..."------------------------在终端输出警告
@error "..."----------------在.css文件和终端输出错误
/* @if 指令 */
p {
@if 10 + 10 == 20 { border: 1px dotted; }
@if 7 < 2 { border: 2px solid; }
@if null { border: 3px double; }
}
// 生成 css
p {
border: 1px dotted;
}
// scss
$type: audi;
p {
@if $type == benz {
color: red;
} @else if $type == mahindra {
color: blue;
} @else if $type == audi {
color: green;
} @else {
color: black;
}
}
// 生成 css
p {
color: green;
}
/* @for 指令 */
// scss
@for $i from 1 through 3 {
.item-#{$i} { width: 2em * $i; }
}
// 生成 css
.item-1 {
width: 2em;
}
.item-2 {
width: 4em;
}
.item-3 {
width: 6em;
}
// scss
@for $i from 1 to 3 {
.item-#{$i} { width: 2em * $i; }
}
// 生成 css
.item-1 {
width: 2em;
}
.item-2 {
width: 4em;
}
/* @each 指令 */
@each $color in red, green, yellow, blue {
.p_#{$color} {
background-color: $color;
}
}
// 生成 css
.p_red {
background-color: red;
}
.p_green {
background-color: green;
}
.p_yellow {
background-color: yellow;
}
.p_blue {
background-color: blue;
}
// scss
$list: (h1, aqua, dotted), (h2, red, solid), (h3, green, double);
@each $header, $color, $border in $list {
$i: index($list, ($header, $color, $border));
.#{$header}-#{$i} {
background-color : $color;
border: $border;
}
}
// 生成 css
.h1-1 {
background-color: aqua;
border: dotted;
}
.h2-2 {
background-color: red;
border: solid;
}
.h3-3 {
background-color: green;
border: double;
}
运算
scss 中可以进行想 js 一样的运算。
$w1: 100px;
div {
width: $w1 + 20;
height: ($w1 * 2) - 40;
line-height: (180px/30);
}
// 生成 css
div {
width: 120px;
height: 160px;
line-height: 6px;
}
注意
运算建议带括号方便理解和维护
加减乘运算可以都带单位也可以只有一个带单位会保留单位
除法运算分子一定要带单位才能保留单位,只有分母带单位将报错
除法运算都带单位或都不带单位结果都不带单位
运算中两者都不带单位结果也不带单位
函数
- 数字函数
percentage($theNumber); // 将一个不带单位的数转换成百分比值; //450%
round($theNumber); // 将数值四舍五入,转换成一个最接近的整数; //5
ceil($theNumber); // 将大于自己的小数转换成下一位整数; //5
floor($theNumber); // 将一个数去除他的小数部分; //4
abs($theNumber); // 返回一个数的绝对值;//4.5
min($numbers…); // 找出几个数值之间的最小值; //min(1,2,3) =1
max($numbers…); // 找出几个数值之间的最大值; //max(1,2,3)=3
random();// 获取随机数 //随机数
用户自定义的函数:@function 名称(参数1,参数2...){...}
$theNumber: 4.5;
div {
width: percentage($theNumber); // 将一个不带单位的数转换成百分比值; //450%
}
// 生成css
div {
width: 450%;
}
- 字符串函数:
to-upper-case($theString):输出$theString的大写 //HELLO WORLD
to-lower-case($theString):输出$theString的小写 //hello world
str-length($theString):输出$theString的长度 //11
str-index($theString,"Hello"):输出$theString第二个参数的开始索引 //1
str-insert($theString,".com",12):在索引为12的地方为$theString插入".com" //"Hello World.com"
$theString: "Hello World";
div::after {
content: to-upper-case($theString);
}
// 生成css
div::after {
content: "HELLO WORLD";
}
- 颜色函数
- 调整色相h的值
$base-color-hsl:hsl(0,100,50%); // red
$base-color:#ff0000; // red
adjust-hue($base-color-hsl,137deg); // #00ff48
adjust-hue($base-color,137deg); // #00ff48 - 调整亮度l的值
$base-color:hsl(222,100%,50%); //#004cff
$light-color:lighten($base-color,30%); //#99b8ff(变亮)
$dark-color:darken($base-color,20%); //#002e99(变暗) - 调整饱和度s的值
$base-color:hsl(221,50%,50%); //#4068bf
$saturate-color:saturate($color:$base-color,$amount:50%); //#0051ff (更饱和)
$desaturate-color:desatudate($color:$base-color,$amount:30%); //667699 (更不饱和) - 调整透明度a的值
$base-color:hsla(222,100%,50%,0.5); //rgba(0, 77, 255, 0.5)
$fade-in-color:opacify($color: $primary-color, $amount: 0.3); //rgba(0, 77, 255, 0.8)
$fase-out-color:transparentize($color: $primary-color, $amount: 0.2); //rgba(0, 77, 255, 0.3)
$base-color-hsl:hsl(0,100,50%);
div {
color: adjust-hue($base-color-hsl,137deg);
}
// 生成css
div {
color: #00ff48;
}
- 列表函数(1px solid black:这样称为一个列表有三个项)
length(5px 10px):列表长度 //2
length(5px 10px 0px 2px) 列表长度 //4
nth(5px 10px,1):列表第一项 //5px
nth(5px 10px,2):列表第二项 //10px
index(1px solid red,solid):列表solid的项目索引 //2
append(5px 10px,5px):列表中插入项目 //5px 10px 5px
join(5px 10px,5px 10px):列表之间连接 //5px 10px 5px 10px
join(5px 10px,5px 10px,参数):列表之间条件连接 //参数为comma=5px,10px,5px,10px ---------参数为space=5px 10px 5px 10px
$border: 1px solid black;
p {
@if length($border) < 2 {
color: red;
} @else {
color: blue;
}
}
// 生成css
p {
color: blue;
}
- Map函数(Map为带有键值对的列表)
length($colors):map的长度 //2
map-get($colors,dark):取得键值为dark的值 //#000000
map-keys($colors):取得所有键 //("light","dark")
map-values($colors) :取得所有值 //(#ffffff,#000000)
map-has-key($colors,light):map是否有light键 //true
map-merge($colors,(color-red:#ff0000)) :插入键值对到map //(light:#ffffff,dark:#000000,color-red:#ff0000)
map-remove($colors,light,dark) :从map删除键值对 // (color-red:#ff0000)
$colors:(light:#ffffff, dark:#000000); //定义map
p {
color: map-get($colors,dark);
}
// 生成css
p {
color: #000000;
}
- 自定义函数
定义了很多函数可供使用,当然你也可以自己定义函数,以 @fuction 开始。
$width1: 10px;
$width2: 20px;
@function widthFn($n) {
@return $n * $width2 + ($n - 1) * $width1;
}
div {
width: widthFn(5);
}
// 生成css
div {
width: 140px;
}
2023-11-16 02:24