Vue3 + Scss 实现主题切换效果

css.png

Vue3 + Scss 实现主题切换效果

先给大家看一下主题切换的效果:
在这里插入图片描述

像这样的效果实现起来并不难,只是比较麻烦,目前我知道的有两种方式可以实现,分别是 CSS 变量、样式文件切换,下面是该效果的核心实现方法

CSS变量

给需要变化的样式设置 css 变量,然后可以通过 jsdocument.documentElement.style.setProperty 方法来修改 css 变量的值,从而实现主题切换的效果

<script setup lang="ts">
import { ref } from 'vue';const $css = document.documentElement.style
const is = ref<boolean>(false)const btn = () => {is.value = !is.valueis.value ? $css.setProperty("--color", "#000") : $css.setProperty("--color", "#fff")
}
</script><template><div class="box"></div><button @click="btn">按钮</button>
</template><style lang="scss">
$color: var(--color, #fff);.box {width: 200px;height: 200px;background-color: $color;transition: all 0.3s;
}
</style>

该方式适合应用于简单的切换场景,如果页面比较复杂,使用该方式会导致使用大量的 css 变量,而且写法也会很麻烦
Snipaste_2023-11-24_20-30-29.jpg

这时候推荐使用下面这种方式

样式文件切换

该方式核心思想就是定义两套样式,通过 js 控制两套样式的切换从而实现该效果

动态加载局部样式

  1. 先准备好两个 Scss 主题样式文件:
// light.scss
.container{background-color: #fff;
}// dark.scss
.container{background-color: #000;
}
  1. 然后在 App.vue 中引入
<script setup lang="ts">
import Theme from '@/view/Theme.vue'
</script><template><Theme />
</template><style lang="scss">
.light {@import "@/styles/light.scss";
}.dark {@import "@/styles/dark.scss";
}
</style>
  1. Theme.vue 中编写布局,通过动态类名来实现主题切换功能
<script setup lang="ts">
import { ref } from 'vue';const is = ref(false)
</script><template><div :class="is ? 'light' : 'dark'"><div class="container"></div></div><button @click="is = !is">切换主题</button>
</template><style scoped lang="scss">
.container {width: 300px;height: 300px;transition: all 0.3s;
}
</style>

修改link标签样式路径

  1. 直接在项目的 index.html 中通过 link 引入样式文件
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/svg+xml" href="/vite.svg" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Vite + Vue + TS</title><!-- 在这里先定义一个默认的样式 --><link rel="stylesheet" href="./src/styles/light.scss" title="light"></head><body><div id="app"></div><script type="module" src="/src/main.ts"></script></body>
</html>
  1. src/App.vue 中获取 link 标签,并通过逻辑让他切换样式文件从而实现主题切换效果
<script setup lang="ts">
import { ref } from 'vue';// 获取link标签
const links = document.querySelectorAll("link")const is = ref<boolean>(false)const btn = () => {is.value = !is.value// 目前只有两个link标签,所以这里直接写死,只展示核心代码is.value ? links[1].href = "./src/styles/dark.scss" : links[1].href = "./src/styles/light.scss"
}
</script><template><div class="container"></div><button @click="btn">按钮</button>
</template><style scoped lang="scss">
.container {width: 300px;height: 300px;transition: all 0.3s;
}
</style>

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

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

相关文章

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

设计模式—迪米特原则(LOD)

1.背景 1987年秋天由美国Northeastern University的Ian Holland提出&#xff0c;被UML的创始者之一Booch等普及。后来&#xff0c;因为在经典著作《 The Pragmatic Programmer》而广为人知。 2.概念 迪米特法则&#xff08;Law of Demeter&#xff09;又叫作最少知识原则&…

c语言,输入整数n(行数,本例为4),按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16

c语言&#xff0c;输入整数n(行数&#xff0c;本例为4&#xff09;&#xff0c;按照如下规则打印数字图片 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 以下是使用C语言编写的程序&#xff0c;根据输入的行数打印数字图片的规则&#xff1a; #include <stdio.h>int main() …

【LeeCode】59.螺旋矩阵II

给定一个正整数 n&#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 解&#xff1a; class Solution {public int[][] generateMatrix(int n) {int[][] ar…

Mysql编写过程和解析过程顺序刨析

我们在平时的编写sql语句当中&#xff0c;编写顺序都是知道&#xff0c;先select …… from …… join……where 等等 &#xff0c;那么它的解析过程顺序是什么样的呢&#xff1f;先说一下mysql解析顺序大致为&#xff1a; FROM 子句的解析&#xff1a; 解析 FROM 子句时&…

CV计算机视觉每日开源代码Paper with code速览-2023.11.22

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【语义分割】Mobile-Seed: Joint Semantic Segmentation and Boundary Detection for Mobile Robots 论文地址&#xff1a;https://arxiv.or…

7种SQL进阶用法【转】

1.自定义排序(ORDER BY FIELD) 在MySQL中ORDER BY排序除了可以用ASC和DESC之外,还可以使使用自定义排序方式来实现 CREATE TABLE movies ( id INT PRIMARY KEY AUTO_INCREMENT, movie_name VARCHAR(255), actors VARCHAR(255), price DECIMAL(10,2) DEFAULT 50, release date…

P8安全基本理论A001-CIA安全模型-使用PGP描述网络安全CIA模型之私密性、完整性案例

【教学资源名称】 CIA安全模型-使用PGP描述网络安全CIA模型之私密性、完整性案例 【预备知识】 在信息安全等级保护工作中,根据信息系统的机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)来划分信息系统的安全等级,三个性质简称CIA。 私密性(Confi…

ES 8.x开始(docker-compose安装、kibana使用、java操作)

学习文档地址 一、Docker安装 这里使用docker-compose来安装&#xff0c;方便后续迁移&#xff0c;Elasticserach和kibina一起安装。 1、创建安装目录 configdataplugins 2、配置文件 配置文件有两个&#xff0c;一个是ES的配置文件&#xff0c;一个docker-compose的配置文件 …

大厂做项目的过程,你真的知道吗?

文章目录 明确需求排期代码设计技术选型写代码迭代更新 一线大厂的项目是如何从0-1被做出来的&#xff0c;了解大厂项目开发的详细流程&#xff1b;自己开发项目那是单打独斗&#xff0c;没人管你&#xff1b;但进入企业中开发项目那是开团打本&#xff0c;大家都在一股绳上&am…

龙芯loongarch64服务器编译安装pyarrow

1、简介 pyarrow是一个高效的Python库,用于在Python应用程序和Apache Arrow之间进行交互。Arrow是一种跨语言的内存格式,可以快速高效地转移大型数据集合。它提供了一种通用的数据格式,将数据在内存中表示为表格,并支持诸如序列化和分布式读取等功能。 龙芯的Python仓库安…

Ubuntu 22.03 LTS 安装deepin-terminal 分屏

安装 源里面自带了这个软件&#xff0c;可以直接装 sudo apt install deepin-terminal 启动 按下Win键&#xff0c;输入deep即可快速检索出图标&#xff0c;点击启动 效果 分屏 CtrlShiftH 水平分割 CtrlShiftJ 垂直分割 最多分割成四个小窗口&#xff0c;鼠标点击可以切换…

[ BUG ] 踩坑 Axios Delete 请求传参

踩坑 Axios Delete 请求传参 问题描述 今天在写前后端交互时&#xff0c;我想将 data 数据通过 delete 进行传参 axios.delete("/info", data)&#xff0c;但是发现后端一直提示参数错误&#xff0c;我看了看代码也没错啊。跟 post、patch 一样的写法为什么会出现参…

三方支付接口成为了电商竞争力的新动力

在当前快速发展的互联网时代&#xff0c;随着电子商务行业的兴起&#xff0c;支付体验已经成为企业获取竞争优势的重要因素。一个快速、安全、便捷的支付环节不仅可以提升用户的体验&#xff0c;还能有效促进交易的完成。在众多支付解决方案中&#xff0c;三方支付接口因其独特…

18.Spring框架中的单例bean是线程安全的吗?(阿里一面)

Spring框架中的单例bean是线程安全的吗?(阿里一面) 不是,Spring框架中的单例bean不是线程安全的。spring 中的 bean 默认是单例模式,spring 框架并没有对单例 bean 进行多线程的封装处理。 实际上大部分时候 spring bean 无状态的(比如 dao 类),所以某种程度上来说 bea…

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

linux 内核线程

内核线程类似于用户进程&#xff0c;通常用于并发处理些工作&#xff0c;它是一种在内核空间实现后台任务的方式&#xff0c;并且可以参与时间片轮转调度。 内核线程可以进行繁忙的异步事件处理&#xff0c;也可以睡眠等待某事件的发生&#xff0c;内核线程可以访问内核函数和…

Linux操作系统使用及C高级编程-D17D18编译与调试

编译 当有线程创建时编译&#xff1a;gcc test.c -o test -lpthread 分文件编写时主要是分为&#xff1a;.c&#xff08;函数声明的具体实现&#xff09;、.h&#xff08;说明性文件&#xff1a;#define 结构体共用体 声明&#xff09;、.c(main) 条件编译 一般情况下&#x…

激光线提取

在做单线激光三维重建&#xff0c;和多线激光三维重建的时候都会设计到激光线提取算法的实现&#xff0c;如何保持高速和高精度是关键 &#xff0c;最近优化了steger中心线提取算法&#xff0c;通过并行化实现在cpu版本可以做到2m,GPU版本可以做到0.6ms左右&#xff0c;完全可…

Flask 运用Xterm实现交互终端

Xterm是一个基于X Window System的终端仿真器&#xff08;Terminal Emulator&#xff09;。Xterm最初由MIT开发&#xff0c;它允许用户在X Window环境下运行文本终端程序。Xterm提供了一个图形界面终端&#xff0c;使用户能够在图形桌面环境中运行命令行程序。而xterm.js是一个…