前端使用tailwindcss 快速实现主题切换方案

news2024/11/27 18:36:24

使用Tailwind CSS在黑暗模式下为你的网站设计样式。

现在,黑暗模式是许多操作系统的第一流功能,为你的网站设计一个黑暗版本以配合默认设计,变得越来越普遍。

为了使这一点尽可能简单,Tailwind包括一个暗色变体,让你在启用暗色模式时以不同的方式设计你的网站:

大家可以看一下,这是vue.js的官网切换主题功能,两个主题(白天/黑夜),通过开关切换换肤。官网是是更换主题后永久更换,刷新后主题也是更换后的。我们可以通过后台存储,将主题类型存储起来,也可以通过浏览器存储,短暂的存储主题类型,以达到主题更换的需求。
在这里插入图片描述
在这里插入图片描述
根据这个思路我想在我原有的项目上增加一个这个功能,这样项目看起来比较高大上。话不多少,直接开干。

前提

因为我当前的项目是一个前台项目,但是呢 我又不想写css,只能使用tailwindcss 进行样式调整,我是用的技术栈是:vue3+pinia+ts

 "pinia": "^2.0.33",
 // 持久化
 "pinia-plugin-persistedstate": "^3.1.0",
"tailwindcss": "^3.2.7"
安装 Tailwind CSS: npm install tailwindcss --save-dev 或 yarn add tailwindcss。

开始使用之前我们需要搞清楚步骤:

  1. 监听主题切换
  2. 根据行为保存当前需要展示的主题 pinia中
  3. 根据pinia 中保存的当前主题 修改html的class

搞清楚之后 开始整活:

1. 监听主题切换

项目要是有看不懂的css 可以ps回头我会单独讲解。需要理解的我会给注释。

<template>
<div class="w-[140px] overflow-hidden">
     <div
         v-for="item in themeArr"
         :key="item.id"
         @click="onItemClick(item)"
         class="flex items-center p-1 cursor-pointer rounded
          hover:bg-zinc-100/60 dark:hover:bg-zinc-800"
     >
         <m-svg-icon
             :name="item.icon"
             class="w-1.5 h-1.5 mr-1"
             fillClass="fill-zinc-900 dark:fill-zinc-300"
         ></m-svg-icon>
         <span class="text-zinc-900 dark:text-zinc-300 text-sm">{{ item.name }}</span>
     </div>
 </div>
</template>
<script setup>
// 下面的文件将会展示pinia 中的写法
import { storeToRefs } from "pinia"
import appStore from "@/store"
import { computed } from "vue"
const useThemeTypeStore = storeToRefs(appStore.useThemeTypeStore)

// 定义当前主题列表
const themeArr = [
    {
        id: 0,
        type: 'light',
        icon: "theme-light",
        name: "极简白",
    },
    {
        id: 1,
        type: 'dark',
        icon: "theme-dark",
        name: "极夜黑",
    },
    {
        id: 2,
        type: 'system',
        icon: "theme-system",
        name: "跟随系统",
    },
]

const onItemClick = (item) => {
    appStore.useThemeTypeStore.changeThemeType(item.type)
}
cons
</script>

2. 根据行为保存当前需要展示的主题 pinia中theme.js

改js只是提供持久化和 选择主题样式,大家可以自己定义相关js。

import { defineStore } from "pinia"
import { ref } from "vue"
const useThemeTypeStore = defineStore("themeType", () => {
    const themeType = ref('light')
    const changeThemeType = (newTheme: any) => {
        themeType.value = newTheme
    }
    return { themeType, changeThemeType }
},{
	// 持久化
    persist: [
        {
            // 存储到sessionStorage
            paths: ["themeType"],
            storage: sessionStorage,
            key:'themeType'
        }
    ],
})
export default useThemeTypeStore

utils/theme.ts

import appStore from "@/store"
import { watch } from "vue"

// 系统监听变量
let matchMedia: any = ""
const watchSystemThemeChange = () => {
    // 仅需一次初始化
    if (matchMedia) return
   // Window 的 matchMedia() 方法返回一个新的 MediaQueryList 对象,表示指定的媒体查询 (en-US)字符串解析后的结果。返回的 MediaQueryList 可被用于判定 Document 是否匹配媒体查询,或者监控一个 document 来判定它匹配了或者停止匹配了此媒体查询。
    matchMedia = window.matchMedia("(prefers-color-scheme: dark)")
    matchMedia.onchange = () => {
        changeTheme('system')
    }
}
/**
 * 变更主题
 * @param theme
 */
const changeTheme = (theme: any) => {
    let themeClassName = ""
    switch (theme) {
        case 'light':
            themeClassName = "light"
            break
        case 'dark':
            themeClassName = "dark"
            break
        case 'system':
            // 调用方法监听系统主题变化
            watchSystemThemeChange()
            themeClassName = matchMedia.matches ? "dark" : "light"
            break
    }
    // 修改 html中class
    const html = document.querySelector("html")
    if (html) {
        html.className = themeClassName
    }
}
// 监听pinia 里面定义的 变量
export const useTheme = () => {
    watch(
        () => appStore.useThemeTypeStore.themeType,
        val => {
            changeTheme(val)
        },
        {
            immediate: true,
        }
    )
}

3. 根据pinia 中保存的当前主题 修改html的class

代码详解:
现在,只要HTML树中较早出现dark:{class}类,它们就会被应用,而不是根据prefers-color-scheme来应用。

tailwindcss 内置的 Dark Mode 由两部分组成:

  • dark 修饰符,用于指定暗黑模式下的样式
  • darkMode 配置,指定暗黑模式的应用标识
    使用 dark 修饰符指定样式
<div class="bg-white dark:bg-slate-800 rounded-lg px-6 py-8 ring-1 ring-slate-900/5 shadow-xl">
  <div>
    <span class="inline-flex items-center justify-center p-2 bg-indigo-500 rounded-md shadow-lg">
      <svg class="h-6 w-6 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"><!-- ... --></svg>
    </span>
  </div>
  <h3 class="text-slate-900 dark:text-white mt-5 text-base font-medium tracking-tight">Writes Upside-Down</h3>
  <p class="text-slate-500 dark:text-slate-400 mt-2 text-sm">
    The Zero Gravity Pen can be used to write in any orientation, including upside-down. It even works in outer space.
  </p>
</div>

tailwindcss 通过 extractor 提取 html 和 js 中的 class,变体 class
.dark:bg-slate-800 作为独立项被提出。 默认情况下, tailwindcss
通过媒体查询自动跟随系统切换暗黑模式。也可以设置 darkMode 改用类策略,手动切换暗黑模式。

需要注意的是 tailwindcss 支持颜色透明度修改器,也就是用 bg-slate-700/50 这样的写法给背景加透明度 background-color: rgb(55 65 81 / 0.5) 。因此色值定义中需要保留 <alpha-value> 占位符供 tailwindcss 实现透明度修改器,同时把 CSS 变量赋值为 rgb 或 hsl 的组成值即可。

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

POWERBUILDER基础学习提纲

Chengg0769 2012年 版权信息保留&#xff1a; www.mis2erp.com http://blog.csdn.net/chengg0769 http://www.haojiaocheng.cc 这当时是给列给一位因伤休养的朋友。他有一段难捱的时间&#xff0c;想学习学习。这样复出之后也不至于工作无望或者浪费这段时间。 在SQL2000基础…

什么是API接口测试

什么是 API &#xff1f; API 是“应用程序编程接口”的缩写&#xff0c;是一种允许不同应用程序之间相互通信和交换数据的接口。就好像在餐厅点餐一样&#xff0c;你只需要告诉服务员你想要的食物&#xff0c;而不需要了解厨房中的具体操作&#xff0c;服务员会把你的订单传递…

【PyQt5】(02)Qt Designer:快速设计GUI界面的利器

系列文章目录 【PyQt5】&#xff08;01&#xff09;PyQt的详细介绍 文章目录 系列文章目录前言一、安装Qt Designer二、Qt Designer的基本用法2.1 新建窗体2.2 添加部件2.3 编辑属性2.4 布局管理2.5 设置样式2.6 保存文件 三、将UI文件转化为Python代码并显示3.1 使用uic将UI文…

请问一下java在线编程的网站有哪一些?

前言 下面为大家整合了一些Java在线编程的的网站&#xff0c;个人认为都是挺好用的&#xff0c;整合不易&#xff0c;希望大家能顺手留下点赞和收藏&#xff01; 废话少说&#xff0c;我们直接进入正题&#xff1a; 1、菜鸟工具 菜鸟工具的这个在线编程工具页面很为简洁&…

linux查看/修改某个进程运行的CPU核

1.ps -eF #查看fwd进程运行在哪个cpu核上 [rootCENTOS57 rpm]# ps -eF | grep fwd 2.top命令 (1)top (2)按f键可以选择下面配置选项 P Last Used Cpu (SMP) (3)Esc 退回到top界面可以看到多了一列进程所在cpu信息 3.pidstat命令 查看进程使用cpu情况&#xff0c;如果绑定了多…

CH32V3xx RT-Thread下的ethernet调试及问题记录

目录 1、CH32V3xx 以太网模块简介2、TCP Client 程序2.1 WCHNET库2.1.1 添加WCHNET2.1.2 以太网配置2.2 TCP Client代码2.3 测试结果3、调试过程中的一些问题1、CH32V3xx 以太网模块简介 CH32V3xx MCU的以太网收发器是微控制器的一个重要高速高速通讯外设,集成了千兆的MAC(媒体…

堆积如山:探索数据结构中的堆

前言 欢迎来到小K的数据结构专栏的第十一小节&#xff0c;本节将为大家带来堆的详解并带来堆题目的讲解&#xff08;✨当然也为大家准备了完整的源码 &#xff09;~希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f43e; 目录…

排查一次nacos动态配置不生效

一、问题描述 新需求需要使用到nacos动态配置&#xff0c;但是开发完成之后联调过程中发现动态配置没有生效。 二、问题排查 首先在本地测试&#xff0c;发现启动服务后修改nacos配置确实不生效&#xff0c;在查看启动日志时发现服务启动时打印了下面这样的日志。这里是在配…

Blender3.2使用python脚本命令的三种方式, 以及源码示例

本文环境系统OS(Win10) 方式一&#xff0c;在Script(脚本)功能里面的Console(控制台输入python代码)。 如下图: 对应的三句代码是&#xff1a; print("Hi, blender.")import bpybpy.ops.mesh.primitive_cube_add(enter_editmodeFalse, alignWORLD, location(0,0, …

ModBus通信详解

Modbus协议包括ASCII、RTU、TCP等&#xff0c;并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构&#xff0c;而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的…

python通过远程连接mysql数据库进行操作

文章目录 前言一、开启远程访问权限1、开启远程访问端口2、命令行登录mysql 二、Navicat 建库1、新建连接2、建库建表 三、python对数据库进行远程操作三、总结四、参考资料 前言 环境&#xff1a; 1、mysql 5.7 2、pycharm 22.3.1 Professional 3、navicat 一、开启远程访问权…

数字孪生与物流园区:优化布局规划的关键

随着全球贸易的增长和物流行业的发展&#xff0c;物流园区作为重要的物流枢纽和供应链管理中心&#xff0c;扮演着至关重要的角色。而数字孪生技术的出现为物流园区的运营和管理带来了革命性的变化。数字孪生技术是一种将实体物体与其数字化模型相结合的创新技术&#xff0c;通…

微信小程序| 基于ChatGPT+明基屏幕挂灯实现超智能家居物联网小程序

一、需求背景 在尝试了这么多次的ChatGPT在纯软方向的应用开发后&#xff0c;深感LLM(大语言模型)的能力之强大。俗话说得好&#xff1a;心有多大舞台就有多大&#xff01;基于AI大模型&#xff0c;可以尝试的方面实在是数不胜数&#xff01;轻轻松松就可以突破在移动互联网时…

1. Qt小游戏 --- 推箱子

1. 说明 这个小游戏主要使用Qt中的绘制事件函数**paintEvent()**在画布上面不停的绘制图形,并使用定时器做时间上的触发处理,这个小游戏只是做了简单的逻辑处理,具体复杂的功能读者可自行发挥,效果展示如下: Qt制作推箱子小游戏 2. 相关代码 《推箱子》小游戏项目文件中…

最新(photoshop AI)photoshop beta 安装成功过程

目录 安装过程说明如图 效果如图 第一步&#xff1a;手机浏览器 创建 微软邮箱 打开浏览器 注册时候&#xff0c;选择 MG&#xff0c;其他正常填写即可。 第二步&#xff1a;打开 官网&#xff0c;&#xff08;创建账号&#xff09;或者直接输入注册的账号直接登录 第三…

ArgoCD(四)--Application管理

1.3 Application管理 先导入一个测试的repo在本地gitlab&#xff08;gitlab.icloud2native.com&#xff09;&#xff0c;方便测试。 1.3.1 创建application 通过argocd cli创建application 通过argocd 的命令行可以创建application argocd app create guestbook --repo http…

Spark大数据处理学习笔记1.2 Scala变量与数据类型

文章目录 一、变量声明&#xff08;一&#xff09;简单说明&#xff08;二&#xff09;利用val声明变量1、声明方式2、案例演示 &#xff08;三&#xff09;利用var声明变量1、声明方式2、案例演示 &#xff08;四&#xff09;同时声明多个变量 二、数据类型&#xff08;一&…

企业课(理论)

数据链路层 IP地址&#xff1a;32bit 十进制、二进制表示 Mac地址&#xff1a;48bit 十六进制 &#xff08;0-9&#xff0c;a-f&#xff09; Mac地址&#xff1a; 单播Mac地址&#xff1a;一对一 48bit第八bit为0 组播Mac地址&#xff1a;一对多 48bit第八b…

iOS app上架截屏尺寸 5.5英寸:1242x2208 6.5英寸:1242x2688

5.5英寸和6.5英寸的iphone的截屏必须上传 5.5英寸&#xff1a;1242x2208 6.5英寸&#xff1a;1242x2688

张量分析入门笔记 (Tensor For Beginner)

前言 学习的时候感觉要学一下张量&#xff0c;在B站看了一个视频&#xff0c;记录一下&#xff0c;参考的是B站视频【机翻】张量分析入门 (Tensor For Beginner) 前言1. 张量的定义 Tenson Definition2. 张量的前向和后向的转换 Forward and Backward Transformation3. 向量 Ve…