Tailwind CSS 實戰,基于 Kooboo 構建 AI 對話框頁面(三):實現暗黑模式主題切換

基于前兩篇的內容,為頁面添加主題切換功能,實現網站頁面的暗黑模式:?

Tailwind css實戰,基于Kooboo構建AI對話框頁面(一)-CSDN博客

Tailwind css實戰,基于Kooboo構建AI對話框頁面(二)-CSDN博客


在前兩篇內容的基礎上,為頁面新增暗黑 / 亮色雙主題切換功能,完善用戶體驗。最終效果如下:


一、暗黑模式的需求與價值

  1. 用戶體驗升級:提供亮色 / 暗黑主題切換,適配不同使用場景(如夜間閱讀、視覺偏好),提升產品包容性。
  2. 視覺一致性:通過 CSS 變量統一管理顏色,確保主題切換時界面元素(如聊天氣泡、按鈕、文本)的樣式協調。
  3. 技術挑戰:如何實現動態主題切換、持久化存儲用戶偏好。

二、暗黑模式技術實現(核心代碼解析)

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,確保樣式切換無延遲。

三、與前兩章內容的整合

  1. 容器樣式與 CSS 變量深度綁定
    在 HTML 中通過?bg-[var(--bg-primary)]?border-[var(--border-color)]?等寫法,將容器的背景色、邊框色直接關聯到 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)]">
    優勢:所有容器樣式通過變量動態控制,一行 CSS 變量修改即可全局響應主題切換,無需逐個組件調整樣式,極大提高了開發效率。
  2. 測試場景

    • 手動切換主題,檢查所有 UI 元素(背景、文本、邊框、圖標)是否正確響應;
    • 刷新頁面,查看是否會清除本地存儲,驗證系統主題適配邏輯;
    • 檢查移動端(如小屏幕下按鈕定位、交互是否正常)。

四、總結

本章通過?CSS 變量 + 本地存儲 + 系統主題適配,實現了 AI 對話框的暗黑模式切換,完成了從?靜態頁面(一)→ 交互邏輯(二)→ 視覺主題優化(三)?的完整實戰鏈路。代碼中:

  • Tailwind 與自定義變量的深度整合,簡化了主題樣式管理;
  • JavaScript 邏輯?確保用戶偏好持久化和系統兼容性;
  • UI 細節(如圖標切換)?提升了交互體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81656.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81656.shtml

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

相關文章

主題閱讀輸出-關于成年/成熟的認識-01-學習

快速回顧 學習的最終目的&#xff0c;成年人的學習特點&#xff0c;學習對象的選取(學什么)&#xff0c;學習過程的理解&#xff0c;對學習狀態的覺察&#xff1b; 參考來源 書籍 《心發怒放的人生》 《我的第一本人生規劃手冊》 《五維學習力》 《學習的答案》 01-學習是什…

GitLab 18.0 正式發布,15.0 將不再受技術支持,須升級【一】

GitLab 是一個全球知名的一體化 DevOps 平臺&#xff0c;很多人都通過私有化部署 GitLab 來進行源代碼托管。極狐GitLab 是 GitLab 在中國的發行版&#xff0c;專門為中國程序員服務。可以一鍵式部署極狐GitLab。 學習極狐GitLab 的相關資料&#xff1a; 極狐GitLab 官網極狐…

Python+Flask+Html做一個簡單的測試聯調工具

一、場景&#xff1a; 當與外部聯調或者內部需要走一些固定流程&#xff0c;且重復的事情&#xff0c;往往需要測試經常性的配合且做重復的工作的聯調&#xff0c;這時候需要一些工具作為輔助&#xff0c;或者提供給外部 二、框架&#xff1a; 可以通過PythonFlaskHtml做一個…

Qt5、C++11 獲取wifi列表與wifi連接

一、獲取wifi列表 .h 文件內容 #include <QWidget> #include <QVBoxLayout> #include <QPushButton> #include <QCheckBox> #include <QListWidget>class Setting : public QWidget {Q_OBJECT public:explicit Setting(QWidget *parent nul…

互聯網大廠Java求職面試:AI與大模型應用集成中的架構難題與解決方案-1

互聯網大廠Java求職面試&#xff1a;AI與大模型應用集成中的架構難題與解決方案-1 場景描述 鄭薪苦&#xff0c;一個看似不靠譜但技術潛力巨大的程序員&#xff0c;在一次針對AI與大模型應用集成的面試中&#xff0c;被一位技術總監級別的人物提問。面試官以嚴肅專業的態度&a…

SpringMVC實戰:動態時鐘

引言 在現代 Web 開發中&#xff0c;選擇一個合適的框架對于項目的成功至關重要。Spring MVC 作為 Spring 框架的核心模塊之一&#xff0c;以其清晰的架構、強大的功能和高度的可配置性&#xff0c;成為了 Java Web 開發領域的主流選擇。本文將通過一個“動態時鐘”的實戰項目…

知行之橋如何將消息推送到釘釘群?

在釘釘平臺中&#xff0c;機器人主要分為企業機器人和自定義機器人兩類。本文將重點介紹如何通過自定義機器人&#xff0c;實現將知行之橋 EDI 系統的通知消息高效推送至釘釘群&#xff0c;幫助企業第一時間掌握業務動態。 一、在釘釘群中添加自定義機器人 在需要接收知行之橋…

哈工大計算機系統2024大作業——Hello的程序人生

計算機系統 大作業 題 目 程序人生-Hello’s P2P 專 業 人工智能 學   號 2022112040 班 級 2203601 學 生 郄東昕 指 導 教 師 吳銳 計算機科學與技術學院…

聯軟SDP+安渡:收斂暴露面 從生產網自動取數 安全高效

制造業作為國家經濟的基石&#xff0c;其網絡安全面臨著獨特的挑戰。出于合規和安全考慮&#xff0c;企業內部往往劃分出多個相互隔離的網絡區域&#xff0c;如辦公網、研發網等&#xff0c;以提升整體安全防護能力。然而&#xff0c;網絡隔離在保障安全的同時&#xff0c;也帶…

LeetCode 543 二叉樹的直徑

二叉樹的直徑&#xff1a;樹中任意兩個節點間最長路徑的長度。這個路徑可能經過根節點&#xff0c;也可能不經過。 算法思路 采用深度優先搜索(DFS)的后序遍歷方式&#xff0c;計算每個節點的左右子樹高度&#xff0c;并在過程中更新最大直徑。 代碼解析 var diameterOfBin…

構建安全與合規的Jenkins環境:全周期審計方案詳解

引言 Jenkins作為最流行的CI/CD工具之一&#xff0c;承載著企業核心的自動化構建與交付流程。然而&#xff0c;隨著其復雜性的增加&#xff0c;安全漏洞、權限濫用和合規風險也隨之而來。近期頻發的供應鏈攻擊&#xff08;如通過惡意插件入侵&#xff09;更是敲響警鐘。如何確…

PowerShell Install Sql Server 2025 beta

Sql Server 2025 Download 其它版本和系統自動化腳本下載SQL Server 2025SSMS sql命令行安裝ssms 命令行安裝網盤分享SQL2025 beta

【K8S】K8S基礎概念

一、 K8S組件 1.1 控制平面組件 kube-apiserver&#xff1a;公開 Kubernetes HTTP API 的核心組件服務器。 etcd&#xff1a;具備一致性和高可用性的鍵值存儲&#xff0c;用于所有 API 服務器的數據存儲。 kube-scheduler&#xff1a;查找尚未綁定到節點的 Pod&#xff0c;并將…

【C/C++】設計模式之工廠模式:從簡單到抽象的演進

文章目錄 設計模式之工廠模式&#xff1a;從簡單到抽象的演進1 “工廠”模式分類1.1 簡單工廠&#xff08;Simple Factory&#xff09;1.2 工廠方法&#xff08;Factory Method&#xff09;1.3 抽象工廠&#xff08;Abstract Factory&#xff09; 2 分析3 總結對比 設計模式之工…

HTTP 與 HTTPS 深度解析:原理、實踐與大型項目應用

1. HTTP 與 HTTPS 基礎概念 1.1 HTTP&#xff08;超文本傳輸協議&#xff09; 定義&#xff1a;應用層協議&#xff0c;基于 TCP/IP 通信&#xff0c;默認端口 80 特點&#xff1a; 無狀態協議&#xff08;需 Cookie/Session 維護狀態&#xff09; 明文傳輸&#xff08;易被…

【Excel 擴展正則的能力】工作中賦予處理單元格文本的強大正則表達提取能力

文本提取處理領域&#xff0c;正則表達式是最為強大的存在&#xff0c;工作中Excel 是常用的小型數據采集&#xff0c;處理&#xff0c;分析的工具但本身不具備正則的能力&#xff0c;讓Excel擁有正則的能力無疑是如虎添翼的能力。 方案 讓正則作為函數內容的一部分&#xff0c…

rabbitmq 使用過程中遇到的問題

1. 連接rabbitmq 地址寫法&#xff0c;5672 是連接的端口號&#xff0c;15672是頁面訪問的端口號 2. elasticsearch 的訪問端口是9200&#xff0c; 不是9300&#xff0c;9300 是后臺通信端口號 &#xff0c;這個頁面訪問的端口號是一樣&#xff0c; 3. rabbitmq 的5種交換接…

HTML實戰:響應式個人資料頁面

我將創建一個現代化的響應式個人資料頁面,展示HTML在實際應用中的強大功能。這個頁面將包含多個實戰元素:導航欄、個人簡介、技能展示、作品集和聯系表單。 設計思路 使用Flexbox和Grid布局實現響應式設計 添加CSS過渡效果增強交互體驗 實現深色/淺色模式切換功能 創建懸停動…

工業自動化實戰:基于 VisionPro 與 C# 的機器視覺 PLC 集成方案

一、背景介紹 在智能制造領域&#xff0c;機器視覺檢測與 PLC 控制的無縫集成是實現自動化生產線閉環控制的關鍵。本文將詳細介紹如何使用 C# 開發上位機系統&#xff0c;實現 Cognex VisionPro 視覺系統與西門子 S7 PLC 的數據交互&#xff0c;打造高效、穩定的工業檢測方案。…

如何處理 Python 入門難以進步的現象

Python 初學者難以進步的根本原因在于&#xff1a;缺乏項目實踐、學習路徑不清晰、沒有掌握編程思維、忽略調試與源碼閱讀、缺乏系統性目標驅動。其中&#xff0c;“沒有項目驅動導致學習孤島效應”最為常見且致命。許多初學者只停留在語法知識、刷題階段&#xff0c;無法構建可…