在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.pswp.cn/pingmian/84140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84140.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux C語言網絡編程詳細入門教程:如何一步步實現TCP服務端與客戶端通信

文章目錄 Linux C語言網絡編程詳細入門教程&#xff1a;如何一步步實現TCP服務端與客戶端通信前言一、網絡通信基礎概念二、服務端與客戶端的完整流程圖解三、每一步的詳細講解和代碼示例1. 創建Socket&#xff08;服務端和客戶端都要&#xff09;2. 綁定本地地址和端口&#x…

Tomcat 安裝和配置

一、Tomcat官網 Apache Tomcat - Welcome! 選擇解壓到任意一個盤&#xff01;&#xff01; 二、Tomcat配置 1&#xff09;在系統變量處新建一個變量CATALINA_HOME。CATALINA_HOME環境變量的值&#xff0c;設置為Tomcat的解壓安裝目錄 2&#xff09;找到系統變量Path&#xff0…

動態規劃 熟悉30題 ---上

本來是要寫那個二維動態規劃嘛&#xff0c;但是我今天在問題時候&#xff0c;一個大佬就把他初一時候教練讓他練dp的30題發出來了&#xff08;初一&#xff0c;啊雖然知道計算機這一專業&#xff0c;很多人從小就學了&#xff0c;但是我每次看到一些大佬從小學還是會很羨慕吧或…

基于stm32F10x 系列微控制器的智能電子琴(附完整項目源碼、詳細接線及講解視頻)

注&#xff1a;成品使用演示、項目源碼、項目文檔在文章末尾網盤鏈接中自取 所用硬件&#xff1a;STM32F103C8T6、無源蜂鳴器、44矩陣鍵盤、flash存儲模塊、OLED顯示屏、RGB三色燈、面包板、杜邦線、usb轉ttl串口 stm32f103c8t6 面包板 …

時間同步技術在電力系統中的應用

隨著電力自動化技術的發展&#xff0c;時間同步不僅可以為電力系統的事后故障分析提供支持&#xff0c;而且已經參與到電力系統的實時控制中來&#xff0c;其可靠性對電力系統的穩定運行影響越來越大。在電力系統中&#xff0c;時間同步技術廣泛應用于調度控制中心、發電廠、變…

XMLGregorianCalendar跟Date、localDateTime以及String有什么區別

1. java.util.Date&#xff08;已過時&#xff0c;不推薦新代碼使用&#xff09; 特點 表示時間戳&#xff1a;存儲自 1970-01-01 00:00:00 UTC&#xff08;Unix 紀元&#xff09; 以來的毫秒數。 問題&#xff1a; 不區分日期和時間&#xff0c;也沒有時區支持&#xff08;依…

Python網頁自動化Selenium中文文檔

1. 安裝 1.1. 安裝 Selenium Python bindings 提供了一個簡單的API&#xff0c;讓你使用Selenium WebDriver來編寫功能/校驗測試。 通過Selenium Python的API&#xff0c;你可以非常直觀的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常簡潔方便的A…

玩轉抖音矩陣:核心玩法與高效運營規則

一、 抖音矩陣&#xff1a;流量協同的生態網絡 抖音矩陣&#xff0c;本質是運營一個相互關聯、互相支持的抖音賬號群。核心目標在于通過賬號間的深度協同&#xff08;內容、流量、粉絲&#xff09;&#xff0c;打破單個賬號的流量天花板&#xff0c;實現11>2的效果。它不僅…

C++11 constexpr和字面類型:從入門到精通

文章目錄 引言一、constexpr的基本概念與使用1.1 constexpr的定義與作用1.2 constexpr變量1.3 constexpr函數1.4 constexpr在類構造函數中的應用1.5 constexpr的優勢 二、字面類型的基本概念與使用2.1 字面類型的定義與作用2.2 字面類型的應用場景2.2.1 常量定義2.2.2 模板參數…

用電腦通過USB總線連接控制keysight示波器

通過USB總線控制示波器的優勢 在上篇文章我介紹了如何通過網線遠程連接keysight示波器&#xff0c;如果連接的距離不是很遠&#xff0c;也可以通過USB線將示波器與電腦連接起來&#xff0c;實現對示波器的控制和截圖。 在KEYSIGHT示波器DSOX1204A的后端&#xff0c;除了有網口…

StarRocks 全面向量化執行引擎深度解析

StarRocks 全面向量化執行引擎深度解析 StarRocks 的向量化執行引擎是其高性能的核心設計&#xff0c;相比傳統行式處理引擎&#xff08;如MySQL&#xff09;&#xff0c;性能可提升 5-10倍。以下是分層拆解&#xff1a; 1. 向量化 vs 傳統行式處理 維度行式處理向量化處理數…

02 Deep learning神經網絡的編程基礎 邏輯回歸--吳恩達

1.邏輯回歸 邏輯回歸是一種用于解決二分類任務&#xff08;如預測是否是貓咪等&#xff09;的統計學習方法。盡管名稱中包含“回歸”&#xff0c;但其本質是通過線性回歸的變體輸出概率值&#xff0c;并使用Sigmoid函數將線性結果映射到[0,1]區間。 以貓咪預測為例 假設單個…

UDP 與 TCP 的區別是什么?

UDP&#xff08;用戶數據報協議&#xff09;與TCP&#xff08;傳輸控制協議&#xff09;有以下區別&#xff1a; 連接方式 - UDP&#xff1a;無連接&#xff0c;發送數據前不需要建立連接&#xff0c;也不維護連接狀態&#xff0c;因此UDP的通信效率較高&#xff0c;適合對實時…

6.計算機網絡核心知識點精要手冊

計算機網絡核心知識點精要手冊 1.協議基礎篇 網絡協議三要素 語法&#xff1a;數據與控制信息的結構或格式&#xff0c;如同語言中的語法規則語義&#xff1a;控制信息的具體含義和響應方式&#xff0c;規定通信雙方"說什么"同步&#xff1a;事件執行的順序與時序…

unipp---HarmonyOS 應用開發實戰

HarmonyOS 應用開發實戰指南 1. 開篇&#xff1a;為什么選擇 HarmonyOS&#xff1f; 最近在開發鴻蒙應用時&#xff0c;發現很多開發者都在問&#xff1a;為什么要選擇 HarmonyOS&#xff1f;這里分享一下我的看法&#xff1a; 生態優勢 華為手機用戶基數大&#xff0c;市場潛…

Python_day48隨機函數與廣播機制

在繼續講解模塊消融前&#xff0c;先補充幾個之前沒提的基礎概念 尤其需要搞懂張量的維度、以及計算后的維度&#xff0c;這對于你未來理解復雜的網絡至關重要 一、 隨機張量的生成 在深度學習中經常需要隨機生成一些張量&#xff0c;比如權重的初始化&#xff0c;或者計算輸入…

C++中的數組

在C中&#xff0c;數組是存儲固定大小同類型元素的連續內存塊。它是最基礎的數據結構之一&#xff0c;廣泛用于各種場景。以下是關于數組的詳細介紹&#xff1a; 一、一維數組 1. 定義與初始化 語法&#xff1a;類型 數組名[元素個數];示例&#xff1a;int arr[5]; // 定義…

three.js 零基礎到入門

three.js 零基礎到入門 什么是 three.js為什么使用 three.js使用 Three.js1. 創建場景示例 2.創建相機3. 創建立方體并添加網格地面示例 5. 創建渲染器示例 6. 添加效果(移動/霧/相機跟隨物體/背景)自動旋轉示例效果 相機自動旋轉示例 展示效果 實現由遠到近的霧示例展示效果 T…

Elasticsearch的寫入性能優化

優化Elasticsearch的寫入性能需要從多維度入手,包括集群配置、索引設計、數據處理流程和硬件資源等。以下是一些關鍵優化策略和最佳實踐: 一、索引配置優化 合理設置分片數與副本數分片數(Shards):過少會導致寫入瓶頸(無法并行),過多會增加集群管理開銷。公式參考:分…

FMC STM32H7 SDRAM

如何無痛使用片外SDRAM? stm32 已經成功初始化了 STM32H7 上的外部 SDRAM&#xff08;32MB&#xff09; 如何在開發中無痛使用SDRAM 使它像普通 RAM 一樣“自然地”使用? [todo] 重要 MMT(Memory Management Tool) of STM32CubeMx The Memory Management Tool (MMT) disp…