最近公司做的项目得到一个网站换肤的需求,也就是切换主题。那么如何切换主题色呢?切换主题色其实就是切换 CSS,然而在项目中不仅只有 CSS 需要换肤,图标和图片也需要跟随主题进行切换。于是,写一篇文章来记录下 Vue 中实现换肤的过程,先看下效果吧。
本文主要分三部分:CSS 切换,图标切换和图片切换。
CSS切换
关于 CSS 颜色的切换,我通过搜索,参考了ElementUI 的方案,总的来说分为四步
在 static 目录下新建一个 theme.css 文件,将需要替换的 CSS 声明在此文件中
.side-bar { background: linear-gradient(#B7A3FF, #879FFF) !important; } .side-bar .account-info { background: #8981D8 !important; }
声明所有可选的主题,每种颜色都对应于一个关键词,方便区分
colors: [{ themeId: 1, familyPrimary: '#B7A3FF', familySecondary: '#879FFF', sideBarTop: '#8981D8' }, { themeId: 2, familyPrimary: '#FDC5C5', familySecondary: '#F070A0', sideBarTop: '#E7829F' }, { themeId: 3, familyPrimary: '#414D6C', familySecondary: '#2D1E3C', sideBarTop: '#423C50' }]
通过 AJAX 获取 theme.css ,将颜色值替换为关键词。
getFile(`/static/theme.css`) .then(({data}) => { let style = getStyleTemplate(data) }) function getStyleTemplate (data) { const colorMap = { '#B7A3FF': 'familyPrimary', '#879FFF': 'familySecondary', '#8981D8': 'sideBarTop' } Object.keys(colorMap).forEach(key => { const value = colorMap[key] data = data.replace(new RegExp(key, 'ig'), value) }) return data }
把关键词再换回刚刚生成的相应的颜色值,并在页面上添加 style 标签
getFile(`/static/theme.css`) .then(({data}) => { let style = getStyleTemplate(data) writeNewStyle(style, this.color) }) function writeNewStyle (originalStyle, colors) { let oldEl = document.getElementById('temp-style') let cssText = originalStyle Object.keys(colors).forEach(key => { cssText = cssText.replace(new RegExp(key, 'ig'), colors[key]) }) const style = document.createElement('style') style.innerText = cssText style.id = 'temp-style' oldEl "htmlcode"><img src="/UploadFiles/2021-04-02/icon_edit.svg">这样就导致无法给 icon 动态切换颜色了,所以,我决定改为 font 文件的方式来使用图标。这里推荐一个网站 icomoon ,这个网站可以轻松地将图片转换成 font 文件。图标也非常适合通过 font 的方式来使用,我们可以更加方便的修改图标的大小和颜色。
通过在线转换,我们将下载下来的 font 文件放入项目中,并新建一个 CSS 文件来声明所有图标。
@font-face { font-family: 'icomoon'; src: url('../assets/fonts/icomoon.eot"icon-"], [class*=" icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ font-family: 'icomoon' !important; speak: none; font-style: normal; font-weight: normal; font-variant: normal; text-transform: none; line-height: 1; vertical-align: sub; /* Better Font Rendering =========== */ -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .icon-edit:before { content: "\e900"; }之后就能通过 CSS 类名的方式来引用图标了。
<span class="icon-edit"></span>为了使主题生效,我们也需要把图标的 CSS 写入 theme.css 文件中
.icon_edit:before { background-image: linear-gradient(-135deg, #879FFF 0%, #B7A3FF 100%); }图片切换
项目中还存在很多占位图或者其他图片会随着主题的变化而变化。通过引入所有图片,并用文件名来区分不同主题所对应的图片。在点击切换主题时,切换到主题所对应的文件,就能实现图片切换了。为此,我写了一个 mixin,并在组件中引入 mixin。
<img :src="/UploadFiles/2021-04-02/userImg || placeholderWoman">placeholderMixin
let callback const placeholderMixin = { data () { return { placeholderWoman: '', placeHolderNoReply: '', placeHolderNothing: '' } }, created () { let themeId = localStorage.getItem('themeId') let theme = themeId2Name(themeId) this.setThemeValue(theme) callback = (theme) => { this.setThemeValue(theme) } bus.$on('changeTheme', callback) }, destroyed () { bus.$off('changeTheme', callback) }, methods: { setThemeValue (theme) { this.placeholderWoman = require(`@/assets/placeholder_woman_${theme}.svg`) this.placeHolderNoReply = require(`@/assets/icon_noreply_${theme}.svg`) this.placeHolderNothing = require(`@/assets/icon_nothing_${theme}.svg`) } } }在点击切换主题时,会发射一个 changeTheme 事件,各组件接收到 changeTheme 事件,就会为图片重新赋值,也就达到了切换图片的效果。
let theme = themeId2Name(this.themeId) bus.$emit('changeTheme', theme)这样也就达到了切换主题的效果,但是这种方法需要在几乎所有业务组件中引入 mixin,如果有更好的方法,欢迎与我交流。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】