预设

对于第 2 版 Material Design 规范,Google 创建了 Material studies,目的是通过虚构的应用程序来探索现实世界的设计局限性,每个应用程序都有自己独特的属性和用例。Vuetify 预设通过预先配置的框架选项、SASS 变量和自定义样式整合了这些研究,这些预设可以立即改变你的应用程序的外观和感觉。

默认预设

默认的 Vuetify 预设提供了所有框架服务的基线值。每个对象键(object key) 对应于 $vuetify 对象上的一个服务,并且可以通过 Vuetify 构造函数中的 preset 或自定义 user options 来覆盖。

  1. // Styles
  2. import '../../styles/main.sass'
  3. // Locale
  4. import { en } from '../../locale'
  5. // Types
  6. import { VuetifyPreset } from 'vuetify/types/services/presets'
  7. export const preset: VuetifyPreset = {
  8. breakpoint: {
  9. scrollBarWidth: 16,
  10. thresholds: {
  11. xs: 600,
  12. sm: 960,
  13. md: 1280,
  14. lg: 1920,
  15. },
  16. },
  17. icons: {
  18. iconfont: 'mdi',
  19. values: {},
  20. },
  21. lang: {
  22. current: 'en',
  23. locales: { en },
  24. t: undefined as any,
  25. },
  26. rtl: false,
  27. theme: {
  28. dark: false,
  29. default: 'light',
  30. disable: false,
  31. options: {
  32. cspNonce: undefined,
  33. customProperties: undefined,
  34. minifyTheme: undefined,
  35. themeCache: undefined,
  36. },
  37. themes: {
  38. light: {
  39. primary: '#1976D2',
  40. secondary: '#424242',
  41. accent: '#82B1FF',
  42. error: '#FF5252',
  43. info: '#2196F3',
  44. success: '#4CAF50',
  45. warning: '#FB8C00',
  46. },
  47. dark: {
  48. primary: '#2196F3',
  49. secondary: '#424242',
  50. accent: '#FF4081',
  51. error: '#FF5252',
  52. info: '#2196F3',
  53. success: '#4CAF50',
  54. warning: '#FB8C00',
  55. },
  56. },
  57. },
  58. }

Material Studies

Material Design 是一种固执己见的视觉语言,在实现高度定制的设计时,可能难以使用。新的研究展示了材料主题化的灵活性,并告诉你在没有默认材料外观的情况下创建 独特的 应用程序是多么容易。

Vuetify 预设是一个正在进行中的功能,随着 Vuetify 获得新功能,它将随着时间的推移得到增强。

目前共有 7 个 Material Studies,每个都有相应的预设插件:

安装

在你的控制台中键入 vue add vuetify-preset-{name}, 其中 {name} 对应于可用的 Material Studies 之一。 安装插件后,您的 vuetify.js 文件将更新为包括所选的预设。

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

要开始开发,命令行里需要键入 yarn serve 或者 npm run serve。 Vuetify 服务插件将引导到 Vue CLI 并自动应用预设变量和风格的所有更改。 欲了解更多关于生成器和服务插件如何工作的信息,请查看 Plugin Development Guide

合并策略

Vuetify 选项从上往下合并 — _Defaults, Preset and User_。default 预设首先会与 Vuetify 构造函数选项中提供的 preset 属性合并。如果适用,用户提供的选项将与全局默认值和预设合并。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import { preset } from 'vue-cli-plugin-vuetify-preset-shrine/preset'
  5. Vue.use(Vuetify)
  6. const options = {
  7. breakpoint: { scrollbarWidth: 12 },
  8. theme: {
  9. themes: {
  10. light: { primary: 'blue' },
  11. },
  12. },
  13. }
  14. export default new Vuetify({
  15. // The provided global preset is first merged with defaults
  16. preset,
  17. // User options are then merged, overwriting defaults and the global preset
  18. ...options,
  19. })

局限性

由于 studies 更多的是可视化而不是技术性的,所以预设是我们的 best-guess 实现。在许多情况下,由于缺乏研究报告中的信息,风格和功能必须由研究报告中的准则来推断。也有一些情况下,研究报告的部分内容 不能 或者 不被 支持。

  • 需要对框架进行修改
  • 目前无法使用 CSS
  • 我们还没有找到支持它的方法

Google 字体

当您安装预设时,它将只用它所需要的字体和权重更新您的主要 public/index.html 文件。例如,一个研究报告可能只需要 400,500,600 字体权重。这将导致 Vuetify 中的一些辅助类无法工作;例如 font-weight-thin 需要 300 字体权重。权重可以通过更新你的 public.html 中的字体链接来修改。

  1. <!-- You can add or remove font weights after the fact; e.g. Rubik:100,300,400,500 -->
  2. <!-- The available weights for each font can be found on https://
  3. fonts.google.com/ -->
  4. <link href="https://fonts.googleapis.com/css?family=Rubik:300,400,500&display=swap" rel="stylesheet">

编译时间

为了更新Vuetify中的SASS变量,在开发过程中以及当你的应用程序为生产模式构建时,样式会被重新编译。这将 增加你的初始编译时间,并且 在你编辑 variables 文件时被触发。如果你的应用程序没有受到任何 Vuetify加载器限制 的影响,你可以选择从 vuetify/lib/framework 导入 Vuetify。这可以将编译时间减少 _50%_。

  1. // src/plugins/vuetify.js
  2. // CORRECT
  3. import Vuetify from 'vuetify/lib/framework'
  4. // INCORRECT
  5. import Vuetify, { VRow } from 'vuetify/lib/framework'
  6. export default new Vuetify()

插件开发指南

Vuetify 预设是一个 npm 包,它提供了框架范围内的选项和使用 Vue CLI 进行自定义风格设计。它由一个 SASS 变量文件、一个 CSS 覆盖文件以及 Vue CLI GeneratorPlugin Service 组成。预设所提供的一些功能包括:

  • 使用 预定义的 值配置框架选项 - 可以使用任何可用的 Vuetify 选项 的组合。
  • 注入 自定义 SASS 变量,用于配置现有的 Vuetify 功能;例如组件。预设在编译时使用 Vue CLI 插件API 来提升 SASS 变量。
  • 提供 全局覆盖 的样式无法通过变量覆盖。
  • 修改 Vuetify 应用程序的风格和选项的 简化方法
  1. # Vuetify preset plugin structure
  2. .
  3. ├── generator.js # generator (optional)
  4. ├── index.js # service plugin
  5. └── preset
  6. ├── index.js # preset object
  7. ├── overrides.sass # global overrides
  8. └── variables.scss # SASS variables

自定义预设 不能 本身包含一个 preset 属性。

generator.js

此文件是 Vue CLI Generator,用于更新您应用程序中的 vuetify.js 文件以包含定义的预设。

  1. // Imports
  2. const {
  3. generatePreset,
  4. injectGoogleFontLink,
  5. } = require('@vuetify/cli-plugin-utils')
  6. // Updates the Vuetify object with provided preset
  7. module.exports = api => generatePreset(api, 'preset-name', () => {
  8. // Invoked after the generator has completed.
  9. // A common use-case is adding font links
  10. // Will automatically apply the default font-weights
  11. // 100,300,400,500,700,900
  12. injectGoogleFontLink(api, 'Rubik')
  13. // Will only use the defined font-weights
  14. injectGoogleFontLink(api, 'Roboto:100,300,700')
  15. // Works the same as the above, but accepts multiple values
  16. injectGoogleFontLink(api, [
  17. 'Rubik',
  18. 'Roboto:100,300,700',
  19. ])
  20. })

index.js

此文件是 Vue CLI Plugin Service,在运行 yarn servenpm run serve 时将绑定到您的应用程序中。 injectSassVariables 方法将目标文件的变量注入到所有 SASS/SCSS 文件中。

  1. // Imports
  2. const { injectSassVariables } = require('@vuetify/cli-plugin-utils')
  3. // Bootstraps Vue CLI with the target SASS variables
  4. module.exports = api => injectSassVariables(
  5. api,
  6. // Path to the variables file
  7. 'path/to/preset-plugin-variables.scss',
  8. // Modules to inject variables
  9. ['vue-modules', 'vue', 'normal-modules', 'normal'], // default
  10. )

preset/index.js

这包含了传递给 Vuetify 构造函数的框架配置选项。这些选项与任何用户提供的值和 框架默认值 相结合。

  1. // preset/index.js
  2. require('./overrides.sass')
  3. const preset = {
  4. theme: {
  5. themes: {
  6. light: {
  7. primary: '#5D1049',
  8. secondary: '#E30425',
  9. accent: '#720D5D',
  10. error: '#F57C00',
  11. },
  12. },
  13. },
  14. }
  15. module.exports = { preset }

preset/overrides.sass

这是对没有相应的变量的样式修改的全部内容。当你需要在现有组件中添加新的 CSS 属性时,这很有用。

  1. // preset/overrides.sass
  2. @import './variables.scss'
  3. .theme--light
  4. .v-chip
  5. border-radius: $shrine-chip-border-radius
  6. border: $shrine-chip-border
  7. font-weight: $shrine-chip-font-weight
  8. padding: $shrine-chip-padding
  9. +elevation(0)

preset/variables.scss

这是一个 SASS/SCSS 变量文件,它将覆盖现有的框架值。你可以在 Vuetify SASS变量 文档页面或组件的 API 部分找到更多关于可用变量的信息。

  1. // preset/variables.scss
  2. // Shrine specific variables
  3. $shrine-chip-border-radius: 4px;
  4. $shrine-chip-border: thin solid black;
  5. $shrine-chip-font-weight: 900;
  6. $shrine-chip-padding: 0 8px;
  7. // Preset variables
  8. $body-font-family: 'Work Sans', sans-serif;
  9. $border-radius-root: 6px;
  10. $headings: (
  11. 'h1': (
  12. 'font-family': 'Roboto', sans-serif;
  13. 'letter-spacing': 0
  14. )
  15. );
  16. $material-light: (
  17. 'cards': #E0E0E0,
  18. 'text': (
  19. 'primary': rgba(0, 0, 0, .76),
  20. 'secondary': grey
  21. )
  22. );