掌握 Vue3、Vite 和 SCSS 实现一键换肤的魔法步骤

前言

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

搭建项目

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

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

处理项目目录结构

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

在这里插入图片描述

把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

效果:

在这里插入图片描述
在这里插入图片描述

里面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变量,效果如下:

在这里插入图片描述
在这里插入图片描述

源码附件:​​点此下载​​

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

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

相关文章

Docker数据卷的挂载

目录 1 概念 2 常用命令 3 操作步骤(主要讲在创建容器时的挂载) 3.1 挂载在默认目录 3.2 挂载在自定义目录 4 附加内容(查看容器的挂载情况) 1 概念 数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。这样容器内…

上海亚商投顾:沪指震荡微涨 AI手机、军工板块集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡回升&#xff0c;黄白二线分化明显&#xff0c;银行等权重板块走势较强。AI手机概念股持续…

智能设备 app 设计 —— 蓝蓝 UI 设计公司

今天给大家推荐是智能设备app设计&#xff0c;随着智能设备的逐渐普及随之操作app也越来越多&#xff0c;希望能给大家带来灵感 #日常灵感 #创意设计#UI提升#ui设计#app #设计案例分享|#设计 #产品设计#产品设计#设计灵感 #B端产品经理 #ui #产品 #美工 #交互 #产品经理 #开发 …

数据管理【总结】

大数据&#xff1a;是指极其庞大的数据集&#xff0c;通常具备五大特征&#xff08;5个V&#xff09;&#xff1a;数据量大&#xff08;Volume&#xff09;、数据类型多样&#xff08;Variety&#xff09;、数据生成速度快&#xff08;Velocity&#xff09;、数据真实性高&…

大模型快速实现python3+html内容在线渲染

需求&#xff1a; 有一份数据需要通过前端在线展示给用户&#xff0c;不需要复杂的样式交互&#xff0c;后端服务是基于Python3实现的API接口&#xff0c;对前端技术不是很了解&#xff0c;需要快速实现该需求。类似样式即可&#xff1a; 思路&#xff1a; 如果页面不复杂&am…

一键清除JavaScript代码中的注释:使用正则表达式实现

这个正则表达式可以有效地匹配 JavaScript 代码中的各种注释&#xff0c;并且跳过了以 http: 或 https: 开头的链接。 /\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->|(?<!http:|https:)\/\/[^\n]*/gvscode 实战&#xff0c;ctrlF 调出查找替换工具&#xff0c;点…

交流稳压稳频大功率电源技术与应用

交流稳压稳频大功率电源技术与应用 交流稳压稳频大功率电源是一种能够提供稳定交流电压和频率的电源设备&#xff0c;它具有大功率输出能力&#xff0c;适用于各种需要大功率电源的场合&#xff0c;交流稳压稳频大功率电源在各个领域中发挥着越来越重要的作用。它不仅为各种电子…

HTTPS是什么,那些行业适合部署呢?

随着在线活动的增加&#xff0c;对您共享的关键数据的威胁已经产生了严重的后果&#xff0c;包括欺诈性金融交易、在线身份盗窃等。此外&#xff0c;随着技术使用的增加&#xff0c;网络攻击也变得更加复杂和具有挑战性。 毫无疑问&#xff0c;互联网用户的数据安全意识成倍增长…

备份 ChatGPT 的聊天纪录

备份 ChatGPT 的聊天纪录 ChatGPT 在前阵子发生了不少次对话纪录消失的情况&#xff0c;让许多用户觉得困扰不已&#xff0c;也担心自己想留存的聊天记录消失不见。 好消息是&#xff0c;OpenAI 在 2023 年 4 月 11 日推出了 ChatGPT 聊天记录备份功能&#xff0c;无论是免费…

算法48:动态规划专练(力扣221:最大正方形面积)

题目&#xff1a; 在一个由 0 和 1 组成的二维矩阵内&#xff0c;找到只包含 1 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],["1","0&quo…

H12-821_131

131.如图所示&#xff0c;R1、R2、R3和R4运行OSPF&#xff0c;缺省情况下该网络中选举________个DR。&#xff08;请填写阿拉伯数字&#xff09; 答案&#xff1a;3 注释&#xff1a; DR是链路上的概念&#xff0c;使用路由器接口的IP地址表示。链路的网络类型是广播网络类型或…

sectigo通配符ov ssl证书1590元一年送一月

Sectigo是知名的CA认证机构之一&#xff0c;旗下有两种通配符SSL证书产品。一种是DV基础型的通配符SSL证书&#xff0c;另一种是OV企业型的通配符SSL证书&#xff0c;这两种SSL证书申请条件宽松&#xff0c;申请流程也不复杂&#xff0c;用户可以快速为他的网站申请到通配符SSL…