vue項(xiàng)目實(shí)現(xiàn)一鍵網(wǎng)站換膚效果實(shí)例(webpack-theme-color-replacer的使用)
前言
現(xiàn)在看不少網(wǎng)站都有一鍵換膚的效果,這東西要說簡(jiǎn)單有簡(jiǎn)單的做法,要說復(fù)雜有復(fù)雜的做法,看到ant design pro 源碼使用了webpack-theme-color-replacer
插件,就了解一下,記錄下學(xué)習(xí)過程。
本文主要記錄
webpack-theme-color-replacer
插件的使用
CSS樣式覆蓋 - 最簡(jiǎn)單粗暴的力工做法
相信不少人都跟我曾經(jīng)的做法一樣,換膚還不簡(jiǎn)單,直接用css優(yōu)先級(jí)的原來,進(jìn)行css樣式覆蓋,簡(jiǎn)單粗暴一把梭,但是帶來的問題就是,樣式管理起來麻煩,不管是查找還是修改,都令人頭疼,而且如果需要多套皮膚,還需要提前生成多套css,造成文件越來越大。應(yīng)急或者力工優(yōu)先選擇。
LESS、SCSS變量覆蓋 - 學(xué)會(huì)使用工具的做法
現(xiàn)在的項(xiàng)目也都使用預(yù)編譯語言,所以變量也很常見了,使用變量也可以達(dá)到換膚的效果,也比css樣式覆蓋的做法,高級(jí)了很多,但是仔細(xì)一想,如果存在多套皮膚,最終的css文件還是會(huì)大大增加。這時(shí)我又想到了css的變量,請(qǐng)繼續(xù)看后面。
CSS變量 - 新款工具的做法
什么?你還不了解css變量?那就看看這篇文章吧。
這個(gè)做法和最開始提到的使用css樣式覆蓋還是有點(diǎn)區(qū)別的,這個(gè)是用了變量,使用js重新給變量賦值,即可達(dá)到換膚的效果,所以還是高級(jí)了不少,應(yīng)該也可以滿足大部分的需求了??墒亲屑?xì)一想,如果項(xiàng)目要求兼容各種古老瀏覽器,這個(gè)做法可能就不行了,至少現(xiàn)在還不是很好。
webpack-theme-color-replacer插件 - 令人驚嘆的做法
直到我在查看ant design pro 源碼的時(shí)候,發(fā)項(xiàng)目里使用了webpack-theme-color-replacer
插件,看到作者實(shí)現(xiàn)功能的思路,感覺是我想學(xué)習(xí)的做法。
基本思路就是,webpack構(gòu)建時(shí),在emit事件(準(zhǔn)備寫入dist結(jié)果文件時(shí))中,將即將生成的所有css文件的內(nèi)容中 帶有指定顏色的css規(guī)則單獨(dú)提取出來,再合并為一個(gè)theme-colors.css輸出文件。然后在切換主題色時(shí),下載這個(gè)文件,并替換為需要的顏色,應(yīng)用到頁面上。這樣,下載的樣式中就只包含顏色相關(guān)的css規(guī)則,文件較?。煌瑫r(shí)它已經(jīng)包含了項(xiàng)目中所有的css中的指定顏色樣式,一次下載全部顏色樣式都搞定。
下面就以vue項(xiàng)目詳細(xì)說說這個(gè)插件是怎么使用的。
準(zhǔn)備工作
本文僅記錄了vue項(xiàng)目中如何使用webpack-theme-color-replacer
,其它項(xiàng)目詳情請(qǐng)自行了解。但也希望本文涉及的插件使用對(duì)你有幫助
安裝插件
npm i -D webpack-theme-color-replacer
文中版本 "webpack-theme-color-replacer": "^1.3.3"
vue.config.js配置部分
const ThemeColorReplacer = require('webpack-theme-color-replacer') module.exports = { configureWebpack: config => { new ThemeColorReplacer({ // 需要提取到css文件的顏色數(shù)組(可以傳入多個(gè)顏色值),支持rgb和hsl,也就是換膚改變顏色的變量 matchColors: ['#9564ca'], //可選.輸出css文件名,支持[contenthash]和[hash] fileName: 'css/theme-colors-[contenthash:8].css', // 可選的。將 css 文本注入 js 文件,不再需要下載 `theme-colors-xxx.css`。 injectCss: true, }) }, }
模板內(nèi)修改顏色:
<template> <div> <div class="item item-0"></div> </div> </template> <script> // const client = require('webpack-theme-color-replacer/client') import client from "webpack-theme-color-replacer/client"; export default { data() { return { }; }, created() { // 這里就直接5秒后換色了,模擬了用戶點(diǎn)擊一次換膚的過程 setTimeout(() => { this.changeThemeColor('#69af23'); }, 5000); }, methods: { // 設(shè)置css新值,點(diǎn)擊換膚時(shí)候會(huì)獲取到新的顏色值,然后調(diào)用這個(gè)方法就行了 changeThemeColor(newColor) { // newColors必須是個(gè)數(shù)組形式,數(shù)組長度一定要和配置中的matchColors長度一致,否則缺少的顏色就會(huì)出現(xiàn)問題 // sass里的lighten貌似是使用hsl顏色增加亮度。 varyColor.js 里面的lighten、darke其實(shí)是將當(dāng)前顏色與白色進(jìn)行混合,與element-ui的色系一致。 client.changer.changeColor({ newColors: [''+newColor] }) } }, }; </script> <style lang="scss" scoped> // 基礎(chǔ)色 $color: #9564ca; .item{ height: 30px; margin-top: 4px; } .item-0 { background: $color; } </style>
配置中的注釋很重要!很重要!!很重要!?。≌?qǐng)仔細(xì)閱讀
總結(jié)
到此這篇關(guān)于vue項(xiàng)目實(shí)現(xiàn)一鍵網(wǎng)站換膚效果的文章就介紹到這了,更多相關(guān)vue項(xiàng)目一鍵網(wǎng)站換膚內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Vue實(shí)現(xiàn)網(wǎng)頁截圖和截屏功能
網(wǎng)頁截圖與截屏功能在許多Web應(yīng)用程序中都非常有用,Vue.js作為一個(gè)流行的JavaScript框架,提供了許多工具和庫來簡(jiǎn)化網(wǎng)頁截圖和截屏的實(shí)現(xiàn),本文將介紹如何使用Vue來實(shí)現(xiàn)一個(gè)網(wǎng)頁截圖和截屏功能的示例,包括使用html2canvas庫和vue-cropper庫,需要的朋友可以參考下2023-10-10深入淺析Vue不同場(chǎng)景下組件間的數(shù)據(jù)交流
探通過本篇文章給大家探討不同場(chǎng)景下組件間的數(shù)據(jù)“交流”的Vue實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2017-08-08iview中實(shí)現(xiàn)this.$Modal.confirm自定義彈出框換行加樣式
這篇文章主要介紹了iview中實(shí)現(xiàn)this.$Modal.confirm自定義彈出框換行加樣式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09vue2.0使用swiper組件實(shí)現(xiàn)輪播的示例代碼
下面小編就為大家分享一篇vue2.0使用swiper組件實(shí)現(xiàn)輪播的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03Vue?data中隨意改一個(gè)屬性,視圖都會(huì)更新嗎?
這篇文章主要討論Vue?data中隨意改一個(gè)屬性,視圖都會(huì)更新嗎?下面來自面試官的問題然后做i出的一個(gè)問題總結(jié),具有一定的參考價(jià)值,需要的小伙伴可以參考一下2021-12-12深入理解?Vue?3實(shí)現(xiàn)組件通信的方法
本文將介紹幾種常見的?Vue?3?組件通信方法,包括?props、emits、provide?和?inject、事件總線以及?Vuex?狀態(tài)管理,需要的朋友可以參考下2024-07-07vue實(shí)現(xiàn)密碼顯示與隱藏按鈕的自定義組件功能
本文通過兩種思路給大家介紹vue實(shí)現(xiàn)密碼顯示與隱藏按鈕的自定義組件功能,感興趣的朋友跟隨小編一起看看吧2019-04-04electron-vite新一代electron開發(fā)構(gòu)建工具
這篇文章主要介紹了electron-vite新一代electron開發(fā)構(gòu)建工具,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04