# 變換網站色彩主題 ## 功能 預設網站色彩主題或根據網站訪問者的選擇來變換網站色彩主題,並記億選擇,於下次訪問時訪問者不用再選擇。 ## code 內容 ⚠<font color="red">tip: 此函式只針對 <html> 這個標籤操作 className,不是操作 <html> 標籤勿用。</font> websiteColorTheme.init(defaultClassNames) -> 進入網站初始化用,使用預設或繼使用者的上次設定來變換。 websiteColorTheme.set(classNames) -> 變換時使用。 | fn()'s Name | 代入的變數 (type) | other | example | | ---------------------- | ------------------------- | ------------------ | --------------------------------------- | | websiteColorTheme.init | defaultClassNames (Array) | 初次進入要代入的預設值 | websiteColorTheme.init(['dark', 'red']) | | websiteColorTheme.set | classNames (Array) | 點選後要代入的設定值 | websiteColorTheme.set([])<br/> or <br/> const classNames = ['dark', 'red'] websiteColorTheme.set(classNames) | ``` jsx! // 網站主題色相關 const websiteColorTheme = { // 初始化主題顏色,localStorage 沒有就用預設 init: async (defaultClassNames) => { const html = document.querySelector('html') if(defaultClassNames){ html.classList.add(defaultClassNames) localStorage.setItem('websiteTheme',defaultClassNames) } }, // 設定主題顏色 set: (classNames) => { const html = document.querySelector('html') let websiteTheme = localStorage.getItem('websiteTheme') if(websiteTheme){ html.classList.remove(websiteTheme) } if(classNames){ html.classList.add(classNames) localStorage.setItem('websiteTheme',classNames) } }, } ``` ## 使用 ### ex: aai pc ``` jsx! // LayoutView.vue 部分 // 請根據情況改寫 <script setup> import { onMounted } from 'vue'; import common from "@/utils/common"; const { websiteColorTheme } = common(); onMounted(async () => { // 初始化色彩主題 // 變數為要加入 html tag 的 className 預設值; const defaultWebsiteColorTheme = ['light', 'blue'] websiteColorTheme.init(defaultWebsiteColorTheme) }); </script> ``` ``` jsx! // 可點擊更換顏色的.vue 部分 // 請根據情況改寫 <template> <!-- 月亮選擇 --> <div class="dropdown"> <div data-bs-toggle="dropdown"> <img v-if="circleMoon === 'light'" class="moon-icon" :src="getImage(DomainLayoutId + `/img/header/icon_header_moon_light_normal.svg`, siteSettingsInfo.managerCDNUrl)" alt=""> <img v-else class="moon-icon" :src="getImage(DomainLayoutId + `/img/header/icon_header_moon_dark_normal.svg`, siteSettingsInfo.managerCDNUrl)" alt=""> </div> <ul class="dropdown-menu"> <li @click="() => { circleMoon = 'light' }"> <img class="moon-icon" :src="getImage(DomainLayoutId + '/img/header/icon_header_moon_light_normal.svg', siteSettingsInfo.managerCDNUrl)" alt=""> </li> <li @click="() => { circleMoon = 'dark' }"> <img class="moon-icon" :src="getImage(DomainLayoutId + '/img/header/icon_header_moon_dark_normal.svg', siteSettingsInfo.managerCDNUrl)" alt=""> </li> </ul> </div> <!-- 顏色選擇 --> <div class="dropdown"> <div class="lang-option-circle colorful-circle" :class="[circleColor + '-circle']" data-bs-toggle="dropdown"></div> <ul class="dropdown-menu"> <li @click="() => { circleColor = 'blue' }"> <span class="lang-option-circle blue-circle"></span> </li> <li @click="() => { circleColor = 'red' }"> <span class="lang-option-circle red-circle"></span> </li> <li @click="() => { circleColor = 'yellow' }"> <span class="lang-option-circle yellow-circle"></span> </li> </ul> </div> </template> <script setup> // 引用 import common from "@/utils/common"; const { websiteColorTheme } = common(); // 變數 circleColor、circleMoon 取 localStorage 資料 const circleColor = ref(...JSON.parse(localStorage.getItem('websiteTheme')).classNames.filter(e => e !== 'dark' && e !== 'light')); const circleMoon = ref(JSON.parse(localStorage.getItem('websiteTheme')).classNames.includes('dark') ? 'dark' : 'light' ); const handleChangeTheme = (classNames) => { // 去除空值'' classNames = classNames.filter(e => e !== '') // 使用 websiteColorTheme.set(classNames) } // 監聽變化 watch(() => [circleMoon.value, circleColor.value], () => { handleChangeTheme([circleMoon.value, circleColor.value]) }) </script> ``` ### ex: aak pc ``` jsx! // LayoutView.vue 部分 // 請根據情況改寫 <script setup> import { onMounted } from 'vue'; import common from "@/utils/common"; const { websiteColorTheme } = common(); onMounted(async () => { // 初始化色彩主題 // 變數為要加入 html tag 的 className 預設值 const defaultWebsiteColorTheme = [] websiteColorTheme.init(defaultWebsiteColorTheme) }); </script> ``` ``` jsx! // 可點擊更換顏色的.vue 部分 // 請根據情況改寫 <template> <!-- 右側欄位--主內容 --> <div class="rightMenu-Wrap"> <!-- 版面顏色控制 --> <!-- NOTE:點選light模式時,html加上.lightMod,dark模式拿掉.lightMod --> <ol class="rightMenu-styleMode"> <li class="dark" @click="handleChangeTheme()"></li> <li class="light" @click="handleChangeTheme('lightMod')"></li> </ol> ... </template> <script setup> // 引用 import common from "@/utils/common"; const { websiteColorTheme } = common(); // 變換 color theme const handleChangeTheme = (className) => { websiteColorTheme.set(className ? [className] : []) } </script> ```