vue + less 實現動態主題換膚功能

文章目錄

  • 前言
  • 一、前提條件
    • 1. 初始化vue項目
    • 2. 安裝插件
  • 二、新建文件夾主題theme
    • 1.style.less文件
    • 2.model.js文件
    • 3.theme.js文件
    • theme文件夾最終效果
  • 三、修改vue.config.js文件
  • 四、頁面上的具體使用
    • 1. index.vue 頁面
    • 2. index.vue 頁面注意點說明
    • 3. index.vue 效果
  • 五、在js中使用定義的顏色變量
    • 1. 代碼
    • 2. 代碼說明
    • 3. 打印themsColor
  • 六、關于定義顏色的變量不是十六進制的原因


前言

在vue項目中(我的是2.6.11版本的)使用less做到切換主題膚色。話不多說,直接開始。

一、前提條件

1. 初始化vue項目

我這里的項目是2.6.11版本的

"vue": "^2.6.11",

2. 安裝插件

安裝一些less的插件

npm install less --save // less插件
npm install less-loader@5.0.0 --save // less-loader作用就是將less代碼轉譯為瀏覽器可以識別的CSS代碼。
npm install style-resources-loader -D // 在樣式引入時,對于變量的引入,需要在每個文件里都要引入一遍,為了避免每次使用時都需要單獨引入一遍的問題,采用了 style-resources-loader

二、新建文件夾主題theme

路徑: src > assets > style > theme
翻譯:theme 的中文就是主題
注意點:考慮到切換樣式也是樣式中的,所以放在style里面,當然,你可以放在任意位置,只要你后面的路徑同一改了就好。

1.style.less文件

// 默認的主題顏色(白低黑字)
@baseColor: var(--baseColor, rgba(25,121,255));
@pageBgColor: var(--pageBgColor, rgba(255,255,255));
@scrollBgColor: var(--scrollBgColor, rgba(0, 0, 0));
@resultBgColor: var(--resultBgColor, rgba(255,192,203));
@resultBorderColor: var(--resultBorderColor, rgba(255,255,0));
@resultTextColor: var(--resultTextColor, rgba(0,0,0, 0.9));// 導出變量 (如果在 src/assets/style/theme/model文件中配置了,就直接導出里面的字體使用)
:export {name: "less";baseColor: @baseColor;pageBgColor: @pageBgColor;scrollBgColor: @scrollBgColor;resultBgColor: @resultBgColor;resultBorderColor: @resultBorderColor;resultTextColor: @resultTextColor;
}

2.model.js文件

// 一套默認主題以及一套暗黑主題
export const themes = {default: {baseColor: `${25}, ${121},${255}`, // 基色(無變化) pageBgColor: `${255}, ${255},${255}`, // 頁面的背景色scrollBgColor: `${0}, ${0},${0}`, // 滾動條的背景色resultBgColor: `${255}, ${192},${203}`, // 結果背景色resultBorderColor: `${255}, ${255},${0}`, // 結果區背景色resultTextColor: `${0}, ${0},${0}, 0.9`, // 結果文字},dark: {baseColor: `${25}, ${121},${255}`, // 基色(無變化) pageBgColor: `${0}, ${0},${0}`, // 頁面的背景色scrollBgColor: `${255}, ${255},${255}`, // 滾動條的背景色resultBgColor: `${135}, ${206},${235}`, // 結果背景色resultBorderColor: `${0}, ${128},${0}`, // 結果區背景色resultTextColor: `${255}, ${255},${255}, 0.9`, // 結果文字},
};

3.theme.js文件

import { themes } from "./model";
// 修改頁面中的樣式變量值
const changeStyle = (obj) => {for (let key in obj) {document.getElementsByTagName("body")[0].style.setProperty(`--${key}`, obj[key]);}
};
// 改變主題的方法
export const setTheme = (themeName) => {localStorage.setItem("theme", themeName); // 保存主題到本地,下次進入使用該主題const themeConfig = themes[themeName] ? themes[themeName] : themes['default'];changeStyle(themeConfig);
};

theme文件夾最終效果

在這里插入圖片描述

三、修改vue.config.js文件

const path = require('path');
module.exports = {pluginOptions: {"style-resources-loader": {preProcessor: "less",patterns: [// 這個是加上自己的路徑,不能使用(如下:alias)中配置的別名路徑path.resolve(__dirname, "./src/assets/style/theme/style.less"),],},},
};

注意: 修改vue.config.js文件 記得重新啟動項目。

四、頁面上的具體使用

1. index.vue 頁面

<template><div class="index"><button class="btn" @click="themeDefault">默認</button><button class="btn" @click="themeDark">暗黑</button><div class="content">這是一個可以切換主題的盒子</div>  </div>  
</template><script>
import { setTheme } from "../assets/style/theme/theme"; // 引入切換主題方法
export default {data() {return {}},methods: {// 默認主題方案(白底黑字)themeDefault() {document.documentElement.removeAttribute('theme-mode'); // 重置為淺色模式this.themeChange = true;setTheme("default"); // 初始化未默認主題},// 暗黑主題(黑底白字)themeDark() {document.documentElement.setAttribute('theme-mode', 'dark'); // 重置為深色模式this.themeChange = false;setTheme("dark");},},mounted: function() {this.themeDefault(); // 進入頁面默認渲染默認主題方案}
}
</script><style lang="less" scoped>
@import '../assets/style/theme/style.less'; // 引入主題樣式文件.index{width: 100%;height: 100%;.btn {width: 50px;height: 30px;background-color: green;}.content {width: 100px;height: 100px;color: rgba(@resultTextColor, 1);background-color: rgba(@resultBgColor, 1);border: 10px solid  rgba(@resultBorderColor, 1);}
}
</style>

2. index.vue 頁面注意點說明

在這里插入圖片描述

3. index.vue 效果

(1)默認效果
在這里插入圖片描述
(2)暗黑效果
在這里插入圖片描述

其他校驗修改主題成功的方法
在審查元素的body上有你所定義的數據就是了
在這里插入圖片描述

五、在js中使用定義的顏色變量

1. 代碼

import themsColor from '../assets/style/theme/style.less'; // 引入主題樣式文件
export default {data() {return {themsColor,}},mounted: function() {console.log('themsColor', themsColor);}
}

2. 代碼說明

在這里插入圖片描述

3. 打印themsColor

在這里插入圖片描述

六、關于定義顏色的變量不是十六進制的原因

如果你在modes.js中使用 #ffffff #333333 類似這樣的顏色,其實也是可以的,而且在頁面中可以直接使用 color: @resultTextColor,看過去似乎簡單了很多,那為什么要改用rgb的方式呢?
相信有仔細注意代碼的人可能注意到了這個顏色的值${255}, ${255},${255}, 0.9, 是的,透明度。
如果直接寫死的十六進制的話,沒有可以操作的空間。包括我實際項目最開始用的也是十六進制,后面才改成的rgb的方式。不僅僅是文字,包括顏色中也會有禁用等需要直接修改透明度的方法,不用因此再添加一個類似的變量考慮才使用的rgba的方法。當然,這也僅僅是一種思路。如果你有更好的方法可以忽略。
注意點:有透明度的就和顏色一樣,加在后面就好了,沒有透明度的話,就在后面加上1,不然可能沒效果

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

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

相關文章

VSCode使用SSH無密碼連接Ubuntu

VSCode使用SSH無密碼連接Ubuntu 前提條件&#xff1a; 1. 能夠正常使用vscode的Remote-ssh連接Ubuntu 2. Ubuntu配置靜態ip&#xff08;否則經常需要修改Remote-ssh的配置文件里的IP&#xff09; 鏈接-> ubuntun 18.04設為靜態ip&#xff08;.net模式&#xff0c;可連接…

shell使用總結

一、語法 數據類型 字符串 如果沒有特殊說明&#xff0c;數據類型默認都是字符串。常見字符串操作有&#xff1a; 已知變量strabcabc 1、切片 echo ${str:1:3} #${varName:offset:size},分頁取子串 echo ${str:2} #${varName:offset},偏移offset個字符取至末端 echo …

加載AB包程序集,反射獲取并實例化類調用方法

加載AB包文件&#xff0c;加載bytes程序集資源&#xff0c;通過反射獲取類&#xff0c;實例化添加組件&#xff0c;調用方法 public class LoadAB : MonoBehaviour {private void Update(){if (Input.GetKeyDown(KeyCode.H)){Load();}}void Load(){string classname "ID…

如何解決docker中出現的“bash: vim: command not found”

目錄 問題描述&#xff1a; 問題解決&#xff1a; 問題描述&#xff1a; 在docker中&#xff0c;想要執行vim編輯文件&#xff0c;彈出“docker bash: vim: command not found“&#xff08;如下圖&#xff09;&#xff0c;請問該如何解決&#xff1f; 問題解決&#xff1a; …

FPGA應用學習筆記------系統復位一(同異復位)

要滿足復位恢復時間才能正常復位&#xff0c;不然會產生輸出準穩態&#xff0c;輸出邏輯錯誤 復位恢復時間只會存在復位釋放時刻&#xff0c;不會出現在確立時刻&#xff0c;則不推薦完全異步復位 完全同步復位&#xff0c;肯定是同步于時鐘滴&#xff0c;并將總是滿足時鐘條件…

研發工程師玩轉Kubernetes——就緒探針(Readiness Probe)和服務(Service)

在《研發工程師玩轉Kubernetes——啟動、存活和就緒探針》中&#xff0c;我們講了就緒探針和服務之間的特殊關系。就緒探針檢測失敗并不代表整個程序處于“非存活”狀態&#xff0c;可能只是短暫臨時的不可以提供服務&#xff0c;比如CPU階段性占滿&#xff0c;導致就緒探針檢測…

【Spring MVC】Spring MVC基于注解的程序開發

目錄 一、什么是Spring MVC 二、Spring MVC項目的創建和使用 1、實現客戶端和服務器端之間的連接 1.1、RequsestMapping注解 1.2、RequestMapper的簡單使用 1.3、使用GetMapping和POSTMapping注解來實現HTTP連接 三、獲取參數 1、實現獲取單個參數 2、實現獲取對象 3…

解決ubantu驅動掉了的問題

這里寫自定義目錄標題 解決ubuntu驅動掉了的問題 解決ubuntu驅動掉了的問題 首先確定是否有驅動&#xff1a; ls /usr/src | grep nvidia若有&#xff0c;則大概率是驅動版本與內核版本對應不上&#xff0c;則把內核版本切換為初始版本即可。參照&#xff1a;https://blog.cs…

書寫自動智慧:探索Python文本分類器的開發與應用:支持二分類、多分類、多標簽分類、多層級分類和Kmeans聚類

書寫自動智慧&#xff1a;探索Python文本分類器的開發與應用&#xff1a;支持二分類、多分類、多標簽分類、多層級分類和Kmeans聚類 文本分類器&#xff0c;提供多種文本分類和聚類算法&#xff0c;支持句子和文檔級的文本分類任務&#xff0c;支持二分類、多分類、多標簽分類…

nodejs+vue+elementui+express智慧社區小區物業管理系統的設計與實現_2p760

開發語言 node.js 框架&#xff1a;Express 前端:Vue.js 數據庫&#xff1a;mysql 數據庫工具&#xff1a;Navicat 開發軟件&#xff1a;VScode 前端nodejsvueelementuiexpress vue的文件結構其實就是一個index.html 中間的內容&#xff0c;用的是vue&#xff0c;但最終都會轉…

OpenCV圖像處理——形態學操作

目錄 連通性形態學操作腐蝕和膨脹開閉運算禮帽和黑帽 連通性 形態學操作 形態學轉換是基于圖像形狀的一些簡單操作。它通常在二進制圖像上執行。腐蝕和膨脹時兩個基本的形態學運算符。然后它的變體形式如開運算&#xff0c;閉運算&#xff0c;禮帽黑帽等 腐蝕和膨脹 cv.erode…

費曼學習法

費曼學習法 費曼學習法&#xff08;Feynman Technique&#xff09;是一種學習和理解復雜概念的方法&#xff0c;以理查德費曼&#xff08;Richard Feynman&#xff09;這位著名的理論物理學家命名。該方法的核心思想是通過將學習內容簡化并用自己的話解釋給別人&#xff0c;來…

Node.js學習筆記-04

這第九章也是個大重點 九、玩轉進程 Node在選型時決定在V8引擎之上構建&#xff0c;也就意味著它的模型與瀏覽器類似。 本章關于進程的介紹和討論將會解決如下兩個問題&#xff1a; 單進程單線程并非完美&#xff0c;如今CPU基本均是多核的&#xff0c;真正的服務器&#xf…

背上小書包準備面試之TypeScript篇

目錄 typescript是啥&#xff1f;與javascript的區別&#xff1f; typescript數據類型&#xff1f; typescript中枚舉類型&#xff1f;應用場景&#xff1f; typescript中接口的理解&#xff1f;應用場景&#xff1f; typescript中泛型的理解&#xff1f;應用場景&#xf…

輕薄的ESL電子標簽有哪些特性?

在智慧物聯逐漸走進千萬家的當下&#xff0c;技術變革更加日新月異。ESL電子標簽作為科技物聯的重要組成部分&#xff0c;是推動千行百業數字化轉型的重要技術&#xff0c;促進物聯網產業的蓬勃發展。在智慧零售、智慧辦公、智慧倉儲等領域&#xff0c;ESL電子標簽在未來是不可…

win11右下角圖標(網絡,音量,電量)點擊無反應問題,兩分鐘解決!

win11系統用的好好的&#xff0c;突然有一天任務欄右下角的常用三件套&#xff08;網絡&#xff0c;音量&#xff0c;電量&#xff09;左鍵單擊沒反應&#xff0c;無法方便的調節音量和連接wifi&#xff0c;如下圖所示&#xff0c;但是右鍵好用&#xff0c;不過不方便。網上查了…

嵌入式 C 語言程序數據基本存儲結構

一、5大內存分區 內存分成5個區&#xff0c;它們分別是堆、棧、自由存儲區、全局/靜態存儲區和常量存儲區。 1、棧區(stack)&#xff1a;FIFO就是那些由編譯器在需要的時候分配&#xff0c;在不需要的時候自動清除的變量的存儲區。里面的變量通常是局部變量、函數參數等。 ?…

【Windows API】獲取卷標、卷名

1、卷->卷標 使用FindFirstVolume()和FindNextVolume()函數體系&#xff0c;枚舉系統所有卷&#xff08;Volume&#xff09;的例子&#xff0c;然后獲取卷標、卷類型。這個方式可以枚舉出沒有驅動器號&#xff08;卷標&#xff09;的卷。 int TestMode1() {HANDLE hVolume…

Failed to connect to bitbucket.org port 443

瀏覽器可以訪問bitbucket&#xff0c;但是在終端或者sourcetree上死活無法進行pull, push等操作。 Root Cause&#xff1a;“【翻】【墻】軟件”使用了http proxy&#xff0c;所以也得為git設置相同的http proxy。 所以&#xff0c;解決方法是&#xff1a; 1&#xff0c;查看“…

網絡系統架構演變

1.系統架構演變 隨著互聯網的發展&#xff0c;網站應用的規模不斷擴大。需求的激增&#xff0c;帶來的是技術上的壓力。系統架構也因此不斷的演進、升級、迭代。從單一應用&#xff0c;到垂直拆分&#xff0c;到分布式服務&#xff0c;到SOA&#xff0c;以及現在火熱的微服務架…