vue3 主題模式 結合 element-plus的主題

vue3 主題模式 結合 element-plus的主題

 npm i element-plus --save-dev

在 Vue 3 中,實現主題模式主要有以下幾種方式

1.使用 CSS 變量(自定義屬性)
  • CSS 變量是一種在 CSS 中定義可重用值的方式。在主題模式中,可以將顏色、字體大小等樣式屬性設置為 CSS 變量。然后通過 JavaScript 或 Vue 的響應式特性來切換這些變量的值,從而實現主題的切換
var.css
:root {--login-bg-color: #293146;  --left-menu-max-width: 200px;--left-menu-min-width: 64px;--left-menu-bg-color: #001529;--left-menu-bg-light-color: #0f2438;--left-menu-bg-active-color: var(--el-color-primary);--left-menu-text-color: #bfcbd9;--left-menu-text-active-color: #fff;--left-menu-collapse-bg-active-color: var(--el-color-primary);--logo-height: 50px;--logo-title-text-color: #fff;--top-header-bg-color: '#fff';--top-header-text-color: 'inherit';--top-header-hover-color: #f6f6f6;--top-tool-height: var(--logo-height);  --top-tool-p-x: 0;--tags-view-height: 35px;--tab-menu-max-width: 80px;--tab-menu-min-width: 30px;--tab-menu-collapse-height: 36px;   }.dark {--app-content-bg-color: var(--el-bg-color);}html,body {-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;}*,:after,:before {margin: 0;padding: 0;box-sizing: border-box;}
index.scss
@use './var.css';
@use 'element-plus/theme-chalk/dark/css-vars.css';
2.在main 引入 index.scss
// 引入全局樣式
import '@/styles/index.scss'
3.在 Vue 組件中動態切換主題
<script setup lang="ts">
import { useAppStore } from '@/store/modules/app' //引入的狀態管理
import { ThemeSwitch } from '@/components/ThemeSwitch' // 引入的組件黑白切換const appStore =  useAppStore()
const textColor = computed(() => appStore.getTextColor)
appStore.initTheme() // Pinia 實現狀態管理 </script><template><!--element-plus ElConfigProvider 組件的的封裝--><ConfigGlobal><!-- <p style="color: var(--el-text-color-primary);">p標簽</p> --><p :style="{'color':textColor}"  >p標簽</p><ThemeSwitch></ThemeSwitch></ConfigGlobal></template><style scoped lang="scss">
$prefix-cls: #{$namespace}-app;.size {width: 100%;height: 100%;
}html,
body {@extend .size;padding: 0 !important;margin: 0;overflow: hidden;#app {@extend .size;}
}.#{$prefix-cls}-grey-mode {filter: grayscale(100%);
}</style>

注意:CSS 變量與樣式沖突解決

  • 如果你自定義的主題與 Element Plus 的默認樣式沖突,可以通過在你的主題 CSS 文件中明確覆蓋 Element Plus 的變量來解決。
  • 在 var.css 中,確保所有需要覆蓋的變量都被正確設置
  • element-plus 在vite.config.ts 配置自動導入

store/modules/app.ts

import { defineStore } from "pinia";
// import { store } from '../index'
// import { colorIsDark, hexToRGB, lighten, mix } from '@/utils/color'
import { setCssVar,humpToUnderline } from '@/utils'
import { useDark } from '@vueuse/core'  安裝 @vueuse/coreexport const useAppStore  = defineStore('app', {state: () => {return {isCollapse: false, // 菜單是否折疊isFullScreen: false, // 頁面是否全屏isDark:false, // 是否是暗黑模式textColor: '#303133',theme:{//文字的顏色// 主題色elColorPrimary: '#409eff',// 左側菜單邊框顏色leftMenuBorderColor: 'inherit',// 左側菜單背景顏色leftMenuBgColor: '#001529',// 左側菜單淺色背景顏色leftMenuBgLightColor: '#0f2438',// 左側菜單選中背景顏色leftMenuBgActiveColor: 'var(--el-color-primary)',// 左側菜單收起選中背景顏色leftMenuCollapseBgActiveColor: 'var(--el-color-primary)',// 左側菜單字體顏色leftMenuTextColor: '#bfcbd9',// 左側菜單選中字體顏色leftMenuTextActiveColor: '#fff',// logo字體顏色logoTitleTextColor: '#fff',// logo邊框顏色logoBorderColor: 'inherit',// 頭部背景顏色topHeaderBgColor: '#fff',// 頭部字體顏色topHeaderTextColor: 'inherit',// 頭部懸停顏色topHeaderHoverColor: '#f6f6f6',// 頭部邊框顏色topToolBorderColor: '#eee'}} },getters:{getIsDark(): boolean {return this.isDark},getTextColor(): string {return this.textColor}},actions: {setIsDark(isDark: boolean) {this.isDark = isDarkif (this.isDark) {//  setCssVar('--el-text-color-primary', 'red')document.documentElement.classList.add('dark')document.documentElement.classList.remove('light')} else {//   setCssVar('--el-text-color-primary', '#303133')document.documentElement.classList.add('light')document.documentElement.classList.remove('dark')}this.textColor = this.isDark? 'red' : '#303133'// wsCache.set(CACHE_KEY.IS_DARK, this.isDark)},  setCssVarTheme() {for (const key in this.theme) {setCssVar(`--${humpToUnderline(key)}`, this.theme[key])}// this.setPrimaryLight()},setPrimaryLight() {if (this.theme.elColorPrimary) {const elColorPrimary = this.theme.elColorPrimaryconst color = this.isDark ? '#000000' : '#ffffff'const lightList = [3, 5, 7, 8, 9]lightList.forEach((v) => {setCssVar(`--el-color-primary-light-${v}`, mix(color, elColorPrimary, v / 10))})setCssVar(`--el-color-primary-dark-2`, mix(color, elColorPrimary, 0.2))}},initTheme() {const isDark = useDark({valueDark: 'dark',valueLight: 'light'})isDark.value = this.getIsDark},},persist: true
})// export const useAppStoreWithOut = () => {
//    return useAppStore(store)
//  }
// 使用到的函數
export const setCssVar = (prop: string, val: any, dom = document.documentElement) => {dom.style.setProperty(prop, val)
}/*** @param str 需要轉下劃線的駝峰字符串* @returns 字符串下劃線*/
export const humpToUnderline = (str: string): string => {return str.replace(/([A-Z])/g, '-$1').toLowerCase()
}

themeSwitch.vue

<script lang="ts" setup>
import { useAppStore } from '@/store/modules/app'
import { useIcon } from '@/hooks/web/useIcon'
import { useDesign } from '@/hooks/web/useDesign'
defineOptions({ name: 'ThemeSwitch' })const { getPrefixCls } = useDesign()// const prefixCls = getPrefixCls('theme-switch')
const prePrefixCls = 'ad-theme-switch'
const Sun = useIcon({ icon: 'emojione-monotone:sun', color: '#fde047' })const CrescentMoon = useIcon({ icon: 'emojione-monotone:crescent-moon', color: '#fde047' })const appStore = useAppStore()// 初始化獲取是否是暗黑主題
// const isDark = ref(appStore.getIsDark)// 設置switch的背景顏色
const blackColor = 'var(--el-color-black)'// const themeChange = (val: boolean) => {
//   appStore.setIsDark(val)
// }
const isDark = computed({get() {return appStore.getIsDark},set(val: boolean) {appStore.setIsDark(val)}
})
</script><template><el-switchv-model="isDark":active-color="blackColor":active-icon="Sun":border-color="blackColor":class="prefixCls":inactive-color="blackColor":inactive-icon="CrescentMoon"inline-prompt/>
</template>
<style lang="scss" scoped>
:deep(.el-switch__core .el-switch__inner .is-icon) {overflow: visible;
}
</style>

初始化的主題 ConfigGlobal.vue

<script setup lang="ts">
import { ElConfigProvider } from 'element-plus'
import { useAppStore } from '@/store/modules/app'
import { useDesign } from '@/hooks/web/useDesign'const { variables } = useDesign() // 命名規則const appStore = useAppStore()// 初始化所有主題色
onMounted(() => {appStore.setCssVarTheme()
})</script><template><ElConfigProvider:namespace="variables.elNamespace":message="{ max: 1 }"><slot></slot></ElConfigProvider>
</template>

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

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

相關文章

科大訊飛Q1營收46.6億同比增長27.7%,扣非凈利同比增長48.3%

4月21日盤后&#xff0c;AI龍頭科大訊飛&#xff08;002230.SZ&#xff09;發布2024年報&#xff0c;公司全年實現營業收入233.43億元&#xff0c;同比增長18.79%&#xff0c;同期歸母凈利潤為5.6億元。 公司核心賽道業務保持快速增長&#xff0c;消費者、教育、汽車、醫療業務…

Day5-UFS總結

UFS 傳輸協議的本質&#xff1a;兩個收發器件&#xff0c;對需要傳輸的數據&#xff0c;一層一層的封裝和解析&#xff0c;利用封裝增加的額外信息&#xff0c;做一些數據處理&#xff0c;完成源地址到目標地址的數據傳輸功能。 應用協議的本質&#xff1a;基于某種傳輸協議之…

嵌入式工程師( C / C++ )筆試面試題匯總

注&#xff1a;本文為 “嵌入式工程師筆試面試題” 相關文章合輯。 未整理去重。 如有內容異常&#xff0c;請看原文。 嵌入式必會 C 語言筆試題匯總 Z 沉浮 嵌入式之旅 2021 年 01 月 19 日 00:00 用預處理指令 #define 聲明一個常數&#xff0c;用以表明 1 年中有多少秒&a…

29-JavaScript基礎語法(函數)

知識目標 理解函數的基本概念&#xff1b;掌握函數的定義和調用&#xff1b;理解函數參數和返回值及作用域&#xff1b;掌握函數高階用法。 1. 理解函數的基本概念 明確函數在 JavaScript 里是一段可重復使用的代碼塊&#xff0c;它能接收輸入參數&#xff0c;執行特定任務&…

AI答題pk機器人來襲

AI答題PK機器人是一種具備知識問答競賽功能的人工智能程序。以下為您詳細介紹&#xff1a; 一、實時對戰&#xff1a;能在答題排位PK升級賽中&#xff0c;與用戶進行1V1在線實時PK答題 。比如在一些知識競賽類APP中&#xff0c;用戶可匹配到AI機器人對手&#xff0c;在規定時…

PclSharp ——pcl的c#nuget包

簡介&#xff1a; NuGet Gallery | PclSharp 1.8.1.20180820-beta07 下載.NET Framework 4.5.2 Developer Pack&#xff1a; 下載 .NET Framework 4.5.2 Developer Pack Offline Installer 離線安裝nupkg&#xff1a; nupkg是visual studio 的NuGet Package的一個包文件 安…

【Unity筆記】Unity音視頻播放監聽器封裝筆記:VideoPlayer + AudioSource事件觸發與編輯器擴展

關鍵點 Unity VideoPlayer 播放結束事件Unity AudioSource 播放檢測 Unity音視頻播放監聽器封裝筆記&#xff1a;VideoPlayer AudioSource事件觸發與編輯器擴展 在 Unity 的多媒體開發中&#xff0c;我們經常需要監聽 VideoPlayer 或 AudioSource 的播放狀態&#xff0c;以便…

WPF常用技巧匯總

主要用于記錄工作中發現的一些問題和常見的解決方法。 此文會持續更新。 >abp new Evan.MyWpfApp -t wpf --old --framework .net8 1. 解決不同屏幕分辨率下的鋸齒問題 UseLayoutRounding"True" <Grid UseLayoutRounding"True"><Border Mar…

分數線降低,25西電馬克思主義學院(考研錄取情況)

1、馬克思主義學院各個方向 2、馬克思主義學院近三年復試分數線對比 學長、學姐分析 由表可看出&#xff1a; 1、馬克思主義理論25年相較于24年下降10分&#xff0c;為355分 3、25vs24推免/統招人數對比 學長、學姐分析 由表可看出&#xff1a; 1、 馬克思主義學院25年共接…

【Linux網絡】構建UDP服務器與字典翻譯系統

&#x1f4e2;博客主頁&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客倉庫&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01; &…

【項目管理】成本類計算 筆記

項目管理-相關文檔&#xff0c;希望互相學習&#xff0c;共同進步 風123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知識總覽 項目管理知識域 知識點&#xff1a; &#xff08;項目管理概論、立項管理、十大知識域、配置與變更管理、績效域&#xff09; 對應&…

div(HTML標準元素)和view(微信小程序專用組件)的主要區別體

div&#xff08;HTML標準元素&#xff09;和view&#xff08;微信小程序專用組件&#xff09;的主要區別體現在以下方面&#xff1a; 一、應用場景與開發框架 ?適用平臺不同? div是HTML/CSS開發中通用的塊級元素&#xff0c;用于Web頁面布局?&#xff1b;view是微信小程序專…

【C++軟件實戰問題排查經驗分享】UI界面卡頓 | CPU占用高 | GDI對象泄漏 | 線程堵塞 系列問題排查總結

目錄 1、UI界面卡頓問題排查 2、軟件CPU占用高問題排查 3、UI界面顯示異常&#xff08;GDI對象泄漏導致窗口繪制異常&#xff09;問題排查 4、軟件線程堵塞&#xff08;包含線程死鎖&#xff09;問題排查 5、最后 C軟件異常排查從入門到精通系列教程&#xff08;核心精品專…

管理雜談——采石磯大捷的傳奇與啟示

南宋抗金史上&#xff0c;岳飛與岳家軍的鐵血傳奇家喻戶曉&#xff0c;但另一位力挽狂瀾的“文官戰神”卻常被忽視——他從未掌兵&#xff0c;卻在南宋存亡之際整合潰軍&#xff0c;以少勝多&#xff0c;締造采石磯大捷。此人正是虞允文。一介書生何以扭轉乾坤&#xff1f;他的…

動態規劃-零錢兌換

332.零錢兌換 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額&#xff0c;返回 -1 。你可以認為每種硬幣的數量是無…

SpringAI+DeepSeek大模型應用開發——4 對話機器人

目錄??????? ??????????????項目初始化 pom文件 配置模型 ChatClient 同步調用 流式調用 日志功能 對接前端 解決跨域 會話記憶功能 ChatMemory 添加會話記憶功能 會話歷史 管理會話id 保存會話id 查詢會話歷史 完善會話記憶 定義可序列…

Java 關鍵字

本章列出了Java 語言的所有關鍵字和“類關鍵字的單詞”。 “受限關鍵字”是指&#xff0c;它們旨在模塊聲明中是關鍵字&#xff0c;在其他情況下則是標識符。 “受限標識符”是指&#xff0c;除非用在某些特定位置&#xff0c;否則他們只是標識符。例如&#xff0c;var一般都…

AI重塑網絡安全:機遇與威脅并存的“雙刃劍”時代

一、引言 人工智能&#xff08;AI&#xff09;技術的迅猛發展&#xff0c;正在深刻改變網絡安全行業的格局。從ChatGPT生成釣魚郵件到AI驅動的漏洞挖掘&#xff0c;從零信任架構的普及到安全大模型的實戰應用&#xff0c;AI既是攻擊者的“新武器”&#xff0c;也是防御者的“新…

網絡原理——UDP

1、 與TCP的關鍵區別 特性UDPTCP連接方式無連接面向連接可靠性不可靠可靠數據順序不保證順序保證順序傳輸速度更快相對較慢頭部開銷8字節20-60字節流量控制無有擁塞控制無有適用場景實時應用、廣播/多播可靠性要求高的應用 2、UDP 報文結構 報文結構大致可以分為首部和載荷&a…

STM32——新建工程并使用寄存器以及庫函數進行點燈

本文是根據江協科技提供的教學視頻所寫&#xff0c;旨在便于日后復習&#xff0c;同時供學習嵌入式的朋友們參考&#xff0c;文中涉及到的所有資料也均來源于江協科技&#xff08;資料下載&#xff09;。 新建工程并使用寄存器以及庫函數進行點燈操作 新建工程步驟1.建立工程2.…