【问题标题】:Using custom theming in Vuetify and pass color variables to components在 Vuetify 中使用自定义主题并将颜色变量传递给组件
【发布时间】:2018-06-25 03:30:57
【问题描述】:

在我的 index.js 文件中,我已经手动用我公司的颜色覆盖了 Vuetify theme 对象:

Vue.use(Vuetify, {
  theme: {
    primary: '#377ef9',
    secondary: '#1b3e70',
    accent: '#ff643d',
    error: '#ff643d'
    ...
  }

现在,我可以像这样使用模板中的这些颜色:

<my-text-field name="input text"
    label="text"
    value="text text text text..."
    type="text"
    color="primary">
</my-text-field>

我所追求的是在我的模板样式中使用primary 或上面定义的theme 对象中的任何其他变量:

<script>
  import { VTextField } from 'vuetify'
  export default {
    extends: VTextField
  }
</script>

<style scoped lang="stylus">
  label
    color: <seconday color> <-- this is what I'm after
    color: #1b3e70 <-- this works, but not quite good enough for me
</style>

我可以轻松地将颜色的十六进制值写在样式部分,但我不想重复自己,宁愿使用我的 theme 对象,这样我也更容易轻松更改到处都是颜色,避免拼写错误导致颜色定义错误。

【问题讨论】:

  • 不确定,但我相信您也需要在.styl(即main.styl)中定义它们。或者在例如custom_colors.styl 然后在组件中导入 &lt;style scoped lang="stylus"&gt;
  • @Traxo 我不想定义我的样式两次。维护会越来越难。寻找一个完美的解决方案,我可以在一个地方定义我的东西,并在整个系统中使用它......
  • 我明白,这就是我发表评论的原因,因为我不是 100% 确定有 vuetify 解决方案。我相信唯一的 vuetify 方法是将这些值复制到 .styl
  • 查看我的answer中的重要编辑。
  • 我遇到了同样的问题,最终在我的组件中使用了 this.$vuetify.theme.currentTheme.accent

标签: vuejs2 vue-component vuetify.js


【解决方案1】:

编辑(2018/10/11)

1.2. 版本开始,我们可以启用 CSS 变量
注意:据称它在 IE 中不起作用(Edge 应该可以),可能还有一些 Safari 版本?

来自docs(参见自定义属性

启用 customProperties 还会为每个属性生成一个 css 变量 主题颜色,然后您可以在组件中使用它 块。

Vue.use(Vuetify, {
  options: {
    customProperties: true
  }
})

<style scoped>
  .something {
    color: var(--v-primary-base)
    background-color: var(--v-accent-lighten2)
  }
</style>

对于自定义值,例如
yourcustomvariablename: '#607D8B'
使用--v-yourcustomvariablename-base(所以base是默认的)。



原答案:

github上有一个Feature Request:在手写笔文件中访问主题颜色

@KaelWD(开发者之一)wrote

这是您必须自己实现的。我试过做 以前有类似的东西,但它实际上不适用于框架 级别。

问题标记为wontfix


编辑 (2018/10/11)
另请参阅此更新线程:
https://github.com/vuetifyjs/vuetify/issues/827(功能请求:本机 css 变量)

【讨论】:

  • 是的,如果您只需要静态颜色,您可以在 json 文件中定义它们并将其导入到 sylus 和 js 中。但是要动态更改它们,我们需要使用 css 变量,我对实现它有点谨慎,因为我们仍然需要支持 IE11。
  • 不确定 v1.2 的 v1.2 是否使用自定义主题。 --v-yourcustomvariablename 不起作用
  • @RomOne 你能试试--v-yourcustomvariablename-base吗?
  • 嘿,谢谢@Traxo!确实有效,但不适用于 rgba 颜色:/ 无论如何谢谢!
  • @RomOne 您也可以传递 RGB 的整数表示(例如 yourcustomvariablename: 0xff0000,不知道为什么在值中需要不透明度,因为无论如何您都无法修改它。只是设置你需要的颜色。
【解决方案2】:

有一种方法可以通过使用:style 属性来解决这个问题。它可用于响应式设置自定义 CSS 属性。

添加计算属性:

computed: {
    cssProps () {
        return {
            '--secondary-color': this.$vuetify.theme.secondary
        }
    }

将样式绑定到 cssProps:

<div id="app" :style="cssProps">

那么,按照你的风格:

<style scoped>
    label
        color: var(--secondary-color);
</style>

改编自此讨论:https://github.com/vuejs/vue/issues/7346

【讨论】:

  • 我无法正常工作。 var(--secondary-color) 没有被解析。也许构建设置不正确?
  • 您是否查看了链接讨论中的 codepen? codepen.io/richardtallent/pen/yvpERW 。我最初在测试时忘记添加 :style="cssProps" 属性。
  • 对于 lodash 的粉丝来说,这里是一个用于在 cssProps() 中导出整个主题的单行器:_(this.$vuetify.theme).reduce((acc, v, k)=&gt;{acc[`--${k}`]=v;return acc;},{});
  • 我不明白这个。样式块中的label如何应用于HTML/JS?
  • 查看other answer 中的重要编辑。不再需要解决方法(如果您不喜欢旧版浏览器)。
【解决方案3】:

对于从 Vuetify V2 开始遇到此问题的任何人,您可以执行以下操作来访问 SCSS 颜色变量。

// Import the Vuetify styles somewhere global
@import '~vuetify/src/styles/styles.sass';

// Now in your components you can access the colour variables using map-get
div {
  background: map-get($grey, lighten-4);
}

所有颜色都可以在/node_modules/vuetify/styles/settings/_colors.scss找到。

【讨论】:

  • 感谢您的提示,但我认为这个想法不是直接使用名称访问颜色,而是例如使用主题设置的背景颜色。至少那是我读到的,也是我正在寻找的 ;-)
  • 是的,知道如何访问主题颜色吗?
  • 谢谢你,正是我想要的,不是主题,而是实际颜色
  • @CJxD 不幸的是我不知道我害怕,但我认为它们可以作为变量使用background-color: $color-primary;
  • 看来var(--v-primary-base) 实际上也适用于 SASS/SCSS,因为它是一个原生 CSS 变量。您还可以执行var(--v-primary-lighten4) 之类的操作
【解决方案4】:

切换主题示例(helpfull link):

    <v-app :dark="setTheme" 
           :style="{background: $vuetify.theme.themes[theme].background}" 
           >

JS:

      computed: {
            setTheme() {
                this.$vuetify.theme.dark = this.goDark;
            }
      },
      data() {
            return { 
                goDark: false
            }
      }

【讨论】:

  • 缺少来自 setTheme 计算值的返回语句?
【解决方案5】:

从上面的答案,如果你想包含所有的 vuetify 颜色,把这段代码放在 App.vue 模板中

<v-app :style="cssProps">

App.vue 脚本

computed: {
   cssProps () {
      var themeColors = {}
      Object.keys(this.$vuetify.theme.themes.light).forEach((color) => {
        themeColors[`--v-${color}`] = this.$vuetify.theme.themes.light[color]
      })
      return themeColors
   }
}

假设你在 vuetify.js 中有这个颜色

export default new Vuetify({
  treeShake: true,
    theme: {
      themes: {
        light: {
          darkRed: "#CD3300",
        }
      }
    }
})

然后,在任何组件中:

<style scoped>
  .label {
    color: var(--v-darkRed);
  }
</style>

【讨论】:

  • 有趣...所以,您将所有颜色定义放在&lt;v-app&gt; 组件的style 属性上...实际上这是一个不错的技巧:)
【解决方案6】:

也许我迟到了,最有效的方法是在文档https://vuetifyjs.com/en/features/theme/#custom-properties中提到

我将为此提供一个工作示例。 您只需要进行三项更改即可使其正常工作。

  1. 提及具有魔力的选项和您的主题颜色
export default new Vuetify({
    theme: {
        options: {
            customProperties: true
        },
        themes: {
            light: {
                primary: "#3DCFD3",
                secondary: "#171b34",
                accent: "3D87E4"
            }
        }
    }
});
  1. 在标签中提及您希望应用主题的类名称
<h4 class="blue-header">Yash Oswal</h4>  
  1. CSS 来应用您的主题。
<style lang="scss">

.blue-header {
  color: var(--v-primary-base);
}

</style>

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 2017-07-06
    • 2020-12-29
    • 2016-12-31
    • 2020-04-19
    • 2014-01-16
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多