Material Design Icons (MDI) — это один из основных наборов иконок, используемых в экосистеме Material Design. Библиотека содержит тысячи векторных иконок и широко применяется во фреймворках интерфейсов, включая Vuetify. Одним из способов использования MDI является SVG-формат, который обеспечивает высокую гибкость, масштабируемость и контроль над отображением иконок.
В Vuetify поддерживается несколько способов подключения иконок, однако использование SVG-версии MDI считается наиболее современным и функциональным подходом.
SVG (Scalable Vector Graphics) представляет собой векторный формат графики, основанный на XML. В отличие от шрифтовых иконок, SVG обладает рядом преимуществ:
Основные характеристики:
Использование SVG особенно важно в современных интерфейсах, где требуется:
В Vuetify поддерживается использование SVG-иконок через пакет
@mdi/js, который содержит пути
(path) для всех иконок Material Design.
npm install @mdi/js
В некоторых конфигурациях также используется пакет:
npm install @mdi/font
Однако для работы с SVG-иконками требуется именно
@mdi/js.
В Vuetify иконки настраиваются через конфигурацию при создании экземпляра приложения.
import { createVuetify } from 'vuetify'
import { aliases, mdi } from 'vuetify/iconsets/mdi-svg'
export const vuetify = createVuetify({
icons: {
defaultSet: 'mdi',
aliases,
sets: {
mdi
}
}
})
Пояснение параметров:
| Параметр | Назначение |
|---|---|
| defaultSet | набор иконок по умолчанию |
| aliases | псевдонимы для стандартных иконок Vuetify |
| sets | список подключенных наборов |
После настройки все компоненты Vuetify смогут использовать MDI SVG.
Основным компонентом для отображения иконок является
v-icon.
<v-icon icon="mdi-home"></v-icon>
Иконка будет автоматически отрисована через SVG.
<v-btn icon>
<v-icon icon="mdi-heart"></v-icon>
</v-btn>
Иконки часто применяются в:
<div>
<v-icon icon="mdi-account"></v-icon>
Профиль пользователя
</div>
Иногда требуется использовать SVG-путь напрямую из пакета
@mdi/js.
import { mdiAccount } from '@mdi/js'
Использование:
<v-icon :icon="mdiAccount"></v-icon>
Такой способ удобен при:
Размер SVG-иконок легко контролируется.
<v-icon icon="mdi-home" size="36"></v-icon>
<v-icon size="small">mdi-home</v-icon>
<v-icon size="large">mdi-home</v-icon>
<v-icon size="x-large">mdi-home</v-icon>
Цвет SVG-иконок управляется через CSS или свойства Vuetify.
<v-icon icon="mdi-alert" color="red"></v-icon>
<v-icon class="text-primary">mdi-home</v-icon>
.custom-icon {
color: #4CAF50;
}
<v-icon class="custom-icon">mdi-check</v-icon>
SVG-иконки легко трансформируются.
<v-icon style="transform: rotate(90deg)">
mdi-arrow-right
</v-icon>
<v-icon style="transform: scale(1.5)">
mdi-star
</v-icon>
Благодаря тому, что SVG является частью DOM, иконки можно анимировать.
.spin-icon {
animation: spin 2s linear infinite;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
Использование:
<v-icon class="spin-icon">
mdi-loading
</v-icon>
Vuetify позволяет добавлять собственные SVG-иконки.
import { createVuetify } from 'vuetify'
const customIcons = {
customLogo: {
component: {
template: `
<svg viewBox="0 0 24 24">
<path d="M12 2L2 22h20z"/>
</svg>
`
}
}
}
export default createVuetify({
icons: {
sets: {
custom: customIcons
}
}
})
Использование:
<v-icon icon="custom:customLogo"></v-icon>
Vuetify содержит систему alias, которая сопоставляет стандартные имена с MDI-иконками.
Пример:
<v-icon icon="$close"></v-icon>
Alias $close может быть сопоставлен с
mdi-close.
Иногда иконка определяется логикой приложения.
<v-icon :icon="isActive ? 'mdi-check' : 'mdi-close'"></v-icon>
computed: {
statusIcon() {
return this.online ? 'mdi-wifi' : 'mdi-wifi-off'
}
}
<v-icon :icon="statusIcon"></v-icon>
Большие наборы иконок могут увеличивать размер приложения. Для оптимизации применяются следующие методы.
import { mdiHome, mdiAccount, mdiEmail } from '@mdi/js'
Использование:
<v-icon :icon="mdiHome"></v-icon>
Современные сборщики (Vite, Webpack) удаляют неиспользуемый код, поэтому импорт отдельных иконок значительно уменьшает размер итогового бандла.
<v-list-item>
<template v-slot:prepend>
<v-icon icon="mdi-folder"></v-icon>
</template>
Документы
</v-list-item>
<v-text-field
label="Email"
prepend-inner-icon="mdi-email"
></v-text-field>
<v-app-bar>
<v-btn icon>
<v-icon icon="mdi-menu"></v-icon>
</v-btn>
</v-app-bar>
| Характеристика | SVG | Icon Font |
|---|---|---|
| Качество на любом масштабе | Да | Ограничено |
| Анимация | Полная поддержка | Ограничена |
| Управление цветами | Полное | Ограничено |
| Поддержка CSS | Полная | Частичная |
| Производительность | Высокая | Средняя |
По этим причинам SVG-иконки постепенно вытесняют шрифтовые наборы.
Причины:
mdi-svg@mdi/jsПроблема возникает, если в конфигурации Vuetify указан другой набор:
defaultSet: 'fa'
В этом случае MDI-иконки работать не будут.
Vuetify 2 и Vuetify 3 используют разные способы подключения иконок. При миграции проектов необходимо обновлять конфигурацию.
SVG-иконки MDI используются практически во всех элементах интерфейса:
Навигация
Интерактивные элементы
Информационные элементы
Полный список иконок Material Design Icons включает тысячи символов, среди которых:
Примеры популярных иконок:
mdi-home
mdi-account
mdi-heart
mdi-menu
mdi-email
mdi-settings
mdi-bell
mdi-check
mdi-close
mdi-alert
Каждая иконка представлена SVG-контуром, что обеспечивает точное отображение в интерфейсе независимо от размеров и плотности экрана.