赞
踩
不断学习demo中,有好的demo会记录下来(主要怕自己也会忘记不想去踩坑)大家可以关注一下
提示:项目中要用到主题色切换所以记录一下,看了很多博主的,借鉴(抄袭一下)某位博主不记得是哪位大佬的了,艾特不到他,望大佬看到后私信,必记录出处!感谢。
提示:不啰嗦,正文!
Tab Atkins在 CSS 中提出的颜色函数的解析器和转换器。
npm install -g css-color-function
// 版本的话我用的是 "css-color-function": "^1.3.3",
import color from 'css-color-function'
定义data数据
data() {
return {
originalStylesheetCount: -1, // 记录当前已引入style数量
originalStyle: '', // 获取拿到的.css的字符串
colors: {
// 颜色选择器默认颜色值,这个值要和element-variables一样
primary: '#409EFF',
},
cssUrl: [
'//unpkg.com/element-ui/lib/theme-chalk/index.css', //unpkg element 包
'./static/css/index.css',
],
}
},
colorChange(e) { if (!e) return localStorage.setItem('color', e) this.colors = { primary: color.convert('color(' + this.colors.primary + ')'), 'light-1': color.convert( 'color(' + this.colors.primary + ' tint(90%))' ), 'light-2': color.convert( 'color(' + this.colors.primary + ' tint(80%))' ), 'light-3': color.convert( 'color(' + this.colors.primary + ' tint(70%))' ), 'light-4': color.convert( 'color(' + this.colors.primary + ' tint(60%))' ), 'light-5': color.convert( 'color(' + this.colors.primary + ' tint(50%))' ), 'light-6': color.convert( 'color(' + this.colors.primary + ' tint(40%))' ), 'light-7': color.convert( 'color(' + this.colors.primary + ' tint(30%))' ), 'light-8': color.convert( 'color(' + this.colors.primary + ' tint(20%))' ), 'light-9': color.convert( 'color(' + this.colors.primary + ' tint(10%))' ), } this.writeNewStyle() }, writeNewStyle() { let cssText = this.originalStyle Object.keys(this.colors).forEach((key) => { cssText = cssText.replace( new RegExp('(:|\\s+)' + key, 'g'), '$1' + this.colors[key] ) }) if (this.originalStylesheetCount === document.styleSheets.length) { // 如果之前没有插入就插入 const style = document.createElement('style') style.innerText = cssText document.head.appendChild(style) } else { document.head.lastChild.innerText = cssText } }, getIndexStyle(url) { // eslint-disable-next-line @typescript-eslint/no-this-alias let that = this var request = new XMLHttpRequest() request.open('GET', url) request.onreadystatechange = function () { if ( request.readyState === 4 && (request.status === 200 || request.status === 304) ) { // 调用本地的如果拿不到会得到html,html是不行的 if ( request.response && !/DOCTYPE/gi.test(request.response) ) { that.originalStyle = that.getStyleTemplate( request.response ) that.writeNewStyle() } else { // 本地 that.originalStyle = '' } } else { that.originalStyle = '' } } request.send(null) }, getStyleTemplate(data) { const colorMap = { '#3a8ee6': 'shade-1', '#409eff': 'primary', '#53a8ff': 'light-1', '#66b1ff': 'light-2', '#79bbff': 'light-3', '#8cc5ff': 'light-4', '#a0cfff': 'light-5', '#b3d8ff': 'light-6', '#c6e2ff': 'light-7', '#d9ecff': 'light-8', '#ecf5ff': 'light-9', } Object.keys(colorMap).forEach((key) => { const value = colorMap[key] data = data.replace(new RegExp(key, 'ig'), value) }) return data },
mounted() { // 默认从线上官方拉取最新css,2秒钟后做一个检查没有拉到就从本地在拉下 // eslint-disable-next-line @typescript-eslint/no-this-alias let that = this // 如果是记住用户的状态就需要,在主题切换的时候记录颜色值,在下次打开的时候从新赋值 this.colors.primary = localStorage.getItem('color') || this.colors.primary this.getIndexStyle(this.cssUrl[0]) setTimeout(function () { if (that.originalStyle) { // } else { that.getIndexStyle(that.cssUrl[1]) } }, 2000) this.$nextTick(() => { // 获取页面一共引入了多少个style 文件 this.originalStylesheetCount = document.styleSheets.length }) },
<template>
<div>
<el-color-picker
@change="colorChange"
v-model="colors.primary"
></el-color-picker>
<el-button type="primary"> awdawdas</el-button>
</div>
</template>
<template> <div> <el-color-picker @change="colorChange" v-model="colors.primary" ></el-color-picker> <el-button type="primary"> awdawdas</el-button> </div> </template> <script> import color from 'css-color-function' // npm install -g css-color-function export default { name:'Lor', data() { return { originalStylesheetCount: -1, // 记录当前已引入style数量 originalStyle: '', // 获取拿到的.css的字符串 colors: { // 颜色选择器默认颜色值,这个值要和element-variables一样 primary: '#409EFF', }, cssUrl: [ '//unpkg.com/element-ui/lib/theme-chalk/index.css', //unpkg element 包 './static/css/index.css', ], } }, methods: { colorChange(e) { if (!e) return localStorage.setItem('color', e) this.colors = { primary: color.convert('color(' + this.colors.primary + ')'), 'light-1': color.convert( 'color(' + this.colors.primary + ' tint(90%))' ), 'light-2': color.convert( 'color(' + this.colors.primary + ' tint(80%))' ), 'light-3': color.convert( 'color(' + this.colors.primary + ' tint(70%))' ), 'light-4': color.convert( 'color(' + this.colors.primary + ' tint(60%))' ), 'light-5': color.convert( 'color(' + this.colors.primary + ' tint(50%))' ), 'light-6': color.convert( 'color(' + this.colors.primary + ' tint(40%))' ), 'light-7': color.convert( 'color(' + this.colors.primary + ' tint(30%))' ), 'light-8': color.convert( 'color(' + this.colors.primary + ' tint(20%))' ), 'light-9': color.convert( 'color(' + this.colors.primary + ' tint(10%))' ), } this.writeNewStyle() }, writeNewStyle() { let cssText = this.originalStyle Object.keys(this.colors).forEach((key) => { cssText = cssText.replace( new RegExp('(:|\\s+)' + key, 'g'), '$1' + this.colors[key] ) }) if (this.originalStylesheetCount === document.styleSheets.length) { // 如果之前没有插入就插入 const style = document.createElement('style') style.innerText = cssText document.head.appendChild(style) } else { document.head.lastChild.innerText = cssText } }, getIndexStyle(url) { // eslint-disable-next-line @typescript-eslint/no-this-alias let that = this var request = new XMLHttpRequest() request.open('GET', url) request.onreadystatechange = function () { if ( request.readyState === 4 && (request.status === 200 || request.status === 304) ) { // 调用本地的如果拿不到会得到html,html是不行的 if ( request.response && !/DOCTYPE/gi.test(request.response) ) { that.originalStyle = that.getStyleTemplate( request.response ) that.writeNewStyle() } else { // 本地 that.originalStyle = '' } } else { that.originalStyle = '' } } request.send(null) }, getStyleTemplate(data) { const colorMap = { '#3a8ee6': 'shade-1', '#409eff': 'primary', '#53a8ff': 'light-1', '#66b1ff': 'light-2', '#79bbff': 'light-3', '#8cc5ff': 'light-4', '#a0cfff': 'light-5', '#b3d8ff': 'light-6', '#c6e2ff': 'light-7', '#d9ecff': 'light-8', '#ecf5ff': 'light-9', } Object.keys(colorMap).forEach((key) => { const value = colorMap[key] data = data.replace(new RegExp(key, 'ig'), value) }) return data }, }, mounted() { // 默认从线上官方拉取最新css,2秒钟后做一个检查没有拉到就从本地在拉下 // eslint-disable-next-line @typescript-eslint/no-this-alias let that = this // 如果是记住用户的状态就需要,在主题切换的时候记录颜色值,在下次打开的时候从新赋值 this.colors.primary = localStorage.getItem('color') || this.colors.primary this.getIndexStyle(this.cssUrl[0]) setTimeout(function () { if (that.originalStyle) { // } else { that.getIndexStyle(that.cssUrl[1]) } }, 2000) this.$nextTick(() => { // 获取页面一共引入了多少个style 文件 this.originalStylesheetCount = document.styleSheets.length }) }, } </script>
不断学习demo中,有好的demo会记录下来(主要怕自己也会忘记不想去踩坑)大家可以关注一下
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。