vue,elementUI切换主题,自定义主题

Easter79
• 阅读 1293

本文介绍两种elementUI切换主题色的方法

项目示例:http://test.ofoyou.com/theme/

git代码:记得star哦,谢谢

1:官方提供的方法,直接修改scss文件达到修改目的,开发人员使用(比官网容易理解,有图有真相)。

2:通过选颜色值在项目中达到换肤目的,用户使用。此方法根据官方主题切换修改而来

先搭建项目:

  npm install -g vue //全局安装vue

  npm install -g webpack //全局安装webpack

npm install -g vue-cli //全局安装vue-cli

---->

进入项目目录--->

vue-init webpack my-project (vue init webpack my-project 这个官方已不用,使用会报错)

vue,elementUI切换主题,自定义主题

   然后一次做下去就好了--->

  安装elementUI :npm i element-ui -S

  安装sass: npm install node-sass sass-loader --save-dev

  项目结构 -----------------运行结果

  vue,elementUI切换主题,自定义主题        vue,elementUI切换主题,自定义主题

1. 第一种方法,官方提供的方法,直接修改scss

在main.js引入elementUI,以及主题:(主题是可以自己设置下载配置的--官方工具

vue,elementUI切换主题,自定义主题

  然后在项目src->assets目录下创建element-variables.scss 内容可以从官网复制过来,  然后在main.js引入,见上图注释的代码

  vue,elementUI切换主题,自定义主题   结束第一种,可以随便写几个element组件试试下

2:通过选颜色值在项目中达到换肤目的,根据官方修改主题项目修改而来

说明:项目主题分为两部分,一个是element组件主题,一个是自己定义组件或者DOM主题。

此方法主要思路就是:用户先从线上拉去配置主题的css文件,当用户更改颜色后,在把css文件里面所有的颜色值

替换掉,然后把这个css文件重新插入到html中达到改变颜色。

在这里都需要修改再方法1的基础上进行扩展:在element-variables.scss添加 默认我们自己设置的颜色。

当然这个颜色也可以在其他公共css修改。

  1. vue,elementUI切换主题,自定义主题

  2. 安装两个插件:

    npm install css-color-function  

    npm install object-assign

   3. vue,elementUI切换主题,自定义主题

  4. 从 unpkg.com/element-ui/lib/theme-chalk/index.css 把最新css文件复制下来copy到项目静态文件目录中:

    因为:项目中是先从element官方拉取主题css,如果拉取不到再去本地找备用的。

    vue,elementUI切换主题,自定义主题

  5.接下来就是写代码了。在App.vue上引入自定义的修改主题组件,在随便弄些element组件观察变化:

    vue,elementUI切换主题,自定义主题

  5. 写组件:Theme.vue  

<!-- 切换主题色  -->
<template>
    <div>
        <el-color-picker  @change="colorChange" v-model="colors.primary" ></el-color-picker>
    </div>
</template>
<script>
import generateColors from "../../utils/color";
import objectAssign from "object-assign";
export default {
    name: "App",
    data() {
        return {
            originalStylesheetCount: -1,//记录当前已引入style数量
            originalStyle: "",//获取拿到的.css的字符串
            colors: {
                //颜色选择器默认颜色值,这个值要和element-variables一样
                primary: "#409EFF"
            },
            // primaryColor: "", //提交成功后设置默认颜色
            cssUrl: [
                "//unpkg.com/element-ui/lib/theme-chalk/index.css",
                "./static/css/index.css"
            ]
        };
    },
    methods: {
        colorChange(e) {
            if(!e)return;
            localStorage.setItem('color',e)
            this.primaryColor = this.colors.primary;
            this.colors = objectAssign(
                {},
                this.colors,
                generateColors(this.colors.primary)
            );
            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 =
                    ".primaryColor{background-color:" + this.colors.primary + "}" + cssText;
                document.head.appendChild(style);
            } else {
                // 如果之前没有插入就修改
                document.head.lastChild.innerText =
                    ".primaryColor{background-color:" +
                    this.colors.primary +
                    "} " +
                    cssText;
            }
        },
        getIndexStyle(url) {
            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秒钟后做一个检查没有拉到就从本地在拉下
        let that = this;
        // 如果是记住用户的状态就需要,在主题切换的时候记录颜色值,在下次打开的时候从新赋值
        this.colors.primary = localStorage.getItem('color')||this.colors.primary//例如
        this.getIndexStyle(this.cssUrl[0]);
        setTimeout(function() {
            if (that.originalStyle) {
                return;
            } else {
                that.getIndexStyle(that.cssUrl[1]);
            }
        }, 2000);
        this.$nextTick(() => {
            // 获取页面一共引入了多少个style 文件
            this.originalStylesheetCount = document.styleSheets.length;
        });
    }
};
</script>
<style>
</style>
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k