图标

Vuetify 只能看出 Material Design Icons、Material Icons、Font Awesome 4 和 Font Awesome 5。 默认情况下,应用程序将默认使用 Material Design Icons

用例

要更改你的字体库,需要在实例化过程中添加 iconfont 选项。

  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. icons: {
  7. iconfont: 'mdiSvg', // 'mdi' || 'mdiSvg' || 'md' || 'fa' || 'fa4' || 'faSvg'
  8. },
  9. })

使用预定义选项将根据所选的预置预填充默认值。这将覆盖默认的 icon 值。欲了解更多信息,请参阅 icon preset values

安装 iconfonts

你需要包括指定的图标库(即使使用默认图标库)。这可以通过包含 CDN 链接或将图标库导入到你的应用程序中来完成。

安装 Material Design Icons

这是 Vuetify 的默认图标字体。您可以通过 CDN 包含它:

  1. <link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">

或者作为本地依赖:

  1. $ yarn add @mdi/font -D
  2. // OR
  3. $ npm install @mdi/font -D
  1. // src/plugins/vuetify.js
  2. import '@mdi/font/css/materialdesignicons.css' // Ensure you are using css-loader
  3. import Vue from 'vue'
  4. import Vuetify from 'vuetify/lib'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. icons: {
  8. iconfont: 'mdi', // default - only for display purposes
  9. },
  10. })

安装 Material Design Icons (JS SVG)

指定 SVG 路径的方式来使用 @mdi/js。在生产环境中优化你的应用程序时推荐安装。如果你计划使用多个默认图标,那么就 需要包含它。

  1. $ yarn add @mdi/js -D
  2. // OR
  3. $ npm install @mdi/js -D

指定 mdiSvg iconfont:

  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. icons: {
  7. iconfont: 'mdiSvg',
  8. },
  9. })

你可以自定义仅导入你使用的图标,以授予更小的捆绑包大小。

  1. <!-- Vue Component -->
  2. <template>
  3. <v-icon>{{ svgPath }}</v-icon>
  4. </template>
  5. <script>
  6. import { mdiAccount } from '@mdi/js'
  7. export default {
  8. data: () => ({
  9. svgPath: mdiAccount
  10. }),
  11. }
  12. </script>

安装 Material Icons

安装步骤与上面相同。对于没有构建过程的项目,建议从 CDN 导入图标

  1. <link href="https://fonts.googleapis.com/css?family=Material+Icons" rel="stylesheet">

或者,可以使用 yarn 或 npm 在本地安装。 请记住,这不是官方的 google 仓库,可能无法接收更新

  1. $ yarn add material-design-icons-iconfont -D
  2. // OR
  3. $ npm install material-design-icons-iconfont -D

安装软件包后,将其导入到主目录的 js 文件中。通常是位于 src/ 文件夹中的 main.js, index.jsapp.js。如果您使用的是 SSR 应用程序,则可能在 client.jsentry-client.js 文件中。

  1. // src/plugins/vuetify.js
  2. import 'material-design-icons-iconfont/dist/material-design-icons.css' // Ensure you are using css-loader
  3. import Vue from 'vue'
  4. import Vuetify from 'vuetify/lib'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. icons: {
  8. iconfont: 'md',
  9. },
  10. })

安装 Font Awesome 5 Icons

安装 FontAwesome 最简单的方法是使用 cdn。在你主要的 index.html 的头部里放置这个代码:

  1. <link href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" rel="stylesheet">

要在本地安装,你可以使用你喜欢的软件包管理器版本 Free 安装 FontAwesome

  1. $ yarn add @fortawesome/fontawesome-free -D
  2. // OR
  3. $ npm install @fortawesome/fontawesome-free -D

在你的主入口中,只需导入包中的 all.css。如果你正在操作一个 webpack 项目,你需要使用 webpack css loader 来设置对 .css 文件的支持。如果你已经在使用 Vue CLI,那么这些都会自动完成。

  1. // src/plugins/vuetify.js
  2. import '@fortawesome/fontawesome-free/css/all.css' // Ensure you are using css-loader
  3. import Vue from 'vue'
  4. import Vuetify from 'vuetify/lib'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. icons: {
  8. iconfont: 'fa',
  9. },
  10. })

安装 Font Awesome 4 Icons

与上面相同。通过 cdn 安装 FontAwesome 在你的项目内是最简单方式:

  1. <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.x/css/font-awesome.min.css" rel="stylesheet">

安装 FontAwesome4 的方法与它的新版本相同,只是从一个不同的仓库安装。 你将看准是 font-awesome 而不是 @fortawesome

  1. $ yarn add font-awesome@4.7.0 -D
  2. // OR
  3. $ npm install font-awesome@4.7.0 -D

不要忘记,你的项目需要识别 css。如果你正在使用 webpack,安装和设置 css loader

  1. // src/plugins/vuetify.js
  2. import 'font-awesome/css/font-awesome.min.css' // Ensure you are using css-loader
  3. import Vue from 'vue'
  4. import Vuetify from 'vuetify/lib'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. icons: {
  8. iconfont: 'fa4',
  9. },
  10. })

安装 Font Awesome SVG Icons

添加必需的依赖项。

  1. $ yarn add @fortawesome/fontawesome-svg-core @fortawesome/vue-fontawesome @fortawesome/free-solid-svg-icons -D
  2. // or
  3. $ npm install @fortawesome/fontawesome-svg-core @fortawesome/vue-fontawesome @fortawesome/free-solid-svg-icons -D

然后在 Vuetify 配置中全局添加 font-awesome-icon 组件,并设置 faSvg 为图标字体。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import { library } from '@fortawesome/fontawesome-svg-core'
  5. import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
  6. import { fas } from '@fortawesome/free-solid-svg-icons'
  7. Vue.component('font-awesome-icon', FontAwesomeIcon) // Register component globally
  8. library.add(fas) // Include needed icons
  9. Vue.use(Vuetify)
  10. export default new Vuetify({
  11. icons: {
  12. iconfont: 'faSvg',
  13. },
  14. })

使用自定义图标

假设你的应用程序在 Vuetify 组件中调用自定义图标。你可以在全局级别配置它,而不是每次出现组件时都创建包装器组件或手动定义特定的图标。

  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. icons: {
  7. iconfont: 'fa',
  8. values: {
  9. cancel: 'fas fa-ban',
  10. menu: 'fas fa-ellipsis-v',
  11. },
  12. },
  13. })

假设你的应用程序在 Vuetify 组件中调用自定义图标。你可以在全局级别配置它,而不是每次出现组件时都创建包装器组件或手动定义特定的图标。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. const MY_ICONS = {
  5. complete: '...',
  6. cancel: '...',
  7. close: '...',
  8. delete: '...', // delete (e.g. v-chip close)
  9. clear: '...',
  10. success: '...',
  11. info: '...',
  12. warning: '...',
  13. error: '...',
  14. prev: '...',
  15. next: '...',
  16. checkboxOn: '...',
  17. checkboxOff: '...',
  18. checkboxIndeterminate: '...',
  19. delimiter: '...', // for carousel
  20. sort: '...',
  21. expand: '...',
  22. menu: '...',
  23. subgroup: '...',
  24. dropdown: '...',
  25. radioOn: '...',
  26. radioOff: '...',
  27. edit: '...',
  28. ratingEmpty: '...',
  29. ratingFull: '...',
  30. ratingHalf: '...',
  31. loading: '...',
  32. first: '...',
  33. last: '...',
  34. unfold: '...',
  35. file: '...',
  36. }
  37. Vue.use(Vuetify)
  38. export default new Vuetify({
  39. icons: {
  40. values: MY_ICONS,
  41. },
  42. })

可重复使用的自定义图标

Vuetify 会 自动 将提供的任何图标字符串合并到可用预设池中。这使你可以通过简单地引用 全局图标 来创建可用于应用程序中使用的自定义字符串。

  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. icons: {
  7. iconfont: 'mdi', // default
  8. values: {
  9. product: 'mdi-dropbox',
  10. support: 'mdi-lifebuoy',
  11. steam: 'mdi-steam-box',
  12. pc: 'mdi-desktop-classic',
  13. xbox: 'mdi-xbox',
  14. playstation: 'mdi-playstation',
  15. switch: 'mdi-nintendo-switch',
  16. },
  17. },
  18. })

给定提供的字符串,这可以帮助确保你的应用程序始终使用特定的图标。这样有几种方法让你可以在此系统上使用 <v-icon>

  1. <!-- Vue Component -->
  2. <template>
  3. <div>
  4. <v-icon>$vuetify.icons.product</v-icon>
  5. <v-icon>$product</v-icon>
  6. <v-icon v-text="'$vuetify.icons.support'"></v-icon>
  7. <v-icon v-text="'$support'"></v-icon>
  8. <v-icon v-html="'$vuetify.icons.steam'"></v-icon>
  9. <v-icon v-html="'$steam'"></v-icon>
  10. <v-icon v-text="platform"></v-icon>
  11. </div>
  12. </template>
  13. <script>
  14. export default {
  15. data: () => ({
  16. user: {
  17. name: 'John Leider',
  18. platform: 'pc',
  19. },
  20. }),
  21. computed: {
  22. platform () {
  23. return '$' + this.user.platform
  24. }
  25. }
  26. }
  27. </script>

自定义组件

你可以在自己的自定义组件中使用相同的图标字符串。每当通过 v-text, v-html 或作为文本传递 $vuetify.icons (or shortcut $) 时,<v-icon> 都会查找该指定值。这使你可以创建易于构建和管理的自定义解决方案。

  1. <!-- Vue Component -->
  2. <template>
  3. <div class="my-component">
  4. <v-icon v-text="icon"></v-icon>
  5. <slot></slot>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. props: {
  11. icon: {
  12. type: String,
  13. default: '$cancel'
  14. }
  15. }
  16. }
  17. </script>

自定义 Font Awesome Pro Icons

你可以在 Font Awesome Pro 中使用组件图标来选择各个图标的权重:

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import { library } from '@fortawesome/fontawesome-svg-core'
  5. import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'
  6. import { faBars } from '@fortawesome/pro-light-svg-icons'
  7. import { faVuejs } from '@fortawesome/free-brands-svg-icons'
  8. Vue.component('font-awesome-icon', FontAwesomeIcon)
  9. library.add(faBars, faVuejs)
  10. Vue.use(Vuetify)
  11. export default new Vuetify({
  12. icons: {
  13. values: {
  14. // set menu to light (default is solid)
  15. menu: {
  16. component: FontAwesomeIcon,
  17. props: {
  18. icon: ['fal', 'bars'],
  19. },
  20. },
  21. // reusable custom icon
  22. vuejs: {
  23. component: FontAwesomeIcon,
  24. props: {
  25. icon: ['fab', 'vuejs'],
  26. },
  27. },
  28. },
  29. },
  30. })

组件图标

你可以使用自己的组件图标,而不是使用预设提供的图标字体。 你也可以在 Vuetify 组件中切换预设图标和你自己的图标。

  1. // src/plugins/vuetify.js
  2. import Vue from 'vue'
  3. import Vuetify from 'vuetify/lib'
  4. import IconComponent from './IconComponent.vue'
  5. Vue.use(Vuetify)
  6. export default new Vuetify({
  7. icons: {
  8. values: {
  9. product: {
  10. component: IconComponent, // you can use string here if component is registered globally
  11. props: { // pass props to your component if needed
  12. name: 'product',
  13. },
  14. },
  15. },
  16. },
  17. })

如果你想要你的 SVG 图标继承颜色并正确缩放-请确保添加以下 CSS:

  1. .your-svg-icon
  2. fill: currentColor

使用缺失的 Material Icons

默认缺少一些 material icons,例如 personperson_outline 可用,但是 visibility_outline 不可用,而 visibility 可用。要使用这些缺失的 material icons,请在下面包含字体(如果已经注册,请删除另一个 material font)。

  1. <link
  2. rel="stylesheet"
  3. href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp"
  4. />

你可以添加你的自定义组件。假定它是 @/components/MaterialIcon.vue

  1. <template>
  2. <i :class="standardClass">{{ parsed.id }}</i>
  3. </template>
  4. <script>
  5. export default {
  6. props: {
  7. name: {
  8. type: String
  9. }
  10. },
  11. computed: {
  12. parsed() {
  13. const check = (customSuffixes, standardSuffix) => {
  14. for (let suffix of customSuffixes) {
  15. suffix = `_${suffix}`
  16. if (this.name.endsWith(suffix)) {
  17. return {
  18. suffix: standardSuffix,
  19. id: this.name.substring(0, this.name.indexOf(suffix))
  20. }
  21. }
  22. }
  23. return false
  24. }
  25. return (
  26. check(['fill', 'filled'], '') ||
  27. check(['outline', 'outlined'], 'outlined') ||
  28. check(['two-tone', 'two-toned'], 'two-tone') ||
  29. check(['round', 'rounded'], 'round') ||
  30. check(['sharp', 'shapened'], 'sharp') || {
  31. suffix: '',
  32. id: this.name
  33. }
  34. )
  35. },
  36. standardClass() {
  37. if (this.parsed.suffix) {
  38. return `material-icons-${this.parsed.suffix}`
  39. }
  40. return 'material-icons'
  41. }
  42. }
  43. }
  44. </script>

然后你需要确切注册你想要的 material icons。

  1. import Vue from 'vue'
  2. import Vuetify from 'vuetify/lib'
  3. import MaterialIcon from '@/components/MaterialIcon'
  4. function missingMaterialIcons(ids) {
  5. const icons = {}
  6. for (const id of ids) {
  7. for (const suffix of ['fill', 'outline', 'two-tone', 'round', 'sharp']) {
  8. const name = `${id}_${suffix}`
  9. icons[name] = {
  10. component: MaterialIcon,
  11. props: {
  12. name
  13. }
  14. }
  15. }
  16. }
  17. return icons
  18. }
  19. Vue.use(Vuetify, {
  20. // iconfont: 'md',
  21. icons: {
  22. ...missingMaterialIcons(['visibility', 'visibility_off'])
  23. // This will enable 'visibility_outline', 'visibility_off_round' and so on.
  24. }
  25. })

最后,你可以使用像这样的 material icons。

  1. <!-- using as a prop. Be careful of double and single quotation. -->
  2. <v-text-field
  3. label="password"
  4. :append-icon="
  5. pwShow
  6. ? '$visibility_outline'
  7. : '$visibility_off_outline'
  8. "
  9. @click:append="pwShow = !pwShow"
  10. :type="pwShow ? 'text' : 'password'"
  11. />
  12. <!-- using directly as an icon component -->
  13. <v-icon>$visibility_outline</v-icon>