vue3+tdesign實現明暗主題切換

很多項目中有些會涉及到明暗主題切換的功能,今天就來梳理一下有關這方面的具體實現步驟和使用到的方法,本篇文章使用到的組件是tdesign,利用部分案例,主要闡述明暗主題切換的技術原理和實現步驟,僅供參考。

目錄

一、技術原理與核心

二、實現步驟詳解

1.組件搭建

2.狀態持久化

?3.模式切換邏輯

?4.組件掛載

5.事件監聽

?6.配置與優化

7.使用

三、全部代碼


一、技術原理與核心

TDesign 通過 CSS 自定義屬性(變量)實現主題切換,所有顏色相關配置均使用?var()?函數引用變量。現代瀏覽器已廣泛支持該特性,TDesign 默認提供淺色/深色兩套色板。主要核心邏輯是通過操作?html?標簽的?theme-mode?屬性觸發樣式切換,TDesign 組件庫會自動監聽該屬性變化并應用對應主題樣式。

二、實現步驟詳解

具體步驟這里省略了搭建框架和項目中安裝tdesign組件,主要詳解明暗主題切換的具體代碼和邏輯。

1.組件搭建

一般的明暗切換為一個太陽和一個月亮圖標的切換,這里我們借用tdesign的icon和按鈕來搭建組件

<template><div class="mode-btn-container"><t-button @click="toggleMode" class="mode-btn"><template #icon><ModeDarkIcon v-if="isDarkMode" /><ModeLightIcon v-else /></template></t-button></div>
</template><script setup>
import { ref } from 'vue'
const isDarkMode = ref(false)
const toggleMode = () => {}
</script><style lang="less" scoped>
.mode-btn-container {.mode-btn {margin-right: 0.5vw;}
}
</style>

2.狀態持久化

使用?useStorage?組合式函數(通常來自?@vueuse/core?庫),創建響應式狀態?isDarkMode,值會持久化存儲在 localStorage,鍵名為?'theme-mode',這也是tdesign組件中的主題,默認值為?false(初始為淺色模式),當值變化時會自動同步到本地存儲,頁面刷新后仍可保持狀態

import { useStorage } from '@vueuse/core'
const isDarkMode = useStorage('theme-mode', false)

?3.模式切換邏輯

const toggleMode = () => {isDarkMode.value = !isDarkMode.value // 切換布爾值document.documentElement.setAttribute('theme-mode', isDarkMode.value ? 'dark' : 'light' // 更新HTML根元素屬性)emit('toggleMode', isDarkMode.value) // 觸發自定義事件
}

?4.組件掛載

初始化加載時同步主題狀態(比如從localStorage恢復的持久化狀),確保首次渲染時應用正確的主題樣式

onMounted(() => {document.documentElement.setAttribute('theme-mode', isDarkMode.value ? 'dark' : 'light')
})

5.事件監聽

監聽isDarkMode響應式變量的變化,當主題狀態變化時(通過切換操作),實時更新DOM屬性,

watch(isDarkMode, newVal => {document.documentElement.setAttribute('theme-mode', newVal ? 'dark' : 'light')
})

?6.配置與優化

寫完以上代碼之后其實我們發現還未達到想要的想要,想要更好的使用還需要最后一步,也就是在使用:root選擇器定義全局變量

//該代碼依據項目進行修改,僅供參考
:root[theme-mode="light"] {--color-background: #009994;--color-title-background: #71b2b1;--color-chart-background: rgba(255, 255, 255, 0.7);--color-title-text: #282727;--color-manage-background: #fff;--color-dialog-txt:#282727;--color-background-img: url('@/assets/images/page/net-frame.gif') no-repeat;--color-detail-txt:#282727;--color-background-net:#009994;--color-txt-net:#fff;--color-station-background:#f2fffe;--bg-date-picker: #fff;--td-bg-color-secondarycontainer:#f3f3f3;--ele-hover-bg-color:#afe2f6;--ele-bg-color:#fff;:root[theme-mode="dark"] {--color-background: #02455f;--color-title-background: #116e93;--color-chart-background: #7c8d8d31;--color-title-text: #fff;--color-manage-background: #0F1014;--color-dialog-txt:#282727;--color-background-img: url('@/assets/images/page/net-frame-dark.gif') no-repeat;--color-detail-txt:#fff;--color-background-net:#fff;--color-txt-net:#282727;--color-station-background:none;--bg-date-picker: #fff;--td-bg-color-secondarycontainer:#c0bebe;--ele-hover-bg-color:#51a0be;--ele-bg-color:#242424;}

7.使用

具體使用方法對顏色使用?var()?函數引用變量,具體如下,假設我想要對這個切換的按鈕實現明暗背景顏色的變化

 .mode-btn {background: var(--color-background);margin-right: 0.5vw;}

三、全部代碼

<template><div class="mode-btn-container"><t-button @click="toggleMode" class="mode-btn"><template #icon><ModeDarkIcon v-if="isDarkMode" /><ModeLightIcon v-else /></template></t-button></div>
</template><script setup>
import { ref } from 'vue'
import { useStorage } from '@vueuse/core'
// 主題狀態管理
const isDarkMode = useStorage('theme-mode', false)
const toggleMode = () => {isDarkMode.value = !isDarkMode.valuedocument.documentElement.setAttribute('theme-mode', isDarkMode.value ? 'dark' : 'light')emit('toggleMode', isDarkMode.value)
}
onMounted(() => {document.documentElement.setAttribute('theme-mode', isDarkMode.value ? 'dark' : 'light')
})
watch(isDarkMode, newVal => {document.documentElement.setAttribute('theme-mode', newVal ? 'dark' : 'light')
})
</script><style lang="less" scoped>
.mode-btn-container {.mode-btn {background: var(--color-background);margin-right: 0.5vw;}
}
</style>

全局css的文件,我這里是common.less

//該代碼依據項目進行修改,僅供參考
:root[theme-mode="light"] {--color-background: #009994;--color-title-background: #71b2b1;--color-chart-background: rgba(255, 255, 255, 0.7);--color-title-text: #282727;--color-manage-background: #fff;--color-dialog-txt:#282727;--color-background-img: url('@/assets/images/page/net-frame.gif') no-repeat;--color-detail-txt:#282727;--color-background-net:#009994;--color-txt-net:#fff;--color-station-background:#f2fffe;--bg-date-picker: #fff;--td-bg-color-secondarycontainer:#f3f3f3;--ele-hover-bg-color:#afe2f6;--ele-bg-color:#fff;:root[theme-mode="dark"] {--color-background: #02455f;--color-title-background: #116e93;--color-chart-background: #7c8d8d31;--color-title-text: #fff;--color-manage-background: #0F1014;--color-dialog-txt:#282727;--color-background-img: url('@/assets/images/page/net-frame-dark.gif') no-repeat;--color-detail-txt:#fff;--color-background-net:#fff;--color-txt-net:#282727;--color-station-background:none;--bg-date-picker: #fff;--td-bg-color-secondarycontainer:#c0bebe;--ele-hover-bg-color:#51a0be;--ele-bg-color:#242424;}

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

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

相關文章

goland 的 dug 設置

brew install delve # 或通過go install go install github.com/go-delve/delve/cmd/dlvlatestwhere dlvdlv.path/your/path/to/dlv環境變量 DEPLOY_MODEprivate;EGO_DEBUGtrue;EGO_MODEdev;MO_MODEdev;PD_MODEco;PRODUCT_MODEall

CVE-2020-1938源碼分析與漏洞復現(Tomcat 文件包含/讀取)

漏洞概述 漏洞名稱&#xff1a;Tomcat AJP協議文件包含/讀取漏洞&#xff08;Ghostcat&#xff09; CVE 編號&#xff1a;CVE-2020-1938 CVSS 評分&#xff1a;9.8 影響版本&#xff1a; Apache Tomcat 6.x (≤ 6.0.53)Apache Tomcat 7.x (≤ 7.0.99)Apache Tomcat 8.x (≤ 8…

基于51單片機的簡易打鈴系統

目錄 具體實現功能 設計介紹 資料內容 全部內容 資料獲取 具體實現功能 具體功能&#xff1a; &#xff08;1&#xff09;實時顯示當前時間&#xff08;時、分、秒&#xff09;&#xff0c;LED模式指示燈亮&#xff1b;4個按鍵可以調整時間的時和分。 &#xff08;2&…

vue+cesium示例:3D熱力圖(附源碼下載)

接到一位知識星友的邀請&#xff0c;隨機模擬三維數據點&#xff0c;結合heatmap.js實現基于cesiumvue的3D熱力圖需求&#xff0c;適合學習Cesium與前端框架結合開發3D可視化項目。 demo源碼運行環境以及配置 運行環境&#xff1a;依賴Node安裝環境&#xff0c;demo本地Node版本…

批處理實現:自動抓取perfetto日志 自動導出到當前文件夾 自動打開分析頁面

序言 最近在研究性能問題需要抓取trace文件。于是寫了個腳本 使用 雙擊運行批處理文件&#xff0c;可以開始記錄trace。而且以當前文件夾下面的。config.pbtx 作為配置文件。 &#xff08;pbtx就是一個json文件。配置了需要抓取那些參數&#xff0c;可以通過https://ui.per…

未來機器人的大腦:如何用神經網絡模擬器實現更智能的決策?

編輯&#xff1a;陳萍萍的公主一點人工一點智能 未來機器人的大腦&#xff1a;如何用神經網絡模擬器實現更智能的決策&#xff1f;RWM通過雙自回歸機制有效解決了復合誤差、部分可觀測性和隨機動力學等關鍵挑戰&#xff0c;在不依賴領域特定歸納偏見的條件下實現了卓越的預測準…

??Promise代碼理解

1.事件循環與 Promise 執行順序 案例 1&#xff1a;基礎 Promise 同步異步區分 console.log(1); new Promise(resolve > {console.log(2);resolve();console.log(3); }).then(() > console.log(4)); console.log(5); 輸出順序&#xff1a;1&#xff0c;2&#xff0c;3…

57、原生組件注入-【源碼分析】DispatcherServlet注入原理

57、原生組件注入DispatcherServlet注入原理 #### 繼承關系 - DispatcherServlet繼承自FrameworkServlet&#xff0c;而FrameworkServlet繼承自HttpServletBean&#xff0c;最終HttpServletBean繼承自HttpServlet。 - DispatcherServlet實現了ApplicationContextAware接口。 …

【動手學深度學習】3.5. 圖像分類數據集

目錄 3.5. 圖像分類數據集1&#xff09;讀取數據集2&#xff09;讀取小批量3&#xff09;整合所有組件4&#xff09;小結 . 3.5. 圖像分類數據集 我們將使用Fashion-MNIST數據集&#xff0c;作為圖像分類數據集。 %matplotlib inline import torch import torchvision from …

Python的格式化輸入輸出

# Python 的格式化輸出和格式化輸入## 格式化輸出Python 提供了多種字符串格式化的方法&#xff1a;### 1. % 格式化&#xff08;舊式格式化&#xff09;python name "Alice" age 25 print("Name: %s, Age: %d" % (name, age)) # 輸出: Name: Alice, Age…

day65—回溯—單詞搜索(LeetCode-79)

題目描述 給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格是那些水平相…

iOS安全和逆向系列教程 第19篇:ARM64匯編語言基礎與逆向分析

引言 在成功掌握iOS應用脫殼技術后,我們獲得了可以進行靜態分析的二進制文件。然而,要真正理解iOS應用的底層邏輯,我們必須深入到匯編語言層面。ARM64(也稱為AArch64)是蘋果在iPhone 5s及以后設備中使用的指令集架構。本篇文章將深入探討ARM64匯編語言的基礎知識,并結合…

使用Gitlab CI/CD結合docker容器實現自動化部署

Gitlab CI/CD基本介紹 核心概念 持續集成&#xff08;CI&#xff09;&#xff1a;每次代碼提交后自動觸發構建、測試和代碼檢查&#xff0c;確保代碼質量 持續交付/部署&#xff08;CD&#xff09;&#xff1a;在 CI 基礎上自動將代碼部署到測試或生產環境&#xff0c;支持人工…

初學者運行Pycharm程序可能會出現的問題,及解決辦法

文章目錄 前言一、ModuleNotFoundError: No module named sklearn二、ImportError: cannot import name show_config from numpy (unknown location)三、Pycharm報錯&#xff1a;“Original error was: DLL load failed: 找不到指定的模塊“ 的解決辦法四、ImportError: cannot…

Android開發中的Java與Kotlin:全面對比與深度解析

Android開發中的Java與Kotlin&#xff1a;全面對比與深度解析 在Android開發領域&#xff0c;Java和Kotlin是兩種主流編程語言。自Google在2017年宣布Kotlin為Android官方支持語言以來&#xff0c;Kotlin憑借其現代語法特性和與Java的無縫兼容性&#xff0c;逐漸成為開發者的新…

為應對激烈競爭環境,IBMS系統如何提升企業管理效率

IBMS智能管理系統&#xff1a;賦能企業高效運營&#xff0c;決勝競爭新時代 在瞬息萬變的商業環境中&#xff0c;效率就是競爭力&#xff01;企業如何快速響應市場變化、優化內部流程、降低成本并實現精準決策&#xff1f;IBMS智能管理系統以創新科技為引擎&#xff0c;為企業…

2.3 ASPICE的架構與設計

在ASPICE中&#xff0c;架構與設計是汽車軟件開發過程中非常重要的一環&#xff0c;它涉及到定義和設計軟件系統的整體結構、組件以及其相互關系。良好的架構與設計可以幫助團隊更好地理解和管理軟件系統&#xff0c;提高系統的可維護性、可擴展性和性能。以下是ASPICE中架構與…

生益PCB耐高溫PCB板材怎么樣?

在5G基站晝夜不停地吞吐數據時&#xff0c;在新能源汽車電池管理系統經受極寒酷暑考驗時&#xff0c;在航空航天器穿越大氣層承受2000℃熱浪沖擊時&#xff0c;一塊優質PCB板材的“抗熱基因”正在決定著整個系統的生死存亡。生益科技研發的耐高溫PCB板材&#xff0c;正是在這場…

Java Spring ApplicationEvent 概述

一、Spring 事件機制核心概念 1. 事件驅動架構模型 發布-訂閱模式&#xff1a;解耦事件生產者和消費者觀察者模式&#xff1a;監聽器監聽特定事件事件驅動優勢&#xff1a; 組件間松耦合系統擴展性好支持異步處理事件溯源支持 2. 核心組件 組件作用實現方式ApplicationEve…

Spring核心框架完全指南 - 基礎知識全解析

?? 目錄 ?? Spring框架簡介 ??? IoC容器詳解 ?? 依賴注入(DI)深入理解 ?? Bean配置與管理 ?? Bean的作用域 ?? Bean生命周期 ?? 面向切面編程(AOP) ?? Spring注解詳解 ?? 資源管理 ?? 事件機制 ?? SpEL表達式語言 ?? 實戰案例 ?? 總…