【问题标题】:Unable to override Vuetify 2.1 SASS variables无法覆盖 Vuetify 2.1 SASS 变量
【发布时间】:2020-02-12 18:19:51
【问题描述】:

我已经解决了这个问题几个小时,但无法提出解决方案。我查看了其他几个似乎相关的 StackOverflow 帖子(以及Vuetify docs),但似乎没有什么对我有用。首先,我只是想将字体系列从默认的 Roboto 更改为 Avenir。我没有收到控制台错误或服务器错误。

@/styles/variables.scss

@import "~vuetify/src/styles/styles.sass";
$font-size-root: 14px;

@import "~vuetify/src/styles/settings/variables";
$body-font-family: 'Avenir Next', 'Lato', Roboto, 'Helvetica Neue', Helvetica, Arial, sans-serif; // $main-font comes from my own ./_variables.scss.
$heading-font-family: 'Avenir Next', 'Lato', Roboto, 'Helvetica Neue', Helvetica, Arial, sans-serif; // $title-font comes from my own ./_variables.scss.

@/plugins/vuetify.js

import 'material-design-icons-iconfont/dist/material-design-icons.css';
import Vue from 'vue';
import Vuetify from 'vuetify/lib';
import 'vuetify/dist/vuetify.min.css';

Vue.use(Vuetify);

export default new Vuetify({
  theme: {
    options: {
      customProperties: true,
    },
    themes: {
      light: {
        primary: '#4A90E2',
        darkPrimary: '#3B73B4',
        secondary: '#424242',
        accent: '#82B1FF',
        error: '#a70000',
        info: '#2196F3',
        success: '#4CAF50',
        warning: '#FFC107',
        teal: '#64EBC6',
        green: '#7ED321',
        darkGreen: '#4c8f1d',
        lightGrey: 'rgba(0,0,0,0.12)',
        darkGrey: '#4A4A4A',
        textSecondary: 'rgba(0,0,0,0.4)',
      },
    },
  },
  icons: {
    iconfont: 'md',
  },
});

@/vue.config.js

module.exports = {
  transpileDependencies: [
    'vuetify',
  ],
  configureWebpack: {
    resolve: {
      // alias: {
      //   '~': path.resolve(__dirname, '../frontend/src'),
      // },
      extensions: ['*', '.js', '.vue', '.json'],
    },
  },
  // css: {
  //   loaderOptions: {
  //     scss: {
  //       prependData: '@import "@/styles/main.scss;"',
  //     },
  //   },
  // },
  // chainWebpack: config => {
  //   ['vue-modules', 'vue', 'normal-modules', 'normal'].forEach(match => {
  //     config.module.rule('scss').oneOf(match).use('sass-loader')
  //       .tap(opt => Object.assign(opt, { data: `@import '@/styles/main.scss'; ` }));
  //   });
  // },
};

任何帮助将不胜感激!

【问题讨论】:

    标签: vuetify.js vue-cli-3


    【解决方案1】:

    在我发布这个问题 6 分钟后,我注释掉了 vuetify 插件中的 import 'vuetify/dist/vuetify.min.css 行,这似乎正确地使用了我正在寻找的 Avenir 字体。很经典。希望这对其他人有帮助!

    【讨论】:

    • 是的,这是因为在变量赋值之前导入它实际上会覆盖我在回答中提到的字体。太好了,你解决了它。
    【解决方案2】:

    在导入 Vuetify 之前设置所有顶级变量,使 Vuetify 不会覆盖。

    在 Vuetify 之前设置这些变量

    $font-size-root: 14px;
    $body-font-family: 'Avenir Next', 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 
    $heading-font-family: 'Avenir Next', 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif; 
    

    然后,import _variables.style 以便您可以覆盖嵌套值:

    @import '~vuetify/src/stylus/settings/_variables'
    

    现在$material-dark 哈希已经存在,设置背景

    $material-dark.background = 'green'
    

    然后,导入 main.style 以便创建 Vuetify CSS 类。

    【讨论】:

    • 很棒的答案。不过有几个问题: 1. 您正在引用 .styl 文件,但我假设 .scss 会以同样的方式工作? 2. 另外,我如何知道什么是“顶级变量”,以便确保并设置高于_variables.scss? 3. 我假设我实际上不需要设置背景颜色,这只是我何时设置它的一个示例?
    • 以上只是一个例子。基本上这个概念是在导入之前设置变量,否则导入中的变量将具有高优先级并覆盖变量。在 stylus 文件中,Vuetify 使用条件赋值运算符。所以如果你在@import之前设置变量,在@import之后,它会继续。这很重要,因为.scss 内部引用了这些变量。
    • 我明白了,这很有帮助!所以基本上我只需要仔细研究他们在node_modules/vuetify 中的 .scss 文件来找出要覆盖的变量的名称?
    • 是的,这应该会有所帮助。另请参阅 vue-loader 的 deep selectors >>> 和 scoped css 以更好地掌握您编写的 CSS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2020-09-30
    • 2013-06-06
    • 2021-01-01
    • 2015-09-28
    相关资源
    最近更新 更多