本文介绍两种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 这个官方已不用,使用会报错)

  

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

  安装elementUI :npm i element-ui -S

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

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

         

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

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

  

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

    结束第一种,可以随便写几个element组件试试下

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

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

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

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

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

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

  1.    

  2. 安装两个插件:

    npm install css-color-function

    npm install object-assign

  3. 

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

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

  

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

    

  5. 写组件:Theme.vue  

  1. <!-- 切换主题色 -->
  2. <template>
  3. <div>
  4. <el-color-picker @change="colorChange" v-model="colors.primary" ></el-color-picker>
  5. </div>
  6. </template>
  7. <script>
  8. import generateColors from "../../utils/color";
  9. import objectAssign from "object-assign";
  10. export default {
  11. name: "App",
  12. data() {
  13. return {
  14. originalStylesheetCount: -1,//记录当前已引入style数量
  15. originalStyle: "",//获取拿到的.css的字符串
  16. colors: {
  17. //颜色选择器默认颜色值,这个值要和element-variables一样
  18. primary: "#409EFF"
  19. },
  20. // primaryColor: "", //提交成功后设置默认颜色
  21. cssUrl: [
  22. "//unpkg.com/element-ui/lib/theme-chalk/index.css",
  23. "./static/css/index.css"
  24. ]
  25. };
  26. },
  27. methods: {
  28. colorChange(e) {
  29. if(!e)return;
  30. localStorage.setItem('color',e)
  31. this.primaryColor = this.colors.primary;
  32. this.colors = objectAssign(
  33. {},
  34. this.colors,
  35. generateColors(this.colors.primary)
  36. );
  37. this.writeNewStyle();
  38. },
  39. writeNewStyle() {
  40. let cssText = this.originalStyle;
  41. Object.keys(this.colors).forEach(key => {
  42. cssText = cssText.replace(
  43. new RegExp("(:|\\s+)" + key, "g"),
  44. "$1" + this.colors[key]
  45. );
  46. });
  47. if (this.originalStylesheetCount === document.styleSheets.length) {
  48. // 如果之前没有插入就插入
  49. const style = document.createElement("style");
  50. style.innerText =
  51. ".primaryColor{background-color:" + this.colors.primary + "}" + cssText;
  52. document.head.appendChild(style);
  53. } else {
  54. // 如果之前没有插入就修改
  55. document.head.lastChild.innerText =
  56. ".primaryColor{background-color:" +
  57. this.colors.primary +
  58. "} " +
  59. cssText;
  60. }
  61. },
  62. getIndexStyle(url) {
  63. let that = this;
  64. var request = new XMLHttpRequest();
  65. request.open("GET", url);
  66. request.onreadystatechange = function() {
  67. if (
  68. request.readyState === 4 &&
  69. (request.status == 200 || request.status == 304)
  70. ) {
  71. // 调用本地的如果拿不到会得到html,html是不行的
  72. if (request.response && !/DOCTYPE/gi.test(request.response)) {
  73. that.originalStyle = that.getStyleTemplate(request.response);
  74. that.writeNewStyle()
  75. } else {
  76. that.originalStyle = "";
  77. }
  78. } else {
  79. that.originalStyle = "";
  80. }
  81. };
  82. request.send(null);
  83. },
  84. getStyleTemplate(data) {
  85. const colorMap = {
  86. "#3a8ee6": "shade-1",
  87. "#409eff": "primary",
  88. "#53a8ff": "light-1",
  89. "#66b1ff": "light-2",
  90. "#79bbff": "light-3",
  91. "#8cc5ff": "light-4",
  92. "#a0cfff": "light-5",
  93. "#b3d8ff": "light-6",
  94. "#c6e2ff": "light-7",
  95. "#d9ecff": "light-8",
  96. "#ecf5ff": "light-9"
  97. };
  98. Object.keys(colorMap).forEach(key => {
  99. const value = colorMap[key];
  100. data = data.replace(new RegExp(key, "ig"), value);
  101. });
  102. return data;
  103. }
  104. },
  105. mounted() {
  106. // 默认从线上官方拉取最新css,2秒钟后做一个检查没有拉到就从本地在拉下
  107. let that = this;
  108. // 如果是记住用户的状态就需要,在主题切换的时候记录颜色值,在下次打开的时候从新赋值
  109. this.colors.primary = localStorage.getItem('color')||this.colors.primary//例如
  110. this.getIndexStyle(this.cssUrl[0]);
  111. setTimeout(function() {
  112. if (that.originalStyle) {
  113. return;
  114. } else {
  115. that.getIndexStyle(that.cssUrl[1]);
  116. }
  117. }, 2000);
  118. this.$nextTick(() => {
  119. // 获取页面一共引入了多少个style 文件
  120. this.originalStylesheetCount = document.styleSheets.length;
  121. });
  122. }
  123. };
  124. </script>
  125. <style>
  126. </style>

vue,elementUI切换主题,自定义主题的更多相关文章

  1. vue2.0-基于elementui换肤[自定义主题]

    0. 直接上 预览链接 vue2.0-基于elementui换肤[自定义主题] 1. 项目增加主题组件 在项目的src/components下添加skin文件夹 skin文件获取地址 2. 项目增加自 ...

  2. 关于vue cli 使用iview 自定义主题遇到的坑

    定制主题,这里讲变量覆盖 当你老老实实的把上面文档中的代码一一复制粘贴到项目文件中时,发现了还没装less,所以你就 npm install less –savenpm install less-lo ...

  3. vue elementui 切换语言

    1.安装插件:npm install vue-i18n  --save 2.src下新建i18n文件夹, i18n文件夹下创建langs文件夹和i18n.js文件 langs文件夹下创建cn.js; ...

  4. 基于ElementUI的网站换主题的一些思考与实现

    前言 web应用程序,切换主题,给其换肤,是一个比较常见的需求. 如何能快速的切换主题色?(只有固定的一种皮肤) 如果又想把主题色切换为以前的呢?(有多种可切换的皮肤) 该以何种方式编写标签的css属 ...

  5. ModernUI教程:创建自定义主题

            Modern UI WPF包括两个内置主题(dark与light).在1.0.3版本,您可以构建自定义的主题.Modern UI应用程序通常有在全局资源字典App.xaml中有如下定义 ...

  6. Vue的elementUI实现自定义主题

    使用vue开发项目,用到elementUI,根据官网的写法,我们可以自定义主题来适应我们的项目要求,下面来介绍一下两种方法实现的具体步骤,(可以参考官方文档自定义主题官方文档),先说项目中没有使用sc ...

  7. vue中使用element-ui自定义主题后,vue-cli跑不起来了

    环境:vue-cli 2.x版本 自己在官网配置了主题并放到了项目中https://element.eleme.cn/#/zh-CN/theme 然后,我的脚手架在我的电脑中休息了几天,就跑不通了呢! ...

  8. vue-基于elementui自定义主题更换皮肤及自定义内容的皮肤跟换

    参考这篇博客https://blog.csdn.net/young_Emily/article/details/78591261做一遍,加上自己的一些理解 思路:通过自己上一篇博客https://ww ...

  9. element-ui修改自定义主题

    官方文档:https://element.eleme.cn/#/zh-CN/component/custom-theme 简单更换主题色 打开:在线主题编辑器,仅修改主题色,点击右上角[切换主题色], ...

随机推荐

  1. zzulioj--1613--少活一年?(稍微有点坑,水!)

    1613: 少活一年? Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 344  Solved: 70 SubmitStatusWeb Board De ...

  2. 【HDU 2176】 取(m堆)石子游戏

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=2176 [算法] Nim博弈 当石子数异或和不为0时,先手必胜,否则先手必败 设石子异或和为S 如果 ...

  3. FFmpeg 移植 Android

    近期项目需要解析苹果的HLS流媒体协议,而FFmpeg从0.11.1“Happiness”版本开始,才增加了对HLS协议的支持.目前网上关于FFmpeg编译移植的文章有很多,但大多都是对旧版本的说明. ...

  4. 洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)

    题目描述 设d(x)为x的约数个数,给定N.M,求 \sum^N_{i=1}\sum^M_{j=1}d(ij)∑i=1N​∑j=1M​d(ij) 输入输出格式 输入格式: 输入文件包含多组测试数据.第 ...

  5. JS 有一张0.0001米的纸,对折多少次可以达到珠穆朗玛峰的高度8848;

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. NuSOAP笔记:如何创建复杂数据类型

    PHP已经有了内置的SOAP扩展,但是它不具备自动生成WSDL的能力,所以很多时候,NuSOAP还是有一定诱惑力的. 在应用稍微复杂点的时候,单靠integer, string等简单数据类型是不能满足 ...

  7. 编写高性能的javascript代码(持续更新)

    参考资料: Vanilla JS——世界上最轻量的JavaScript框架(没有之一) http://segmentfault.com/a/1190000000355277 探索高效jQuery的奥秘 ...

  8. Parse error: syntax error, unexpected '__data' (T_STRING), expecting ',' or ')'

    使用laravel时,建立view文件引入dafault文件时报错: Parse error: syntax error, unexpected '__data' (T_STRING), expect ...

  9. BZOJ 3336 Black and White (插头DP)

    题目大意: 给你一个n×m的网格,有一些格子已经被涂上了白色或者黑色,让你用黑色或白色填剩下的格子,且填好的网格必须保证: 1.对于任意2×2的子矩阵的4个格子,它们的颜色不能都相同 2.所有黑色的块 ...

  10. 搭建hadoop java开发环境

    package hadoopDemo; import java.io.IOException; import java.net.URI; import java.net.URISyntaxExcept ...