基于前兩篇的內容,為頁面添加主題切換功能,實現網站頁面的暗黑模式:?
Tailwind css實戰,基于Kooboo構建AI對話框頁面(一)-CSDN博客
Tailwind css實戰,基于Kooboo構建AI對話框頁面(二)-CSDN博客
在前兩篇內容的基礎上,為頁面新增暗黑 / 亮色雙主題切換功能,完善用戶體驗。最終效果如下:
一、暗黑模式的需求與價值
- 用戶體驗升級:提供亮色 / 暗黑主題切換,適配不同使用場景(如夜間閱讀、視覺偏好),提升產品包容性。
- 視覺一致性:通過 CSS 變量統一管理顏色,確保主題切換時界面元素(如聊天氣泡、按鈕、文本)的樣式協調。
- 技術挑戰:如何實現動態主題切換、持久化存儲用戶偏好。
二、暗黑模式技術實現(核心代碼解析)
1. CSS 變量定義:主題解耦
在 CSS 中,通過:root
偽類定義的變量是全局作用域的,它代表了文檔的根元素(在 HTML 中就是<html>
元素)。這里定義的變量是亮色主題(也就是默認主題)下的顏色值。
<style>/* 亮色主題(默認) */:root {--bg-primary: #ffffff;--bg-secondary: #f8f9fa;--bg-tertiary: #e9ecef;--border-color: #dee2e6;--text-primary: #333333;--text-secondary: #6c757d;--text-tertiary: #e5e7eb;--chat-bubble: #ffffff;--chat-bubble-ai: #f8f9fa;}/* 暗黑主題 */.dark {--bg-primary: #1e293b;--bg-secondary: #0f172a;--bg-tertiary: #334155;--border-color: #4b5563;--text-primary: #f3f4f6;--text-secondary: #9ca3af;--text-tertiary: #1f2937;--chat-bubble: #334155;--chat-bubble-ai: #1e293b;}</style>
作用:通過?:root
?和?.dark
?類定義全局顏色變量,后續樣式直接引用變量(如?bg-[var(--bg-primary)]
),實現主題 “一鍵切換”。
- Tailwind 整合:利用?
var()
?函數與 Tailwind 的自定義值([]
?語法)結合,如background-color: var(--bg-primary);
無需重復編寫暗黑模式專屬類。
2. 切換按鈕 UI(HTML + Tailwind)
從 HTML 結構來看,這是一個用于切換暗黑模式的按鈕。id="darkModeToggle"
為按鈕賦予了唯一標識,方便在 JavaScript 中獲取和操作。
<!-- 暗黑模式切換按鈕 --><button id="darkModeToggle" class="fixed top-4 right-4 z-10 bg-[var(--bg-primary)] text-[var(--text-primary)] p-2 rounded-full shadow-lg hover:bg-[var(--bg-tertiary)] transition-colors"><i class="fa fa-moon-o dark:hidden"></i><i class="fa fa-sun-o hidden dark:inline"></i></button>
- 交互設計:
- 固定定位(
fixed
)確保按鈕始終可見; dark:hidden
?和?dark:inline
?實現圖標隨主題切換(Tailwind 暗黑模式前綴?dark:
?自動匹配?.dark
?類);- hover 效果(
hover:bg-[var(--bg-tertiary)]
)增強交互反饋。
- 固定定位(
3. 主題切換邏輯(JavaScript)
<script>// 暗黑模式切換邏輯document.addEventListener('DOMContentLoaded', function() {const toggle = document.getElementById('darkModeToggle');const html = document.documentElement;// 檢查本地存儲中的偏好設置if (localStorage.getItem('darkMode') === 'true' || (localStorage.getItem('darkMode') === null && window.matchMedia('(prefers-color-scheme: dark)').matches)) {html.classList.add('dark');}// 切換事件:更新類名 + 本地存儲toggle.addEventListener('click', function() {html.classList.toggle('dark');localStorage.setItem('darkMode', html.classList.contains('dark'));});});</script>
這段 JavaScript 代碼的作用是實現暗黑模式的切換邏輯和用戶偏好的管理:
document.addEventListener('DOMContentLoaded', () => {... })
:這是一個事件監聽器,當頁面的 DOM(文檔對象模型)加載完成后,才會執行里面的代碼。確保在頁面元素都加載好之后再進行操作,避免獲取不到元素的情況。const toggle = document.getElementById('darkModeToggle');
:通過id
獲取到頁面上的暗黑模式切換按鈕元素
核心邏輯:
- 持久化存儲:通過?
localStorage
?記錄用戶選擇,刷新頁面后保持主題; - 系統主題適配:首次訪問時,若用戶系統偏好暗黑模式(
prefers-color-scheme: dark
),自動啟用暗黑主題; - 性能優化:直接操作?
document.documentElement
(HTML 根元素)的?classList
,確保樣式切換無延遲。
三、與前兩章內容的整合
-
容器樣式與 CSS 變量深度綁定:
在 HTML 中通過?bg-[var(--bg-primary)]
?border-[var(--border-color)]
?等寫法,將容器的背景色、邊框色直接關聯到 CSS 變量。。例如:
優勢:所有容器樣式通過變量動態控制,一行 CSS 變量修改即可全局響應主題切換,無需逐個組件調整樣式,極大提高了開發效率。<!-- 窗口容器 --> <div class="max-w-3xl w-full bg-[var(--bg-primary)] <!-- 主背景色,亮色/暗黑模式自動切換 -->border border-[var(--border-color)] <!-- 邊框色 -->rounded-lg shadow-xl overflow-hidden"><!-- 消息容器 --> <div id="messageContainer" class="h-[60vh] overflow-y-auto p-4 space-y-4 bg-[var(--bg-secondary)]"><!-- 輸入區域 --> <div class="bg-[var(--bg-primary)] p-4 border-t border-[var(--border-color)]">
-
測試場景:
- 手動切換主題,檢查所有 UI 元素(背景、文本、邊框、圖標)是否正確響應;
- 刷新頁面,查看是否會清除本地存儲,驗證系統主題適配邏輯;
- 檢查移動端(如小屏幕下按鈕定位、交互是否正常)。
四、總結
本章通過?CSS 變量 + 本地存儲 + 系統主題適配,實現了 AI 對話框的暗黑模式切換,完成了從?靜態頁面(一)→ 交互邏輯(二)→ 視覺主題優化(三)?的完整實戰鏈路。代碼中:
- Tailwind 與自定義變量的深度整合,簡化了主題樣式管理;
- JavaScript 邏輯?確保用戶偏好持久化和系統兼容性;
- UI 細節(如圖標切換)?提升了交互體驗。