vue3主题切换按钮与功能实现

代码:

<template><div class="slideThree"><label class="theme-switch"><inputtype="checkbox"class="checkbox"v-model="isChecked"@change="setTheme"id="slideThree"name="check"checked/><div class="container"><!--云朵  --><div class="clouds"></div><div class="stars-container"><!--星星--><svgxmlns="http://www.w3.org/2000/svg"viewBox="0 0 144 55"fill="none"><pathfill-rule="evenodd"clip-rule="evenodd"d="M135.831 3.00688C135.055 3.85027 134.111 4.29946 133 4.35447C134.111 4.40947 135.055 4.85867 135.831 5.71123C136.607 6.55462 136.996 7.56303 136.996 8.72727C136.996 7.95722 137.172 7.25134 137.525 6.59129C137.886 5.93124 138.372 5.39954 138.98 5.00535C139.598 4.60199 140.268 4.39114 141 4.35447C139.88 4.2903 138.936 3.85027 138.16 3.00688C137.384 2.16348 136.996 1.16425 136.996 0C136.996 1.16425 136.607 2.16348 135.831 3.00688ZM31 23.3545C32.1114 23.2995 33.0551 22.8503 33.8313 22.0069C34.6075 21.1635 34.9956 20.1642 34.9956 19C34.9956 20.1642 35.3837 21.1635 36.1599 22.0069C36.9361 22.8503 37.8798 23.2903 39 23.3545C38.2679 23.3911 37.5976 23.602 36.9802 24.0053C36.3716 24.3995 35.8864 24.9312 35.5248 25.5913C35.172 26.2513 34.9956 26.9572 34.9956 27.7273C34.9956 26.563 34.6075 25.5546 33.8313 24.7112C33.0551 23.8587 32.1114 23.4095 31 23.3545ZM0 36.3545C1.11136 36.2995 2.05513 35.8503 2.83131 35.0069C3.6075 34.1635 3.99559 33.1642 3.99559 32C3.99559 33.1642 4.38368 34.1635 5.15987 35.0069C5.93605 35.8503 6.87982 36.2903 8 36.3545C7.26792 36.3911 6.59757 36.602 5.98015 37.0053C5.37155 37.3995 4.88644 37.9312 4.52481 38.5913C4.172 39.2513 3.99559 39.9572 3.99559 40.7273C3.99559 39.563 3.6075 38.5546 2.83131 37.7112C2.05513 36.8587 1.11136 36.4095 0 36.3545ZM56.8313 24.0069C56.0551 24.8503 55.1114 25.2995 54 25.3545C55.1114 25.4095 56.0551 25.8587 56.8313 26.7112C57.6075 27.5546 57.9956 28.563 57.9956 29.7273C57.9956 28.9572 58.172 28.2513 58.5248 27.5913C58.8864 26.9312 59.3716 26.3995 59.9802 26.0053C60.5976 25.602 61.2679 25.3911 62 25.3545C60.8798 25.2903 59.9361 24.8503 59.1599 24.0069C58.3837 23.1635 57.9956 22.1642 57.9956 21C57.9956 22.1642 57.6075 23.1635 56.8313 24.0069ZM81 25.3545C82.1114 25.2995 83.0551 24.8503 83.8313 24.0069C84.6075 23.1635 84.9956 22.1642 84.9956 21C84.9956 22.1642 85.3837 23.1635 86.1599 24.0069C86.9361 24.8503 87.8798 25.2903 89 25.3545C88.2679 25.3911 87.5976 25.602 86.9802 26.0053C86.3716 26.3995 85.8864 26.9312 85.5248 27.5913C85.172 28.2513 84.9956 28.9572 84.9956 29.7273C84.9956 28.563 84.6075 27.5546 83.8313 26.7112C83.0551 25.8587 82.1114 25.4095 81 25.3545ZM136 36.3545C137.111 36.2995 138.055 35.8503 138.831 35.0069C139.607 34.1635 139.996 33.1642 139.996 32C139.996 33.1642 140.384 34.1635 141.16 35.0069C141.936 35.8503 142.88 36.2903 144 36.3545C143.268 36.3911 142.598 36.602 141.98 37.0053C141.372 37.3995 140.886 37.9312 140.525 38.5913C140.172 39.2513 139.996 39.9572 139.996 40.7273C139.996 39.563 139.607 38.5546 138.831 37.7112C138.055 36.8587 137.111 36.4095 136 36.3545ZM101.831 49.0069C101.055 49.8503 100.111 50.2995 99 50.3545C100.111 50.4095 101.055 50.8587 101.831 51.7112C102.607 52.5546 102.996 53.563 102.996 54.7273C102.996 53.9572 103.172 53.2513 103.525 52.5913C103.886 51.9312 104.372 51.3995 104.98 51.0053C105.598 50.602 106.268 50.3911 107 50.3545C105.88 50.2903 104.936 49.8503 104.16 49.0069C103.384 48.1635 102.996 47.1642 102.996 46C102.996 47.1642 102.607 48.1635 101.831 49.0069Z"fill="currentColor"></path></svg></div><!--日月--><div class="circle-container"><div class="sun-moon-container"><!-- 月亮 --><div class="moon"><div class="moon-info"></div><div class="moon-info"></div><div class="moon-info"></div></div></div></div></div></label></div>
</template><script setup lang="ts">
import { ref, watch, onMounted } from "vue";
import { useCounterStore } from "../store/storeIndex";
import { storeToRefs } from "pinia";
const store = useCounterStore();
//从pinia中获取当前主题
const { theme } = storeToRefs(store);
const isChecked = ref(true);onMounted(() => {//挂载时判断当前主题if (localStorage.getItem("theme") === "dark") {isChecked.value = true;} else {isChecked.value = false;}
});watch(theme,(val) => {const root = window.document.documentElement;if (theme.value === "light") {isChecked.value = false;} else {isChecked.value = true;}root.classList.remove("light", "dark");if (theme.value === "system") {const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches? "dark": "light";root.classList.add(systemTheme);return;}root.classList.add(val);},{immediate: true,}
);//切换主题
const setTheme = () => {let value = isChecked.value ? "dark" : "light";localStorage.setItem("theme", value);theme.value = value;
};
</script><style lang="scss" scoped>
.slideThree {position: relative;.theme-switch {//容器高度--container-height: 2.5em;//日月大小--circle-container-diameter: 3.375em;//日月偏移--circle-container-offset: calc((var(--circle-container-diameter) - var(--container-height)) / 2 * -1);//云色--clouds-color: #f3fdff;//夜晚云色--back-clouds-color: #aacadf;//日月切换动画--transition: 0.5s cubic-bezier(0, -0.02, 0.4, 1.25);//日月移动动画--circle-transition: 0.3s cubic-bezier(0, -0.02, 0.35, 1.17);}.theme-switch,.theme-switch *,.theme-switch *::before,.theme-switch *::after {-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0;padding: 0;font-size: 20px;}.container {width: 6em;height: var(--container-height);background-color: #3d7eae;border-radius: 6.25em;overflow: hidden;cursor: pointer;-webkit-box-shadow: 0em -0.062em 0.062em rgba(0, 0, 0, 0.25),0em 0.062em 0.125em rgba(255, 255, 255, 0.94);box-shadow: 0em -0.062em 0.062em rgba(0, 0, 0, 0.25),0em 0.062em 0.125em rgba(255, 255, 255, 0.94);-webkit-transition: var(--transition);-o-transition: var(--transition);transition: var(--transition);position: relative;}.container::before {content: "";position: absolute;z-index: 1;inset: 0;-webkit-box-shadow: 0em 0.05em 0.187em rgba(0, 0, 0, 0.25) inset,0em 0.05em 0.187em rgba(0, 0, 0, 0.25) inset;box-shadow: 0em 0.05em 0.187em rgba(0, 0, 0, 0.25) inset,0em 0.05em 0.187em rgba(0, 0, 0, 0.25) inset;border-radius: 6.25em;}.checkbox {display: none;}.circle-container {width: var(--circle-container-diameter);height: var(--circle-container-diameter);background-color: rgba(255, 255, 255, 0.1);position: absolute;left: var(--circle-container-offset);top: var(--circle-container-offset);border-radius: 6.25em;-webkit-box-shadow: inset 0 0 0 3.375em rgba(255, 255, 255, 0.1),inset 0 0 0 3.375em rgba(255, 255, 255, 0.1),0 0 0 0.625em rgba(255, 255, 255, 0.1),0 0 0 1.25em rgba(255, 255, 255, 0.1);box-shadow: inset 0 0 0 3.375em rgba(255, 255, 255, 0.1),inset 0 0 0 3.375em rgba(255, 255, 255, 0.1),0 0 0 0.625em rgba(255, 255, 255, 0.1),0 0 0 1.25em rgba(255, 255, 255, 0.1);display: -webkit-box;display: -ms-flexbox;display: flex;-webkit-transition: var(--circle-transition);-o-transition: var(--circle-transition);transition: var(--circle-transition);pointer-events: none;}.sun-moon-container {pointer-events: auto;position: relative;z-index: 2;width: 2.125rem;height: 2.125rem;margin: auto;border-radius: 6.25em;background-color: #ecca2f;-webkit-box-shadow: 0.062em 0.062em 0.062em 0em rgba(254, 255, 239, 0.61)inset,0em -0.062em 0.062em 0em #a1872a inset;box-shadow: 0.062em 0.062em 0.062em 0em rgba(254, 255, 239, 0.61) inset,0em -0.062em 0.062em 0em #a1872a inset;-webkit-filter: drop-shadow(0.062em 0.125em 0.125em rgba(0, 0, 0, 0.25))drop-shadow(0em 0.062em 0.125em rgba(0, 0, 0, 0.25));filter: drop-shadow(0.062em 0.125em 0.125em rgba(0, 0, 0, 0.25))drop-shadow(0em 0.062em 0.125em rgba(0, 0, 0, 0.25));overflow: hidden;-webkit-transition: var(--transition);-o-transition: var(--transition);transition: var(--transition);}.moon {-webkit-transform: translateX(100%);-ms-transform: translateX(100%);transform: translateX(100%);width: 100%;height: 100%;background-color: #c4c9d1;border-radius: inherit;-webkit-box-shadow: 0.062em 0.062em 0.062em 0em rgba(254, 255, 239, 0.61)inset,0em -0.062em 0.062em 0em #969696 inset;box-shadow: 0.062em 0.062em 0.062em 0em rgba(254, 255, 239, 0.61) inset,0em -0.062em 0.062em 0em #969696 inset;-webkit-transition: var(--transition);-o-transition: var(--transition);transition: var(--transition);position: relative;}.moon-info {position: absolute;top: 0.75em;left: 0.312em;width: 0.75em;height: 0.75em;border-radius: 6.25em;background-color: #959db1;-webkit-box-shadow: 0em 0.0312em 0.062em rgba(0, 0, 0, 0.25) inset;box-shadow: 0em 0.0312em 0.062em rgba(0, 0, 0, 0.25) inset;}.moon-info:nth-of-type(2) {width: 0.375em;height: 0.375em;top: 0.937em;left: 1.375em;}.moon-info:nth-last-of-type(3) {width: 0.25em;height: 0.25em;top: 0.312em;left: 0.812em;}.clouds {width: 1.25em;height: 1.25em;background-color: var(--clouds-color);border-radius: 6.25em;position: absolute;bottom: -0.625em;left: 0.312em;-webkit-box-shadow: 0.937em 0.312em var(--clouds-color),-0.312em -0.312em var(--back-clouds-color),1.437em 0.375em var(--clouds-color),0.5em -0.125em var(--back-clouds-color), 2.187em 0 var(--clouds-color),1.25em -0.062em var(--back-clouds-color),2.937em 0.312em var(--clouds-color), 2em -0.312em var(--back-clouds-color),3.625em -0.062em var(--clouds-color), 2.625em 0em var(--back-clouds-color),4.5em -0.312em var(--clouds-color),3.375em -0.437em var(--back-clouds-color),4.625em -1.75em 0 0.437em var(--clouds-color),4em -0.625em var(--back-clouds-color),4.125em -2.125em 0 0.437em var(--back-clouds-color);box-shadow: 0.937em 0.312em var(--clouds-color),-0.312em -0.312em var(--back-clouds-color),1.437em 0.375em var(--clouds-color),0.5em -0.125em var(--back-clouds-color), 2.187em 0 var(--clouds-color),1.25em -0.062em var(--back-clouds-color),2.937em 0.312em var(--clouds-color), 2em -0.312em var(--back-clouds-color),3.625em -0.062em var(--clouds-color), 2.625em 0em var(--back-clouds-color),4.5em -0.312em var(--clouds-color),3.375em -0.437em var(--back-clouds-color),4.625em -1.75em 0 0.437em var(--clouds-color),4em -0.625em var(--back-clouds-color),4.125em -2.125em 0 0.437em var(--back-clouds-color);-webkit-transition: 0.5s cubic-bezier(0, -0.02, 0.4, 1.25);-o-transition: 0.5s cubic-bezier(0, -0.02, 0.4, 1.25);transition: 0.5s cubic-bezier(0, -0.02, 0.4, 1.25);}.stars-container {position: absolute;color: #fff;top: -100%;left: 0.312em;width: 2.75em;height: auto;-webkit-transition: var(--transition);-o-transition: var(--transition);transition: var(--transition);}/* actions */.checkbox:checked + .container {background-color: #1d1f2c;}.checkbox:checked + .container .circle-container {left: calc(100% - var(--circle-container-offset) - var(--circle-container-diameter));}.checkbox:checked + .container .circle-container:hover {left: calc(100% - var(--circle-container-offset) - var(--circle-container-diameter) -0.187em);}.circle-container:hover {left: calc(var(--circle-container-offset) + 0.187em);}.checkbox:checked + .container .moon {-webkit-transform: translate(0);-ms-transform: translate(0);transform: translate(0);}.checkbox:checked + .container .clouds {bottom: -4.062em;}.checkbox:checked + .container .stars-container {top: 50%;-webkit-transform: translateY(-50%);-ms-transform: translateY(-50%);transform: translateY(-50%);}
}input[type="checkbox"] {visibility: hidden;&:checked + label {left: 43px;}
}
</style>

pinia中:

import { defineStore } from "pinia";
import { ref } from "vue";
export const useCounterStore = defineStore("counter", () => {const theme = ref<string>(localStorage.getItem("theme") || "dark");return {theme};
});

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

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

相关文章

Day08:CSS 高级

目标&#xff1a;掌握定位的作用及特点&#xff1b;掌握 CSS 高级技巧 一、定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 水平方向偏移&#xff1a;left、…

mac下载安装好软件后提示已损坏

mac下载安装好软件后提示已损坏 解决方法&#xff1a; 首先确保系统安全设置已经改为任何来源。 打开任何来源后&#xff0c;到应用程序目录中尝试运行软件&#xff0c;如果仍提示损坏&#xff0c;请在应用图标上&#xff0c;鼠标右键&#xff0c;在弹出菜单中点打开。 如果…

埃及媒体分发投放-新闻媒体通稿发布

埃及商业新闻 大舍传媒近日宣布将在埃及商业新闻领域展开新的媒体分发投放。作为埃及最具影响力的商业新闻平台之一&#xff0c;埃及商业新闻将为大舍传媒提供广阔的市场和受众群体。这一合作意味着大舍传媒将有机会通过埃及商业新闻的平台向埃及的商业精英和投资者传递最新的…

Web前端:探秘几乎听不懂的技术领域

Web前端&#xff1a;探秘几乎听不懂的技术领域 Web前端&#xff0c;这个看似熟悉却又充满神秘的词汇&#xff0c;对许多人来说可能意味着一串串复杂的代码和难以理解的逻辑。然而&#xff0c;正是这个“几乎听不懂”的领域&#xff0c;在数字世界中扮演着至关重要的角色。本文…

解决无法直接抓取链接地址

当我们在爬取一些文章列表的时候&#xff0c;可能无法从接口或者html界面上获取到文章的详细列表 这个时候我们可以通过模拟点击且重写window.open方法&#xff0c;将跳转的地址捕获&#xff0c;并且放到html中去。 这样我们就可以获取到某个文章的详细地址了 // 保存原始的 …

SpringBoot项目启动时提示程序包不存在和找不到符号

一、前言 最近接手同事开发的一个Springboot工作项目&#xff0c;从svn上整体拉取下来后&#xff0c;构建完成后&#xff0c;启动的时候遇到了程序包找不到的情况&#xff0c;记录一下处理过程&#xff1b; 二、项目问题 1、报错信息&#xff1a;启动后报 java: 程序包org.sp…

劳动者最担忧的事情

一、通常的担忧 (一)怕钱不够用 怕钱不够吃饭、住宿、看病、坐车、消费。 (二)怕衰老&#xff0c;没钱养老 二、职业者的担忧 (一)销售员 最怕费劲口舌&#xff0c;力气&#xff0c;最后没把产品推销出去&#xff0c;最后没有业绩&#xff0c;工资不够用。 (二)工厂员工 …

条款10:在constructors 内阻止资源泄漏(resource leak)

想象你正在开发一个多媒体通信簿软件。这个软件可以放置包括人名、地址、电话号码等文字&#xff0c;以及一张个人相片和一段个人声音&#xff08;或许是其姓名的发音&#xff09;。 为实现此软件&#xff0c;你可能设计如下&#xff1a; class Image {//给影像数据使用。 pub…

升级 JDK17 一个不可拒绝的理由!

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

Spring AOP基于动态代理的实现的 AOP

目录 代理什么是代理代理模式 静态代理动态代理JDK动态代理CGLIB动态代理Spring AOP使用的是哪种代理&#xff1f; 代理 什么是代理 生活中的代理 房产中介 &#xff1a; 房屋进行租赁时&#xff0c;卖方会把房子授权给中介&#xff0c;由中介代理带客户看房&#xff0c;商谈…

设计师可以学什么程序编程

设计师可以学什么程序编程 在数字化日益发展的今天&#xff0c;设计师们不仅需要具备出色的创意和设计能力&#xff0c;同时掌握一定的程序编程技能也变得越来越重要。这不仅可以帮助设计师更好地将创意转化为实际产品&#xff0c;还能提高工作效率&#xff0c;拓宽职业发展空…

枚举(C语言)

1.枚举定义 枚举是 C 语言中的一种基本数据类型&#xff0c;用于定义一组具有离散值的常量&#xff0c;它可以让数据更简洁&#xff0c;更易读。 枚举类型通常用于为程序中的一组相关的常量取名字&#xff0c;以便于程序的可读性和维护性。 定义一个枚举类型&#xff0c;需要使…

行为型设计模式之模板模式

文章目录 概述原理结构图实现 小结 概述 模板方法模式(template method pattern)原始定义是&#xff1a;在操作中定义算法的框架&#xff0c;将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理解为广义上的业…

Function Calling学习

Function Calling第一篇 Agent&#xff1a;AI 主动提要求Function Calling&#xff1a;AI 要求执行某个函数场景举例&#xff1a;明天上班是否要带伞&#xff1f;AI反过来问你&#xff0c;明天天气怎么样&#xff1f; Function Calling 的基本流程 Function Calling 完整的官…

北斗高精度定位终端的工作原理和精度范围

北斗高精度定位终端的工作原理主要基于北斗卫星导航系统&#xff0c;通过卫星信号的接收、处理和计算&#xff0c;实现了对目标位置的精确测量。以下是关于北斗高精度定位终端工作原理的引文&#xff1a; ​ 北斗高精度定位终端作为一款新型的高精定位设备&#xff0c;其核心…

使用uniapp内置组件checkbox-group所遇到的问题

checkbox-group属性说明 属性名类型默认值说明changeEventHandle <checkbox-group> 中选项发生改变触发change事件 detail { value&#xff1a;[选中的checkbox的value的数组] } 问题代码 <checkbox-group change"handleEVent()"><view style&qu…

python2.7安装M2Crypto

对于Python 2.7安装M2Crypto&#xff0c;你可以按照以下步骤进行&#xff1a; 环境准备 操作系统&#xff1a;根据你的操作系统&#xff08;如macOS、Windows等&#xff09;&#xff0c;你需要确保你的Python 2.7环境已经正确设置。 依赖库&#xff1a; SWIG&#xff1a;M2Cry…

pg_lakehouse 与 datafusion

原理分析 pg_lakehouse 是 ParadeDB 推出的一个开源插件&#xff0c;支持对多种数据湖里的数据做分析计算。它的出现&#xff0c;使得 Postgres 能够像访问本地数据一样轻松访问 S3 等对象存储&#xff0c;轻松访问 Delta Lake 上的表格&#xff0c;具备数据湖分析能力。 pg_…

微信小程序实现容器图片流式布局功能,配合小程序原生框架使用。

小程序实现容器图片流式布局功能&#xff0c;因为目前论坛上也有很多博主出过类似的文章&#xff0c;这里我就以一个小白角度去讲一下如何实现的吧。给作者一点点鼓励&#xff0c;先点个赞赞吧&#x1f44d;&#xff0c;蟹蟹&#xff01;&#xff01; 目标 实现下方效果图 技术…

sonar3 使用 api/measures/componet 获取代码当,Java实现

最近团队在做一个技术架构相关的优化&#xff0c;当前的目标是想要通过代码量&#xff0c;系统架构入手。先统计到部门的代码量&#xff0c;如何进行代码行数的统计呢&#xff0c;因为我们采用的是Java技术栈&#xff0c;我就Java技术栈进行说明。 1、如何统计代码行数 要统计…