如何用 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>

把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;  
}

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

主要问题

我们在实现一个换肤效果的时候,最重要的一个问题是如何通知系统要使用哪种主题方案,这个其实很好解决,用 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>

很简单的一段代码,用单选框模拟主题切换。当选中不同的主题时,在浏览器控制台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;
}

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

在src/main.js里引入:

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

使用主题

到这里就可以使用这些抽离出来的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>

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

29ade202403060932072653.png

f69cb202403060932244745.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/536675.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM

EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM EdgeSAM论文&#xff1a;https://arxiv.org/pdf/2312.06660.pdf EdgeSAM代码&#xff1a;https://github.com/chongzhou96/EdgeSAM 1 概述 作者在对各种蒸馏策略进行深入剖析后&#xff0c;证实了…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextClock)

TextClock组件通过文本将当前系统时间显示在设备上。支持不同时区的时间显示&#xff0c;最高精度到秒级。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TextClock(options?…

Redis底层数据结构之List

文章目录 1. Redis 6的list源码分析1. Redis 7的list源码分析 1. Redis 6的list源码分析 首先我们查看一下redis 6关于list的相关配置&#xff1a; config get list*可以看见redis 6的quicklist底层使用的数据结构是ziplist list-compress-depth&#xff1a;表示一个quicklis…

CSS中position的属性有哪些,区别是什么

position有以下属性值&#xff1a; 属性值概述absolute生成绝对定位的元素&#xff0c;相对于static定位以外的一个父元素进行定位。元素的位置通过left、top、right、bottom属性进行规定。relative生成相对定位的元素&#xff0c;相对于其原来的位置进行定位。元素的位置通过…

使用Golong轻松实现JWT身份验证

使用Golong轻松实现JWT身份验证 JSON Web Tokens (JWT)是一种流行的安全方法&#xff0c;用于在两个方之间表示声明。在Web应用程序领域&#xff0c;它们通常用作从客户端向服务器传输身份信息&#xff08;声明&#xff09;的方式。本教程将引导您逐步实现Go应用程序中的JWT身份…

中国湿地沼泽分类分布数据集

数据下载链接&#xff1a;百度云下载链接 引言 随着经济社会的快速发展和城市化进程的加速推进&#xff0c;农业发生功能性转变&#xff0c;从单一生产功能向生产、生活、生态多功能服务首都经济社会发展转变。湿地与农田、草地、森林三大生态系统整合形成完整的现代农业生态服…

如何使用ArcGIS Pro生成带计曲线等高线

等高线作为常见的地图要素经常会被使用到&#xff0c;一般情况下生成的等高线是不带计曲线的&#xff0c;在某些情况下我们需要带计曲线的等高线&#xff0c;这里为大家介绍一下ArcGIS Pro生成带计曲线等高线的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数…

【数据结构】二叉树的层序遍历、前序遍历,中序遍历、后续遍历

目录 一、前言二、二叉树的遍历概念三、根据遍历结果去推其他的遍历结果1.根据前序遍历、中序遍历&#xff0c;求后序遍历2. 已知中序和后序遍历&#xff0c;求前序遍历 四、代码实现 一、前言 最近也是在准备笔试&#xff0c;由于没有系统的学过数据结构&#xff0c;所以花了…

WanAndroid(鸿蒙版)开发的第三篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇-CSDN博客 2、WanAndroid(鸿蒙版)开发的第二篇-CSDN博客 效果 搜索页面实现…

C++之多态以及文件处理

多态 1 多态的基本概念 多态是C面向对象三大特性之一 多态分为两类&#xff1a; 静态多态: 函数重载 和 运算符重载属于静态多态&#xff0c;复用函数名 动态多态: 派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定-编译阶段确定函数地址…

开源生态与软件供应链研讨会

✦ 日程安排 开源生态与软件供应链研讨会 时间: 2024年3月12日&#xff08;星期二&#xff09;13:30 – 17:00 地点: 复旦大学江湾校区二号交叉学科楼E1021 联系人: 陈碧欢&#xff08;bhchenfudan.edu.cn&#xff09; 点击文末“阅读原文”或扫描下方二维码进入报名通…

记一次生产慢sql索引优化及思考

记一次生产慢sql索引优化及思考 问题重现 夜黑风高的某一晚&#xff0c;突然收到一条运营后台数据库慢sql的报警&#xff0c;耗时竟然达到了60s。看了一下&#xff0c;还好不是很频繁&#xff0c;内心会更加从容排查问题&#xff0c;应该是特定条件下没有走到索引导致&#x…