当前位置: 首页 > ds >正文

在Vue或React项目中使用Tailwind CSS实现暗黑模式切换:从系统适配到手动控制

在这里插入图片描述在现代Web开发中,暗黑模式(Dark Mode)已成为提升用户体验的重要功能。本文将带你使用Tailwind CSSReact项目(Vue项目类似)中实现两种暗黑模式控制方式:

  • 系统自动适配 - 根据用户设备偏好自动切换
  • 手动切换 - 通过按钮让用户自由选择

一、项目准备

使用vite创建一个项目,vuereact都可以,我这里是react

 npm create vite@latest

在项目中启用tailwindcss

npm install tailwindcss @tailwindcss/vite

在项目下的vite.config.ts中添加tailwindcss插件

// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import tailwindcss from '@tailwindcss/vite'// https://vite.dev/config/
export default defineConfig({plugins: [react(),tailwindcss(),],
})

index.css中引入tailwindcss,并在main.tsx中引入index.css

/* index.css */
@import "tailwindcss";
@custom-variant dark (&:where(.dark, .dark *));
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.tsx'createRoot(document.getElementById('root')!).render(<StrictMode><App /></StrictMode>,
)

接下来我们在App.tsx中编写我们的暗黑模式切换代码

二、tailwindcss暗黑模式切换

2.1 prefers-color-scheme控制暗黑模式

Tailwind 默认通过 prefers-color-scheme CSS 媒体查询控制暗模式。意思是 它会根据用户的操作系统或浏览器设置自动应用暗模式或亮模式样式。


2.1.1 什么是 prefers-color-scheme

prefers-color-scheme 是一种 CSS 媒体查询,可以检测用户系统的外观偏好:

@media (prefers-color-scheme: dark) {/* 暗模式样式 */
}@media (prefers-color-scheme: light) {/* 亮模式样式 */
}

操作系统(如 macOS、Windows、iOS、Android)或浏览器如果启用了“暗模式”,那么 prefers-color-scheme: dark 条件会变为 true


2.1.2 Tailwind 如何利用 prefers-color-scheme

Tailwind 提供了一个 dark: 变体,可以根据是否处于暗模式应用不同的样式。

例子:

<h1 class="text-black dark:text-white">Hello</h1>
  • 当用户系统是亮模式 → 显示黑色文字
  • 当用户系统是暗模式 → 显示白色文字

Tailwind 默认启用的是基于 media 的暗模式,也就是:

// tailwind.config.js
module.exports = {darkMode: 'media', // 默认值,根据系统设置自动切换
}

2.2 用户自己控制暗黑模式切换

如果我们不想根据用户系统自动切换,而是希望 手动控制暗模式(例如通过按钮),可以在index.css中这样设置:

@import "tailwindcss";
/* 代表用户通过通过类名控制暗黑模式 */
@custom-variant dark (&:where(.dark, .dark *));

然后在App.tsx中写入代码就可以用按钮手动控制暗黑模式了,使用 JavaScript 动态添加或移除 dark 类名,就可以实现手动切换。

import React, { useState } from 'react'const App: React.FC = () => {const [darkmode, setDarkmode] = useState(false)return (<div className={darkmode ? 'dark' : ''}><button className='rounded px-4 py-4 bg-sky-200 mx-2 my-2 cursor-pointer' onClick={()=>setDarkmode(!darkmode)}>切换模式</button><div className="bg-white dark:bg-gray-800 rounded-lg px-6 py-8 ring shadow-xl ring-gray-900/5"><div><span className="inline-flex items-center justify-center rounded-md bg-indigo-500 p-2 shadow-lg"><svg className="h-6 w-6 stroke-white"></svg></span></div><h3 className="text-gray-900 dark:text-white mt-5 text-base font-medium tracking-tight ">Writes upside-down</h3><p className="text-gray-500 dark:text-gray-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></div>)
}export default App

当然,除了用类名控制还可以使用数据属性手动控制暗黑模式。原理和用类名控制差不多,区别是一个是css类选择器,一个是用css属性选择器

@import "tailwindcss";
/* 使用数据属性手动控制暗黑模式切换 */
@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *));
<html data-theme="dark"><body><div class="bg-white dark:bg-black"><!-- ... --></div></body>
</html>

总结:只要我们在项目中的顶层Dom元素动态控制类名(或属性名),就可以在整个页面精细的对每个Dom元素进行暗色和亮色主题的定制,当然官方还支持多个自定义主题,有兴趣的话可以看官方文档。

http://www.xdnf.cn/news/12770.html

相关文章:

  • iOS 门店营收表格功能的实现
  • 初探Succinct Jagged稀疏多项式承诺方案
  • AI书签管理工具开发全记录(十五):TUI基本逻辑实现与数据展示
  • Kerberos面试内容整理-未来发展趋势
  • 第二十八课:深度学习及pytorch简介
  • LeetCode hot100---152.乘机最大子数组
  • 将大象装进冰箱里需要几步?- Edge AI模组的部署
  • AI大模型:(二)3.2 Llama-Factory微调训练deepseek-r1实践
  • AI大神吴恩达-提示词课程笔记
  • 《Vuejs设计与实现》第 8 章(挂载与更新)
  • 【氧化镓】HTFB应力对β - Ga2O3 SBD的影响
  • 【计算机网络】Linux下简单的TCP服务器(超详细)
  • 【精选】计算机毕业设计Python Flask海口天气数据分析可视化系统 气象数据采集处理 天气趋势图表展示 数据可视化平台源码+论文+PPT+讲解
  • 【Hugging Face】实践笔记:Pipeline任务、BERT嵌入层、Train任务、WandB解析
  • 【基础算法】枚举(普通枚举、二进制枚举)
  • 基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
  • 【Java学习笔记】包装类
  • STM32开发中,线程启动异常问题排查简述
  • Linux下VSCode开发环境配置(LSP)
  • Docker容器部署elasticsearch8.*与Kibana8.*版本使用filebeat采集日志
  • 基于Python学习《Head First设计模式》第七章 适配器和外观模式
  • CppCon 2015 学习:Intro to the C++ Object Model
  • 能上Nature封面的idea!强化学习+卡尔曼滤波
  • Appium+python自动化(十二)- Android UIAutomator
  • [TI板]MSPM0G3507学习笔记(一) 超详细keil环境配置+烧录配置+空工程迁移+vscode配置+点灯
  • PyCharm集成Conda环境
  • 北大开源音频编辑模型PlayDiffusion,可实现音频局部编辑,比传统 AR 模型的效率高出 50 倍!
  • 【网站建设】网站 SEO 中 meta 信息修改全攻略 ✅
  • OkHttp 3.0源码解析:从设计理念到核心实现
  • SOC-ESP32S3部分:33-声学前端模型ESP-SR