主题

轻松更改你的应用程序的颜色。重建默认样式表,并根据你的特定需求自定义框架的各个方面。

主题生成器

使用我们的 Theme Generator 工具为你的 Vuetify 应用程序发现和生成新的颜色主题。

浅色和深色

Vuetify 同时支持 Material Design spec 中的 lightdark 变量。这个指定从根组件的 v-app 开始,大多数组件都支持它。默认情况下,你的应用程序将会使用 light 主题,但是你也可以轻松的在主题服务中使用 dark 选项来改变它。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. Vue.use(Vuetify)
  5. export default new Vuetify({
  6. theme: {
  7. dark: true,
  8. },
  9. })

当你指定一个组件为浅色或暗色时,除非另有指定,所有子组件将继承并应用同样的组件。 你可以手动打开 dark 开关,方法是将 this.$vuetify.theme.dark 更改为 truefalse

自定义

默认情况下,Vuetify 具有适用于所有组件的标准主题。

  1. {
  2. primary: '#1976D2',
  3. secondary: '#424242',
  4. accent: '#82B1FF',
  5. error: '#FF5252',
  6. info: '#2196F3',
  7. success: '#4CAF50',
  8. warning: '#FFC107',
  9. }

这可以很容易地改变。只需传递一个 主题 属性给 Vuetify 构造函数即可。你可以选择修改所有或只修改部分主题属性,其余的属性则继承自默认的主题属性。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. const vuetify = new Vuetify({
  5. theme: {
  6. themes: {
  7. light: {
  8. primary: '#3f51b5',
  9. secondary: '#b0bec5',
  10. accent: '#8c9eff',
  11. error: '#b71c1c',
  12. },
  13. },
  14. },
  15. })

你也可以使用预定义的 material 色彩。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import colors from 'vuetify/lib/util/colors'
  5. const vuetify = new Vuetify({
  6. theme: {
  7. themes: {
  8. light: {
  9. primary: colors.purple,
  10. secondary: colors.grey.darken1,
  11. accent: colors.shades.black,
  12. error: colors.red.accent3,
  13. },
  14. dark: {
  15. primary: colors.blue.lighten3,
  16. },
  17. },
  18. },
  19. })

默认情况下,主题服务将使用你应用程序的主颜色为 anchor 标签。 你可以通过向主题 anchor 属性来覆盖它:

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. Vue.use(Vuetify)
  5. const vuetify = new Vuetify({
  6. theme: {
  7. themes: {
  8. light: {
  9. primary: '#3f51b5',
  10. secondary: '#b0bec5',
  11. anchor: '#8c9eff',
  12. },
  13. },
  14. },
  15. })
  16. export default vuetify

深入原理,Vuetify 将会根据这些可以在 DOM 中访问的值生成 CSS 类。这些类将遵循与其他助手类相同的标记,例如 primary 或者 secondary--text。如果提供整个颜色对象(如上述 colors.purple 中的颜色),则 lighten/darken 变量将立即使用来代替生成。

这些值会在 theme 属性下的 $vuetify 对象示例中可用。这可以让你动态地修改你的主题,Vuetify 将在后台重新生成并更新你的主题类,无缝更新你的应用程序。

  1. // Light theme
  2. this.$vuetify.theme.themes.light.primary = '#4caf50'
  3. // Dark theme
  4. this.$vuetify.theme.themes.dark.primary = '#4caf50'

自定义主题变量

虽然 Vuetify 会自动生成主题颜色的 lightendarken 变量,但你可能想要自己控制这个东西。 只需传递一个包含你想要修改的变量的主题对象。不需要提供任何东西就为你生成。

  1. // src/plugins/vuetify/theme.js
  2. import colors from 'vuetify/lib/util/colors'
  3. export default {
  4. primary: {
  5. base: colors.purple.base,
  6. darken1: colors.purple.darken2,
  7. },
  8. secondary: colors.indigo,
  9. // All keys will generate theme styles,
  10. // Here we add a custom `tertiary` color
  11. tertiary: colors.pink.base,
  12. }

你现在可以导入你的自定义主题对象并将其应用到 Vuetify

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import light from './theme'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. theme: {
  8. themes: { light },
  9. },
  10. })

下面是主题对象上可覆盖键的完整列表:

  1. interface ParsedThemeItem {
  2. base: string
  3. lighten5: string
  4. lighten4: string
  5. lighten3: string
  6. lighten2: string
  7. lighten1: string
  8. darken1: string
  9. darken2: string
  10. darken3: string
  11. darken4: string
  12. [name: string]: string
  13. }

禁用主题

您可以使用值为 truedisable 属性来禁用主题功能 。这将禁止创建 Vuetify 样式表。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. const vuetify = new Vuetify({
  5. theme: { disable: true },
  6. })

选项

Vuetify 在运行时为 SPA 生成主题样式,在服务器端为 SSR 应用程序生成主题样式。生成的样式将被放置在一个带有 idvuetify-theme-stylesheet<style> 标签中。

压缩

minifyTheme 选项允许你提供一个自定义的 minify 实现。这有助于减少初始页面的大小,建议与 `options.meincessCache’ 搭配使用。在这个例子中,我们使用了 minify-css-string 包来减化 生成的主题样式

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import minifyTheme from 'minify-css-string'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. theme: {
  8. options: { minifyTheme },
  9. },
  10. })

缓存

你可以选择传递一个自定义的 themeCache实现。这可以让你跳过重新计算主题对象的需要。下面是一个使用 localStorage 属性的例子。

  1. // src/plugins/vuetify.js
  2. export default new Vuetify({
  3. theme: {
  4. options: {
  5. themeCache: {
  6. get: key => localStorage.getItem(key),
  7. set: (key, value) => localStorage.setItem(key, value),
  8. },
  9. },
  10. },
  11. })

提供的 themeCache 对象 必须 包含一个 getset 方法。使用它们来检索和设置 生成的 css 字符串。

缓存也可以通过 lru-cache 来完成。这对于 SSR(服务器端渲染)应用特别有用。

  1. // src/plugins/vuetify.js
  2. const themeCache = new LRU({
  3. max: 10,
  4. maxAge: 1000 * 60 * 60, // 1 hour
  5. })
  6. export default new Vuetify({
  7. theme: {
  8. options: {
  9. themeCache,
  10. },
  11. },
  12. })

自定义属性

启用 customProperties 也会为每个主题颜色生成一个 css 变量,你可以在组件的 <style> 块中使用。

Internet Explorer 中不支持自定义属性。可使用 Polyfills(有一些限制):https://github.com/nuxodin/ie11CustomProperties, https://github.com/jhildenbiddle/css-vars-ponyfill.

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. export default new Vuetify({
  5. theme: {
  6. options: {
  7. customProperties: true,
  8. },
  9. },
  10. })
  1. <style scoped>
  2. .something {
  3. color: var(--v-primary-base);
  4. background-color: var(--v-accent-lighten2);
  5. }
  6. </style>

CSP Nonce

启用了 script-srcstyle-src CSP 规则的页面可能需要为嵌入的样式标签指定一个 nonce

  1. <!-- Use with script-src -->
  2. Content-Security-Policy: script-src 'self' 'nonce-dQw4w9WgXcQ'
  3. <!-- Use with style-src -->
  4. Content-Security-Policy: style-src 'self' 'nonce-dQw4w9WgXcQ'
  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. export default new Vuetify({
  5. theme: {
  6. options: {
  7. cspNonce: 'dQw4w9WgXcQ',
  8. },
  9. },
  10. })

主题 Provider

Vuetify 主题系统是通过 Vue 中的 provide 功能传播的。在某些情况下可能需要手动更改提供的主题(深色或浅色)。

props

name

dark

type

boolean

default

false

description

将暗色主题变量应用到组件。你可以在 dark themes 的 Material Design 文档中找到更多有关信息。


name

light

type

boolean

default

false

description

为组件设置浅色主题。


name

root

type

boolean

default

false

description

使用当前的值 $vuetify.theme.dark ,而不是提供的值。

用例

在这个例子中,底层卡继承自 $vuetify.mechanical.dark 的根目录。

template script


  1. <template>
  2. <v-card dark>
  3. <v-toolbar
  4. color="primary"
  5. flat
  6. >
  7. <v-switch
  8. v-model="$vuetify.theme.dark"
  9. hide-details
  10. inset
  11. label="Theme Dark"
  12. ></v-switch>
  13. </v-toolbar>
  14. <v-card-text>
  15. <v-list>
  16. <v-subheader>I inherit dark from my parent</v-subheader>
  17. <v-list-item>
  18. <v-list-item-title>One</v-list-item-title>
  19. </v-list-item>
  20. <v-list-item>
  21. <v-list-item-title>Two</v-list-item-title>
  22. </v-list-item>
  23. <v-list-item>
  24. <v-list-item-title>Three</v-list-item-title>
  25. </v-list-item>
  26. </v-list>
  27. <v-divider class="my-8"></v-divider>
  28. <v-theme-provider root>
  29. <v-list>
  30. <v-subheader>I inherit from the root $vuetify.theme.dark</v-subheader>
  31. <v-list-item>
  32. <v-list-item-title>One</v-list-item-title>
  33. </v-list-item>
  34. <v-list-item>
  35. <v-list-item-title>Two</v-list-item-title>
  36. </v-list-item>
  37. <v-list-item>
  38. <v-list-item-title>Three</v-list-item-title>
  39. </v-list-item>
  40. </v-list>
  41. </v-theme-provider>
  42. </v-card-text>
  43. </v-card>
  44. </template>
  1. <script>
  2. export default {
  3. props: {
  4. attrs: {
  5. type: Object,
  6. default: () => ({}),
  7. },
  8. },
  9. data: vm => ({
  10. initialDark: vm.$vuetify
  11. ? vm.$vuetify.theme.dark
  12. : false,
  13. }),
  14. beforeDestroy () {
  15. if (!this.$vuetify) return
  16. this.$vuetify.theme.dark = this.initialDark
  17. },
  18. }
  19. </script>

Theme(主题) - 图1