▲sass安装, 先安装Ruby,然后再安装SASS。
▲1.SASS允许使用变量,所有变量以$开头。变量是 sass
提供的最基本的工具
sass
$bgColor:pink;
header{
color:$bgColor;
}
footer{
color:$bgColor;
}
▲ // 变量名用中划线'-'还是下划线'_'分隔,这两种用法相互兼容,用中划线声明的变量可以使用下划线的方式引用,反之亦然
$link-color: blue;
a {
color: $link_color;
}
//编译后
a {
color: blue;
}
▲ //!default 含义是:如果这个变量被声明赋值了,那就用它声明的值,否则就用这个默认值。
//如果没有重新赋值,则使用默认值
$const:'hello' !default
div{
const:$const;
}
//编译为
div{
const:'hello';
}
// 如果已经赋值,则不再使用默认值
$const:'hi'
$const:'hello' !default
div{
const:$const;
}
//编译为
div{
const:'hi';
}
▲2.嵌套CSS 规则
//在嵌套的代码块内,可以使用&引用父元素。比如a:hover伪类,可以写成
a{
&:before{
content:'xx'
}
}
//嵌套属性:反复写border-styleborder-widthborder-color以及border-*等也是非常烦人的
nav {
font: {
fam: solid;
width: 1px;
color: #ccc;
}
}
▲3. 导入SASS文件
//@import规则
@import '@/styles/theme/variables.scss';
▲4. 注释
//1.标准的CSS注释 /* comment */ ,会保留到编译后的文件。
//2.在/*后面加一个感叹号,表示这是"重要注释"。即使是压缩模式编译,也会保留这行注释,通常可以用于声明版权信息。
▲5. 混合器@mixin 判断一组属性是否应该组合成一个混合器,一条经验法则就是你能否为这个混合器想出一个好的名字
// 你需要大段大段的重用样式的代码,独立的变量就没办法应付这种情况了。你可以通过sass的混合器实现大段样式的重用
// 使用@mixin命令,定义一个代码块
@mixin flexCenter {
display: flex;
justify-content: center;
align-items: center;
}
// 使用@include命令,调用这个mixin。
.page-container {
// display: flex;
// justify-content: center;
// align-items: center;
@include flexCenter;
}
//mixin的强大之处,在于可以指定参数和缺省值,有默认值。
@mixin left($value: 10px) {
float: left;
margin-right: $value;
}
//使用的时候,根据需要加入参数:
div {
@include left(20px);
}
// 传参,没有默认值
@mixin link-colors($normal, $hover, $visited) {
color: $normal;
&:hover { color: $hover; }
&:visited { color: $visited; }
}
a {
@include link-colors(blue, red, green);
}
//:link表示鼠标点击之前,也称为原始状态
//:hover表示鼠标悬停状态
//:active表示鼠标点击状态
//:visited表示鼠标点击之后状态
6.使用选择器继承来精简CSS
//通过选择器继承继承样式 @extend
.error {
border: 1px solid red;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
▲ 父选择器的标识符&
a{
&:before{
content:'xx'
}
}
:not()选择器
<div class="sibcont">
<ul>
<li>妹子前端</li>
<li>汉子前端</li>
<li>mooshine前端</li>
<li>not()选择器</li>
</ul>
</div>
//not选择器
.sibcont ul li:not(:first-child){
color:red;
}
//not与属性选择器
::v-deep .el-pagination button:not([disabled='disabled']):hover {
background: rgba(68, 81, 159, 0.6);
color: #fff;
}
子组合选择器和同层组合选择器:>、+和~;
// > 选择元素的直接子元素
<article>
<section></section>
<div>
<section></section> //这个就没有描边
</div>
<section></section>
</article>
article section { margin: 5px }
article > section { border: 1px solid #ccc }
// + 相邻兄弟选择器
<p>This is paragraph.</p>
<h1>This is a heading.</h1>
<p>This is paragraph.</p> //只有他有作用
<p>This is paragraph.</p>
h1+p {
margin-top: 150px;
color: red;
}
// ~ 兄弟选择器 h1~p选择器 h1之后出现的所有p。两种元素必须拥有相同的父元素,但是 p不必直接紧随h1。
<p>1</p>
<h1>2</h1>
<div>
<p>3</p> //没有作用,相同父元素
</div>
<p>4</p>
<p>5</p>
h1~p {
color: red;
}
sass插值语句,在calc中使用变量
//在vue中,通过sass定义一个变量
$height: 100px;
#div{
height: calc(100% - $height);
}
//此方法行不通,将变量用#{}包裹起来即可
$height: 100px;
#div{
height: calc(100% - #{$height});
}
Sass 颜色操作
// lighten(color, amount) 通过改变颜色的亮度值(0% - 100%),让颜色变亮,创建一个新的颜色。
// darken(color, amount) 通过改变颜色的亮度值(0% - 100%),让颜色变暗,创建一个新的颜色。
.box{
&:active {
background: lighten(#000, 50%);
}
}
sass实时编译
// Visual Studio Code插件Live Sass Compiler
// 按F1或ctrl+shift+P键入 Live Sass: Watch Sass 以开始实时编译,或者按键入Live Sass: Stop Watching Sass以停止实时编译。
控制指令 @if 三角形
<div class="demo"></div>
@mixin san($orientation: top, $size: 100px, $color: red) {
@if ($orientation==top) {
border-color: transparent transparent $color transparent;
border-width: 0 $size $size $size;
} @else if($orientation==right) {
border-color: transparent transparent transparent $color;
border-width: $size 0 $size $size;
} @else if($orientation==bottom) {
border-color: $color transparent transparent transparent;
border-width: $size $size 0 $size;
} @else if($orientation==left) {
border-color: transparent $color transparent transparent;
border-width: $size $size $size 0;
}
width: 0;
height: 0;
border-style: solid;
}
.demo {
@include san(top, 12px, orange);
}
SaSS Export用法
//将变量名导出,可以以Js的形式使用SCSS变量,通常写在一个variables.scss文件中,在需要的地方引入。
//在variables.scss文件中命名变量, :export导出
$red:#C03639;
$green: #30B08F;
$yellow:#FEC171;
:export {
red: $red;
green: $green;
yellow: $yellow;
}
//可以再js总导入使用
import { red, green, yellow } from 'variables.scss'
console.log(red, green, yellow)
mix($color1, c o l o r 2 , [ color2, [ color2,[weight])函数
//$weight表示的混合的权重,默认值为50%,指的第一个颜色$color1的比例,取值范围为0~100%,函数最终的返回值是颜色的十六进制表达式。
$color1: orange;
$color2: green;
body {
background: mix($color1, $color2, 0.6);
}
HSL函数
//hsl($hue, $saturation, $lightness) 根据HSL中的三个值计算出一个颜色;
//hue($color) //获取HSL中的色调值;
//saturation($color) //获取HSL中的饱和度;
//lightness($color) //获取HSL中的亮度值;
//adjust-hue($color, $degree) //改变HSL中的色调值;
//$degree表示的改变色调度数的值,可以是正数,也可以是负数。如果为正数,在HSL颜色转盘上顺时针旋转相应的$degree,旋转之后的度数就是颜色的色调值;如果是负数,逆时针旋转即可。
body {
background: adjust-hue(red, 60deg);
}
//lighten($color, $amount) //颜色变浅函数;取值范围是0~100%。
//darken($color, $amount) //颜色变深函数;
$colorMain: #3d48de;
.lighten {
background-color: lighten($colorMain, 15%);
}
.darken {
background-color: darken($colorMain, 25%);
}
//saturate($color, $amount) //增加颜色的饱和度;取值范围为0~100%。
//desaturate($color, $amount) //减少颜色的饱和度;
$colorMain: #3d48de;
.saturate {
background-color: saturate($colorMain, 15%);
}
.desaturate {
background-color: desaturate($colorMain, 25%);
}
//grayscale($color) //将该颜色转换为相对应的灰度颜色;
$colorMain: #5960c2;
body {
background-color: grayscale($colorMain);
}
//complement($color) //获取该颜色值旋转180度后相对应的颜色;
//invert($color) //和complement相似,获取该颜色值旋转180度后相对应的颜色,不过不能改变透明度;
$colorMain: #5960c2;
body {
background-color: complement($colorMain);
}
.div {
background-color: invert($colorMain);
}
Opacity函数
//alpha/opacity($color) //获取颜色的透明度;
//rgba($color, $alpha) //改变颜色的透明度;
$colorMain: red;
$colorAlpha1: rgba(red, 0.8);
$colorAlpha2: rgba(red, 0.5);
body {
background-color: rgba($colorMain, alpha($colorAlpha1));
}
.div {
background-color: rgba($colorMain, opacity($colorAlpha2));
}
//opacify/fade-in($color, $amount) //让颜色更加不透明;
//transparentize/fade-out($color, $amount) //使颜色更加透明化;
$colorMain: rgba(#3d48de, 0.3);
$funcData: opacify, fade-in, transparentize, fade-out;
@mixin func($funcName) {
@if $funcName == opacify {
background-color: opacify($colorMain, 0.5);
}@else if $funcName == fade-in {
background-color: fade-in($colorMain, 0.5);
}@else if $funcName == transparentize {
background-color: transparentize($colorMain, 0.2);
}@else if $funcName == fade-out {
background-color: fade-out($colorMain, 0.2);
}
}
@each $value in $funcData {
.div-#{$value} {
@include func($value);
}
}
change-color( )直接被替换,adjust-color( )加上原来的,最终获取的颜色
//adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha]) //调整一个或者多个属性;
//scale-color($color, [$red], [$green], [blue], [$saturation], [$lightness], [$alpha]) //调整一个或者多个属性,获取一个流畅的颜色;
//change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha]) //调整一个或者多个属性;
//ie-hex-str($color) //将一个颜色转换为ie滤镜使用的颜色;
//在上面的函数中,$color参数是必需的,后面可以跟一个参数,也可以是多个。不过,要注意,不能同时调整RGB值和HSL值。
$colorMain: rgba(#3d48de, 0.3);
.div-01 {
background-color: change-color($colorMain, $red: 123);
}
.div-02 {
background-color: adjust-color($colorMain, $red: 123);
}
//编译后
.div-01 {
background-color: rgba(123, 72, 222, 0.3);
}
.div-02 {
background-color: rgba(184, 72, 222, 0.3);
}
//观察编译之后的CSS样式,同时给两个函数中的$red赋值为123,发现change-color( )函数的R值被替换为123,而adjust-color( )函数为184。$colorMain变量的R值为61,所以184是123 + 61所得的结果。
//我们可以得出以下结论:change-color( )函数是将原来的函数的RGB值、HSL值、透明度值,直接被替换。 adjust-color( )函数是之后参数的赋值加上原来的函数相对应的值,最终获取的颜色。
$colorMain: rgba(#3d48de, 0.3);
$funcData: change-color, adjust-color, scale-color, ie-hex-str;
@mixin func($funcName) {
@if $funcName == change-color {
background-color: change-color($colorMain, $red: 123);
}@else if $funcName == adjust-color {
background-color: adjust-color($colorMain, $red: 123);
}@else if $funcName == scale-color {
background-color: scale-color($colorMain, $red: 20%);
}@else if $funcName == ie-hex-str {
background-color: ie-hex-str($colorMain);
}
}
@each $value in $funcData {
.div-#{$value} {
@include func($value);
}
}
//编译后
.div-change-color {
background-color: rgba(123, 72, 222, 0.3);
}
.div-adjust-color {
background-color: rgba(184, 72, 222, 0.3);
}
.div-scale-color {
background-color: rgba(100, 72, 222, 0.3);
}
.div-ie-hex-str {
background-color: #4D3D48DE;
}
//scale-color( )函数最后得的结果是将R值转变为100,在RGB中,R的值为0~255,原来颜色的R值为61,首先获取原颜色的R值和255之间差值,取得差值的20%,然后加上原来颜色的R值61,也就是(255 - 61) * 20% + 61= 100。如果$red为-20%,那将取的是原来颜色的R值与0之间的差值,用原来颜色R值减去差值的20%,也就是61 - (61 - 0) * 20% = 49,最后四舍五入。
hsb色环
//顺时针旋转
0红色 60黄 120绿 180青 240蓝 300洋红 360红色
@each
//@each 指令的格式是 $var in <list> @each 将变量 $var 作用于值列表中的每一个项目,然后输出结果
<p class="p_pink">This is first paragraph.</p>
<p class="p_violet">This is second paragraph.</p>
<p class="p_yellow">This is third paragraph.</p>
<p class="p_blue">This is fourth paragraph.</p>
@each $color in pink, violet, yellow, blue {
.p_#{$color} {
background: #{$color};
}
}
@each $animal in puma, sea-slug, egret, salamander {
.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
}
}
//编译为
.puma-icon {
background-image: url('/images/puma.png'); }
.sea-slug-icon {
background-image: url('/images/sea-slug.png'); }
.egret-icon {
background-image: url('/images/egret.png'); }
.salamander-icon {
background-image: url('/images/salamander.png'); }