vue實(shí)現(xiàn)換膚功能
公司項(xiàng)目要實(shí)現(xiàn)vue項(xiàng)目換膚功能,要求,考慮到最節(jié)省時(shí)間的就是寫兩套css,一套light.css,一套dark.css,然后切換css
一、實(shí)現(xiàn)思路
切換選中的皮膚狀態(tài)(light,或者dark)存儲(chǔ)在sessionStorage中,監(jiān)聽sessionStorage數(shù)據(jù)變化,切換index.html中引入的css文件
二、實(shí)現(xiàn)過程
1、在main.vue添加:
?<p style="display: inline-block;"> 切換主題:</p> ? <RadioGroup v-model="theme" @on-change="changeTheme"> ? ? ? ? <Radio label="light"></Radio> ? ? ? ? <Radio label="dark"></Radio> ? ? </RadioGroup> ? ?? ?//methods: ? ?changeTheme(){ ?//localStorage.setItem('themeColor',this.theme);? ?this.resetSetItem('themeColor', this.theme); ? ?},
2、main.js添加:(參考網(wǎng)上)
Vue.prototype.resetSetItem = function (key, newVal) { ? if (key === 'themeColor') { ? ? ? // 創(chuàng)建一個(gè)StorageEvent事件 ? ? ? var newStorageEvent = document.createEvent('StorageEvent'); ? ? ? const storage = { ? ? ? ? ? setItem: function (k, val) { ? ? ? ? ? ? ? sessionStorage.setItem(k, val); ? ? ? ? ? ? ? // 初始化創(chuàng)建的事件 ? ? ? ? ? ? ? newStorageEvent.initStorageEvent('setItem', false, false, k, null, val, null, null); ? ? ? ? ? ? ? // 派發(fā)對象 ? ? ? ? ? ? ? window.dispatchEvent(newStorageEvent) ? ? ? ? ? } ? ? ? } ? ? ? return storage.setItem(key, newVal); ? } }
3.index.html 添加
<!DOCTYPE html> <html> <head> ? <meta charset="utf-8"> ? <meta name="viewport" content="width=device-width,initial-scale=1.0"> ? //添加默認(rèn)css ? <link rel="stylesheet" href="./static/css/dark.css"> ? <title>xxx</title> </head> <body> ? <div id="app"></div> </body> </html> <script> //在js添加默認(rèn)引入的dark.css,如果不引入,ivew自帶的樣式會(huì)覆蓋在html中引入的dark.css,所以需要在js重新引入,用來覆蓋ivew的默認(rèn)樣式 ? var link = document.createElement("link"); ? link.rel = "stylesheet"; ? link.type = "text/css"; ? link.href = "./static/css/dark.css"; ? var head = document.getElementsByTagName("head")[0]; ? head.appendChild(link); ? //監(jiān)聽sessionStorage切換主題 ? window.addEventListener('setItem', () => { ? ? var themeColor = sessionStorage.getItem('themeColor'); ? ? let url = "./static/css/" + themeColor + ".css" ? ? changeStyles(url); ? }) ? function changeStyles(url) { ? ? var links = document.getElementsByTagName("link") ? ? console.log(links) ? ? //替換之前引入的css ? ? if (links.length != 0) { ? ? ? for (var i = 0; i < links.length; i++) { ? ? ? ? // links[i].parentNode.removeChild(links[i]); ? ? ? ? links[i].href = url ? ? ? } ? ? } ? ? var links = document.getElementsByTagName("link") ? ? //console.log(links) ? } </script>
4、效果
三、總結(jié)
1、在實(shí)現(xiàn)的過程中,發(fā)現(xiàn)localStorage數(shù)據(jù)監(jiān)聽不到,在網(wǎng)上的看到數(shù)據(jù)存儲(chǔ)在sessionStorage中
2、css執(zhí)行順序需要注意:頁面先渲染index.html中head標(biāo)簽引入的dark.css,main.js引入的iview.css后渲染,因此會(huì)覆蓋head標(biāo)簽引入的dark.css,所以需要在js標(biāo)簽中重新引入一遍。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 基于vue的換膚功能的示例代碼
- Vue + Scss 動(dòng)態(tài)切換主題顏色實(shí)現(xiàn)換膚的示例代碼
- Vue項(xiàng)目實(shí)現(xiàn)換膚功能的一種方案分析
- vue+iview+less 實(shí)現(xiàn)換膚功能
- 使用vue + less 實(shí)現(xiàn)簡單換膚功能的示例
- Vue中使用sass實(shí)現(xiàn)換膚功能
- Vue 換膚的示例實(shí)踐
- 基于Vue結(jié)合ElementUI的換膚解決方案
- vue項(xiàng)目實(shí)現(xiàn)一鍵網(wǎng)站換膚效果實(shí)例(webpack-theme-color-replacer的使用)
相關(guān)文章
VUE 實(shí)現(xiàn)復(fù)制內(nèi)容到剪貼板的兩種方法
這篇文章主要介紹了VUE 實(shí)現(xiàn)復(fù)制內(nèi)容到剪貼板功能,本文通過兩種方法,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04vue項(xiàng)目實(shí)現(xiàn)搜索內(nèi)容變紅色顯示
這篇文章主要為大家介紹了vue項(xiàng)目實(shí)現(xiàn)搜索內(nèi)容變紅色顯示,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12vue3組件化開發(fā)常用API知識(shí)點(diǎn)總結(jié)
Vue是目前Web前端最流行的開發(fā)框架技術(shù),?下面這篇文章主要給大家介紹了關(guān)于vue3組件化開發(fā)常用API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06vue仿攜程輪播圖效果(滑動(dòng)輪播,下方高度自適應(yīng))
這篇文章主要介紹了vue仿攜程輪播圖效果(滑動(dòng)輪播,下方高度自適應(yīng)),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02基于vue組件實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了基于vue組件實(shí)現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11