sass语法
总结思路
- 定义主题颜色变量
- 定义主题颜色的主题库
- 利用
@mixin
混合器和@each
循环主题库,设置父级类名,接着循环对应颜色对应的样式,利用map-merge
并合并。
- 利用
map-get
的key获取对应值value值
- 进入需要定义的类名样式下调用封装好的以上两个方法。
变量声明
- 使用$加变量名声明sass变量,例如
$hight-light: red;
- 注意:如果变量定义在任何的{}(中括号里),则该变量只能在这个{}(中括号)里使用
@mixin
定义列表函数、方法
@mixin mycolor($color: blue) {
background: $color
@content//类似于插槽
}
@content
(占位符)
- 用在
@mixin
里面,当设置@content
后用@include
调用的时候,后面{}的内容就会插入(替换)里面(类似于插槽)
@include
调用@mixin
定义列表函数或方法
.home {
@include mycolor {
color: red
}
}
//编译后
.home{
background:blue;
color:red
}
map-merge($map1,$map2)
将$map1
和$map2
合并成新的列表函数
@mixin flex-ui {
dispaly: flex
};
@mixin justify-content {
justify-content: center
};
$map:map-merge(flex-ui,justify-content)
//编译后得到一个新的列表函数$map
$map:(
display: flex;
justify-content: center
)
map-get($map1,$key)
获取$map1
列表函数中$key
属性名的值
$value:map-get($map,'display');
$value:flex
@function name (){}定义函数
@function themed($key) {
@return map-get($themes,$key)
}
sass换肤实战
html 部分
<template>
<div class="father" :class="'theme-' + color">
<div class="home">
<header>
<i class="icon-menu"></i>
<span>sass换肤</span>
<i class="icon-more"></i>
</header>
<div class="sel-box">
<select v-model="color">
<option class="cell" value="default">点击</option>
<option class="cell" value="red">red</option>
<option class="cell" value="green">green</option>
<option class="cell" value="purple">purple</option>
<option class="cell" value="orange">orange</option>
</select>
</div>
</div>
</div>
</template>
<script>
export default {
name: "Home",
data() {
return {
color: "red",
};
},
};
</script>
scss部分
<style lang="scss" scoped>
* {
margin: 0;
padding: 0;
}
html {
font-size: 13.333vw;
}
@mixin flex-ui {
display: flex;
}
@mixin justify-content {
justify-content: space-between;
}
@mixin align-items {
align-items: center;
}
$black: black;
$red: red;
$green: green;
$blue: blue;
$orange: orange;
$purple: purple;
$thems-color: (
black: (
color: $black,
border: 1px solid $black,
background: $black,
),
red: (
color: $red,
fontSize: 0.8rem,
border: 1px solid $red,
background: $red,
),
green: (
color: $green,
fontSize: 0.3rem,
border: 1px solid $green,
),
blue: (
color: $blue,
border: 1px solid $blue,
background: $blue,
),
orange: (
color: $orange,
border: 1px solid $orange,
background: $orange,
),
purple: (
color: $purple,
border: 1px solid $purple,
background: $purple,
),
);
$themesCol: ();
@mixin themesColor() {
@each $name, $map in $thems-color {
.theme-#{$name} & {
@each $key, $value in $map {
$themesCol: map-merge(
$themesCol,
(
$key: $value,
)
) !global;
}
@content;
}
}
}
@function themed($keys) {
@return map-get($themesCol, $keys);
}
[class*="icon-"] {
width: 0.5rem;
height: 0.5rem;
display: block;
@include themesColor {
background-color: themed("background");
}
}
.home {
header {
@include flex-ui;
@include justify-content;
@include align-items;
font-size: 0.36rem;
background: #ccc;
height: 0.8rem;
@include themesColor {
color: themed("color");
border: themed("border");
font-size: themed("fontSize");
}
}
}
</style>