如何用 Vue3 + Vite + SCSS 轻松实现换肤功能

前言

一个网站的换肤效果算是一个比较常见的功能,尤其是在后台管理系统中,我们几乎都能看到他的身影,这里给大家提供一个实现思路。

搭建项目

vite+vue3搭建项目这里就不演示了,vite官网里面讲得很清楚。

注:这里使用的css预处理器是sass,使用前要先安装他的依赖:npm i sass

处理项目目录结构

src目录下的assetscomponents文件夹删除,新建src/theme/index.scss

aa6f1202403060929501297.png

把App.vue里的代码改成:

<template>  
    <div></div>  
</template>  
  
<script setup>  
</script>  
  
<style lang="scss" scoped>  
</style>

Copy

把src/style.css里的代码改成:

body {  
    margin: 0;  
    display: flex;  
    place-items: center;  
    min-width: 320px;  
    min-height: 100vh;  
}  
  
  
button {  
    border-radius: 8px;  
    border: 1px solid transparent;  
    padding: 0.6em 1.2em;  
    font-size: 1em;  
    font-weight: 500;  
    font-family: inherit;  
    cursor: pointer;  
    transition: border-color 0.25s;  
    outline: none; //消除默认点击蓝色边框效果  
}  
  
  
#app {  
    max-width: 1280px;  
    margin: 0 auto;  
    padding: 2rem;  
    text-align: center;  
}

Copy

说明: 这里只是实现一个基础的换肤效果,所以文件结构尽量简单化,因此就不引入路由或者其他的项目基础工具。

主要问题

我们在实现一个换肤效果的时候,最重要的一个问题是如何通知系统要使用哪种主题方案,这个其实很好解决,用 document.documentElement.setAttribute 在html标签上进行标记就行。

修改App.vue代码:

<template>  
    <div>  
        <form>  
            主题切换:  
            <input type="radio" name="gender" v-model="type" value="light" checked @change="onChange"/>light  
            <input type="radio" name="gender" v-model="type" value="dark" @change="onChange" />dark  
        </form>  
    </div>  
</template>  
  
<script setup>  
    import {ref} from "vue";  
  
    const type = ref('light')  
  
    function onChange(e) {  
        document.documentElement.setAttribute('theme-mode', type.value)  
    }  
</script>  
  
<style lang="scss" scoped>  
  
</style>

Copy

很简单的一段代码,用单选框模拟主题切换。当选中不同的主题时,在浏览器控制台Elements里你就会看到,html标签自动添加了一段theme-mode=dark

效果:

08e45202403060930582361.png

a62f9202403060931188585.png

里面theme-modetheme-mode里的值都是可以自定义的。

这里就是通过这样区分不同的主题配色方案的。

抽离css变量

在src/theme/index.scss里抽离css变量

代码:

:root,  
:root[theme-mode='light'] {
    --bg-color: #0052d9;
}

:root[theme-mode='dark'] {
    --bg-color: #2c2c2c;
}

Copy

这里有两种主题的配色方案lightdark,实际项目中可以把他抽离到不同的文件下,这里只是提供一个思路,代码比较简单就不做抽离处理。

在src/main.js里引入:

import { createApp } from 'vue'  
import './style.css'  
import './theme/index.scss'  
import App from './App.vue'

Copy

使用主题

到这里就可以使用这些抽离出来的css变量了,这里拿一个按钮举例:

<template>  
    <div>  
        <button class="btn">按钮</button>  
        <form>  
            主题切换:  
            <input type="radio" name="gender" v-model="type" value="light" checked @change="onChange"/>light  
            <input type="radio" name="gender" v-model="type" value="dark" @change="onChange"/>dark  
        </form>  
    </div>  
</template>  
  
<script setup>  
    import {ref} from "vue";  
  
    const type = ref('light')  
  
    function onChange(e) {  
        document.documentElement.setAttribute('theme-mode', type.value)  
    }  
</script>  
  
<style lang="scss" scoped>  
    .btn {  
        background-color: var(--bg-color);  
        color: #fff;  
    }  
</style>

Copy

按钮的样式 background-color: var(--bg-color); 里的 --bg-color 就是上面抽离出来的css变量,效果如下:

29ade202403060932072653.png

f69cb202403060932244745.png

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3 + TypeScript + Vite 项目中使用 SCSS 预处理器,你需要遵循以下步骤: 1. 在项目中安装 `sass` 和 `sass-loader`: ``` npm install sass sass-loader --save-dev ``` 2. 确保你的 `tsconfig.json` 中开启了 `"experimentalDecorators": true` 和 `"emitDecoratorMetadata": true` 选项。 3. 在 `vite.config.ts` 中配置 `sass-loader`: ```typescript import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; import path from 'path'; export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': path.resolve(__dirname, 'src') } }, css: { preprocessorOptions: { scss: { additionalData: `@import "@/styles/main.scss";` } } } }); ``` 在这个例子中,我们将 `main.scss` 文件导入到所有的 SCSS 文件中。 4. 创建一个 `main.scss` 文件,并在其中包含您的 SCSS 样式。 ```scss // Variables $primary-color: #007bff; $secondary-color: #6c757d; // Mixins @mixin button-variant($background-color) { background-color: $background-color; color: white; border: none; border-radius: 4px; padding: 10px 20px; cursor: pointer; transition: background-color 0.3s ease; &:hover { background-color: lighten($background-color, 10%); } &:active { background-color: darken($background-color, 10%); } } // Styles .primary-button { @include button-variant($primary-color); } .secondary-button { @include button-variant($secondary-color); } ``` 5. 在组件中使用您的 SCSS 样式。 ```vue <template> <div> <button class="primary-button">Primary Button</button> <button class="secondary-button">Secondary Button</button> </div> </template> <script lang="ts"> import { defineComponent } from 'vue'; export default defineComponent({ name: 'MyComponent' }); </script> <style lang="scss"> /* Additional styles for this component */ </style> ``` 这样,您就可以在 Vue3 + TypeScript + Vite 项目中使用 SCSS 预处理器,并为每个组件编写自己的样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值