Sass是一种样式语法
很多语法与css用法相同 但一些方面比css更简便 例如可以在样式中定义变量和函数
我们先构建一个vue项目
然后在项目中引入Sass
npm install sass-loader -D
npm install node-sass -D
然后我们来编写一个vue组件
参考代码如下
<template>
<div id = "app">
<div class = "text">你好</div>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
name: ""
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
#app{
margin: 0;
padding: 0;
}
.text{
color: #0000FF;
}
</style>
首先 我们的 style 标签上声明了两个东西
scoped大家比较熟了 意思就是标签内的样式只作用于当前组件
lang代表使用的语言类型 我们声明为scss
这里面的语法大家也不会陌生 我们声明id为app的元素 内外边距都为0 类名为text的元素字体颜色为蓝色
我们的组件效果为这样
这就是个css很基本的写法 我们知道css中有一个子集选择器.text在#app下
所以我们.text也可以写成
<style>
#app > .text{
color: #0000FF;
}
</style>
然而在Sass中我们可以这样写
<style lang="scss" scoped>
#app{
margin: 0;
padding: 0;
.text{
color: #0000FF;
}
}
</style>
这就是Sass的第一个方便的写法 可以用花括号嵌套关系 编写子集选择器样式
按元素的嵌套关系写样式 非常的便捷
那么这是就有人想了 那伪类选择器呢?
我们以hover为了 用户鼠标触碰#app 将自己下面的.text变为红色
我们编写代码如下
<style lang="scss" scoped>
#app{
margin: 0;
padding: 0;
.text{
color: #0000FF;
}
&:hover{
.text{
color: #FF0000;
}
}
}
</style>
然后我们运行项目 然后触碰#app .text就变红了
如果你想碰.text自己时 他才变红就直接写在.text下就好了
<style lang="scss" scoped>
#app{
margin: 0;
padding: 0;
.text{
color: #0000FF;
&:hover{
color: #FF0000;
}
}
}
</style>
也是非常的方便
然后就是通过Sass 将样式定义为变量
<style lang="scss" scoped>
$default: #0000FF;
$touch: #FF0000;
#app{
margin: 0;
padding: 0;
.text{
color: $default;
&:hover{
color: $touch;
}
}
}
</style>
界面效果是一样的 不过这里大家不难看出 我们将两个颜色值定义为了变量
Sass中的变量 声明时前面要用美元符号 $ 使用时前面也要加美元符号
还有就是注意代码是从上往下执行这件事哦 你别声明变量的代码还没执行 你就开始用了 那你的程序不出问题才有鬼呢
然后我们来看这样的代码
<template>
<div id = "app">
<div class = "text">你好</div>
<div class = "min">你好</div>
<div class = "max">你好</div>
</div>
</template>
#app下有三个元素 如果我想给他们三个一样的样式 那我们可以这样写
<style lang="scss" scoped>
$default: #0000FF;
$touch: #FF0000;
#app{
margin: 0;
padding: 0;
.text,.min,.max{
color: $default;
&:hover{
color: $touch;
}
}
}
</style>
我们同一级 如果想给同一个样式 直接用逗号隔开就好了
非常简单
还有就是大家要知道 我们这个嵌套是不限层级的 比如我们这样
<template>
<div id = "app">
<div class = "text">
<div class = "min">
<div class = "max">你好</div>
</div>
</div>
</div>
</template>
有多少层 你就一直往下套就好了
<style lang="scss" scoped>
$default: #0000FF;
$touch: #FF0000;
#app{
margin: 0;
padding: 0;
.text{
margin: 0;
padding: 0;
.min{
margin: 0;
padding: 0;
.max{
color: $default;
&:hover{
color: $touch;
}
}
}
}
}
</style>
然后我们来试css中一些比较新的选择器
<template>
<div id = "app">
<div class = "text">
</div>
<div class = "max">你好</div>
</div>
</template>
这里 .text和.max是同级的兄弟节点 css中就应该写 .text+.max{样式} Sass中我们可以这样写
<style lang="scss" scoped>
$default: #0000FF;
$touch: #FF0000;
#app{
margin: 0;
padding: 0;
.text{
margin: 0;
padding: 0;
+.max{
color: $default;
&:hover{
color: $touch;
}
}
}
}
</style>
子选择器 将+改成>就行了 其他也是同理
当想给多个子集选择器编写样式时我们来看
<template>
<div id = "app">
<div class = "text">
<div class = "max">你好</div>
<div class = "min">你好</div>
</div>
</div>
</template>
如果这种情况 我想把max和min都用子集选择器给样式 且样式还不一样 我们可以这样写
<style lang="scss" scoped>
$default: #0000FF;
$touch: #FF0000;
#app{
margin: 0;
padding: 0;
.text{
margin: 0;
padding: 0;
> {
.max{
color: $default;
&:hover{
color: $touch;
}
}
.min{
color: $touch;
&:hover{
color: $default;
}
}
}
}
}
</style>
看着也是非常的清晰 写起来更是方便
我们将元素改成这样
<template>
<div id = "app">
<div class = "text">
<div class = "max">你好</div>
</div>
</div>
</template>
然后我们如果想给max加一个实线边框 颜色为黑色 宽度为2px
css中可以这样写
<style scoped>
.max{
color: #0000FF;
border-width: 2px;
border-style: solid;
border-color: #333;
}
</style>
Sass中则可以写成
<style lang="scss" scoped>
.max{
color: #0000FF;
border:{
width: 2px;
style: solid;
color: #333;
}
}
</style>
效果是一样的 但感觉这个并没有变简化哦 因为我还是觉得css自己的简写好用 当然在Sass中也可以用css的简写
<style lang="scss" scoped>
.max{
color: #0000FF;
border: 2px solid #333;
}
</style>
我觉得还是这样看着比较简便
然后我们找到项目src项目中的 assets目录 在项目创建一个文件夹 叫sass
在这个文件下创建一个 index.sass文件
index.sass参考代码如下
$default: #0000FF;
$touch: #FF0000;
然后我们将组件的内容改成
<template>
<div id = "app">
<div class = "text">
<div class = "max">你好</div>
</div>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
name: ""
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
@import '@/assets/index.sass';
#app{
margin: 0;
padding: 0;
.text{
margin: 0;
padding: 0;
> {
.max{
color: $default;
border: 2px solid $touch;
}
}
}
}
</style>
组件就会变成这样
大家会注意到 我们的组件并没有定义 d e f a u l t 和 default和 default和touch 他们定义在index.sass里呢
然后我们组件通过@import引入了index.sass
sass和scss文件格式都是可以的
然后我们改写 index.sass的内容
$default: #0000FF;
$default: #333;
$touch: #FF0000;
我们到界面上去看
这里我们采用了$default的字体 用了第二个颜色 #333 的黑色
因为代码是从上往下走 下面的把上面的覆盖了
但如果我想上面的优先级最高
我们就可以这样写
$default: #0000FF;
$default: #333 !default;
$touch: #FF0000;
我们再去看界面
这次我们就采用了第一个 因为第二个声明了 !default
他的意思就是 如果这个变量没有声明过 那就用我的 如果声明过了 那就用原来的
团队开发时你可以都加一个这个 不然你把同事的变量覆盖了 容易挨打
然后我们将index.sass改成
$default: #0000FF;
$default: #333 !default;
$touch: #FF0000;
@mixin max {
color: $default;
border: 2px solid $touch;
}
组件的style改成
<style lang="scss" scoped>
@import './assets/index.scss';
#app{
margin: 0;
padding: 0;
.text{
margin: 0;
padding: 0;
> {
.max{
@include max;
}
}
}
}
</style>
这里我们将max的样式改成了 一个叫 max的大型插入体定义在index.sass 然后插入在组件的.max中
多元素的嵌套结构 也可以用大型插入体 反正就是把代码放在了其他地方 然后对应插入一下 大部分东西都能插
具体的你们可以自己去试
mixin还可以定义成一个函数
我们将index.sass 代码改成
@mixin text($default,$touch) {
margin: 0;
padding: 0;
> {
.max{
color: $default;
border: 2px solid $touch;
}
}
}
这里我们就定义了一个 mixin 函数
然后我们编写组件代码
<template>
<div id = "app">
<div class = "text">
<div class = "max">你好</div>
</div>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
name: ""
}
},
methods:{
},
}
</script>
<style lang="scss" scoped>
@import './assets/index.scss';
#app{
margin: 0;
padding: 0;
.text{
@include text(#0000FF,#FF0000);
}
}
</style>
这里我们就在text中调用了这个函数 当然 要传参数
两个颜色值
我们的text函数中也有使用这两个接收来的参数
然后就是Sass中可以用js的单行注释 //的语法了 相对也方便一些
当然 原本css的多行注释也是可以用的
然后我们改一下 .max的样式
.max{
@extend .text;
color: $default;
border: 2px solid $touch;
}
然后我们在页面用F2 看一下他的样式
这里我们可以看到 #app .text的样式也影响到他了 @extend 选择器 就是继承父级某个选择器的样式
比较常用的方法基本上也就这些