element-ui 按需加载情况下覆盖预置scss变量

news/2024/7/10 2:29:12 标签: css, vue

element-ui的默认主题theme-chalk是通过scss预编译的,可以通过修改scss变量达到修改主题的目的。

在项目中改变 SCSS 变量
Element 的 theme-chalk 使用 SCSS 编写,如果你的项目也使用了 SCSS,那么可以直接在项目中改变 Element 的样式变量。新建一个样式文件,例如 element-variables.scss,写入以下内容:

/* 改变主题色变量 /
$–color-primary: teal;
/
改变 icon 字体路径变量,必需 */
$–font-path: ‘~element-ui/lib/theme-chalk/fonts’;

@import “~element-ui/packages/theme-chalk/src/index”;
之后,在项目的入口文件中,直接引入以上样式文件即可(无需引入 Element 编译好的 CSS 文件):

import Vue from ‘vue
import Element from ‘element-ui’
import ‘./element-variables.scss
Vue.use(Element)

$–color-primary 即element-ui的primary颜色变量,通过修改这个变量从而实现自定义主题颜色。当然还有很多其他的变量,如下图:

究其内部原理,因为element scss 的变量声明均加入了!default后缀,固无论你是否在element scss样式引入前还是引入后,均会覆盖掉element声明的默认样式,可以参考这里
在这里插入图片描述
如果使用全局引入的方式,这就可以了。

但是,若使用按需引入,就不行了。主要有两个原因

  • 按需引入的情况下如何引入scss文件而不是css文件
  • 如何将定义好的变量加入到每个引入的scss之中

对于第一个问题。我们知道使用按需引入需要添加一个插件即babel-plugin-component,至于使用方式我这里不做赘述,可以参考官网。但通过查阅官网发现这个插件并不能引入scss文件,通过查看源码发现其存在一个未写在文档上的api可以实现。

    [
      "component",
      {
      // 这个配置文档并没有,但源码中是有做判断的。默认为css,如果配置了这个字段则为scss.
        "ext": ".scss",
        "libraryName": "element-ui",
        "styleLibrary": {
          "name": "~node_modules/element-ui/packages/theme-chalk/src",
          "base": true,
          "path": "[module].scss",
          "mixin": false
        }
      }
    ],

对于第二个问题,需要使用webpack的配置去实现,如下:

  {
    loader: 'sass-loader',
    options: {
      additionalData: `@import "@/assets/theme/vars.scss";`
    }
  }

简单来说就是通过给各个scss文件头部添加一条导包语句,进而实现将预置好的scss变量引入到每个scss文件的目的。如果你使用vue-cli,请自行查阅vue-cli的文档。大概是这样的:

  css: {
    loaderOptions: {
      sass: {
        prependData: `
          @import "@/assets/theme/vars.scss;
        `,
      },
    },
  },

最后再次尝试打包即可。另外说一句,antd的插件就可以直接引入scss,相对而言就更友好一些。


http://www.niftyadmin.cn/n/1382568.html

相关文章

《区块链安全白皮书-技术应用篇(2018年)》

本白皮书从网络安全的视角,客观审视区块链技术发展和应用情况,分析探讨区块链技术应用分层架构、安全风险和应对框架,给出关于促进区块链技术安全应用的若干建议,希望与业界分享,切实提升区块链技术发展应用安全性。 内…

VEMap.DeleteAllShapeLayers 方法

来源&#xff1a;https://msdn.microsoft.com/zh-cn/library/bb412514.aspx <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html><head><title>…

vue-cli 项目修改@的默认路径

vue-cli项目默认为src目录提供了别名 可按如下方式修改默认的路径 // vue.config.js const path require(path) module.exports {chainWebpack: config > {config.resolve.alias.set(, path.resolve(__dirname, path/to/desination));} }或者自定义更多路径 // vue.con…

别样JAVA学习(六)继承下(2.3)异常下

1、RuntimeExceptionException中有一个特殊的子类异常RuntimeException执行时异常。 假设在函数内容抛出该异常&#xff0c;函数上能够不用声明。编译一样通过。 假设在函数上声明了该异常&#xff0c;调用者能够不用进行处理。编译一样通过。 之所以不用在函数上声明&#xff…

Linux 小知识翻译 - 目录 (完结)

偶尔在网上看到的这篇文章&#xff0c;总结了linux中一些天天在说的概念。可能是因为天天说的关系, 一直以为自己知道这些概念。其实对有些概念也只是似是而非的了解而已。 为此&#xff0c;决定将所有的小知识点全翻译下来&#xff0c;给自己看也是给大家参考。 原文是日文的&…

MySQL压缩包安装

1.当在C盘的my.default文件中进行配置的时候&#xff0c;发现无法保存&#xff0c;需要联系管理员解决办法&#xff1a;把my.default文件先剪切到别的盘进行配置&#xff0c;之后再复制到C盘2.在cmd中要已管理员的身份运行&#xff0c;需要如下输入几条命令后再输入操作命令3.转…

Javascript 获取图片的真实宽高和文件大小

获取图片的真实尺寸 getImageSize(imgSrc) {return new Promise((resolve, reject) > {const newImg new Image();newImg.onload () > {resolve([newImg.width, newImg.height]);};newImg.onerror (err) > {reject(err);}newImg.src imgSrc; });}获取文件尺寸 只…

学习进度条12

星期日 星期一 星期二 星期三 星期四 星期五 星期六 所花时间&#xff08;包括上课&#xff09; 16:45- 17:20 8:00- 9:50 15:40- 17:10 19&#xff1a;01- 20&#xff1a;40 16&#xff1a;20- 18:13 16:17- 18:11 10:00- 12:00 代码量&#xff08;行&am…