Добавление собственных иконок
Собственные иконки можно добавить как отдельные SVG-файлы, SVG-спрайты или иконочные шрифты.
Выбор формата
| Формат | Подходит для | Характеристики |
|---|---|---|
Отдельные SVG-файлы |
Небольшое количество собственных иконок |
Каждая иконка хранится в отдельном файле. Браузер загружает только те иконки, которые используются в UI. |
SVG-спрайт |
Набор собственных иконок |
Несколько иконок хранятся как символы в одном файле и выбираются по идентификаторам. |
Иконочный шрифт |
Готовая библиотека иконок на основе шрифта |
Требует файлов шрифта и настройки CSS. Иконки выбираются с помощью CSS-классов, лигатур или кодов символов. |
О размещении иконок с помощью атрибутов, вложенных элементов или Java см. Использование иконок.
Отдельные SVG-файлы
SVG-файлы можно добавить в каталог статического содержимого. По умолчанию Spring Boot предоставляет статические ресурсы из следующих каталогов в classpath: /static, /public, /resources или /META-INF/resources. Для организации иконок можно использовать подкаталог, например META-INF/resources/icons.
Чтобы отобразить SVG-файл, используйте компонент svgIcon:
<svgIcon resource="/icons/tree.svg"/>
SVG-иконку также можно создать программно:
SvgIcon treeIcon = new SvgIcon();
treeIcon.setSrc(DownloadHandler.forClassResource(
getClass(),
"/META-INF/resources/icons/tree.svg",
"tree.svg"
));
standaloneIconButton.setIcon(treeIcon);
SVG-спрайты
SVG-спрайт — набор изображений, которые хранятся как символы в одном SVG-файле. У каждого символа есть идентификатор для выбора соответствующей иконки.
Чтобы добавить SVG-спрайт:
-
Создайте JavaScript-файл набора иконок в каталоге
/frontend/icons/. Следующий код определяет спрайт из трёх иконок:my-icons.jsimport '@vaadin/icon/vaadin-iconset.js'; const template = document.createElement('template'); template.innerHTML = `<vaadin-iconset name="my-icons" size="24"> <svg><defs> <g id="star"><path d="M12 .587l3.668 7.568 8.332 1.207-6 5.848 1.416 8.263L12 18.896l-7.416 3.895L6 14.162l-6-5.848 8.332-1.207z" fill="#FFD700"/></g> <g id="heart"><path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" fill="#FF69B4"/></g> <g id="circle"><circle cx="12" cy="12" r="10" fill="#1E90FF"/></g> </defs></svg> </vaadin-iconset>`; document.head.appendChild(template.content); -
Создайте Java-перечисление, реализующее
IconFactory, и добавьте аннотацию@JsModuleсо ссылкой на JavaScript-файл:MyIcons.javapackage com.company.onboarding.icons; import com.vaadin.flow.component.dependency.JsModule; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.IconFactory; import java.util.Locale; @JsModule("./icons/my-icons.js") public enum MyIcons implements IconFactory { STAR, HEART, CIRCLE; public Icon create() { return new Icon("my-icons", name().toLowerCase(Locale.ENGLISH).replace('_', '-')); } }
После регистрации набора укажите иконку с помощью имени набора и идентификатора символа:
<icon icon="my-icons:star"/>
<icon icon="my-icons:heart"/>
<icon icon="my-icons:circle"/>
Или создайте иконку программно:
spriteIconButton.setIcon(MyIcons.STAR.create());
Иконочные шрифты
Иконочный шрифт — набор иконок, поставляемый как шрифт. Иконки отображаются как символы этого шрифта.
| После добавления собственного иконочного шрифта его можно использовать для замены стандартных иконок приложения. Подробнее см. Замена стандартных иконок. |
Для добавления иконочного шрифта потребуются:
-
Один или несколько файлов шрифта — обычно
.woff2и при необходимости резервные форматы.woff,.ttfили.otf. -
Глобальное объявление
@font-face— обычно оно находится в файле стилей, который импортируется в основной файл стилей темы (styles.css). -
При необходимости файл стилей с CSS-классами иконок — обычно он добавляется вместе с объявлением
@font-faceи также импортируется вstyles.css.
Добавление шрифта Material Icons
В этом примере показано, как добавить шрифт Material Icons в тему приложения.
Использование локальных файлов шрифта
Чтобы использовать Material Icons без внешнего сервиса, создайте подкаталог material в каталоге активной темы приложения.
Добавьте следующие файлы:
-
material-icons.woff2 -
material-icons.woff -
material-icons.ttf -
material-icons.css— содержит объявление@font-faceи CSS-класс иконок:material-icons.css@font-face { font-family: "Material Icons"; font-style: normal; font-weight: 400; font-display: block; src: url("./material-icons.woff2") format("woff2"), url("./material-icons.woff") format("woff"), url("./material-icons.ttf") format("truetype"); } .material-icons { font-family: "Material Icons"; font-weight: normal; font-style: normal; font-size: 24px; line-height: 1; letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; word-wrap: normal; direction: ltr; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; font-feature-settings: "liga"; }
Браузер использует первый поддерживаемый формат шрифта. Поэтому каждый файл шрифта, объявленный в src, должен быть загружен и расположен рядом с material-icons.css.
Импортируйте файл в основной файл стилей темы:
@import url('material/material-icons.css');
Использование Google Fonts
Material Icons можно загружать из Google Fonts, не сохраняя файлы шрифта в приложении. Для этого браузерам пользователей нужен сетевой доступ к Google Fonts.
Удалите импорт material/material-icons.css из файла styles.css темы и добавьте вместо него следующий импорт:
@import url("https://fonts.googleapis.com/css2?family=Material+Icons&display=swap");
Импортированный файл стилей Google Fonts содержит объявление @font-face и CSS-класс Material Icons, поэтому локальные файлы шрифта и дополнительное объявление @font-face не требуются.
Использование иконок шрифта
После настройки шрифта любым из способов создайте иконку с помощью компонента fontIcon.
В зависимости от шрифта и его файлов стилей компонент fontIcon может определять иконку двумя способами:
-
Лигатура, например
calendar, заданная атрибутомligature. Для этого шрифт должен поддерживать лигатуры. -
Шестнадцатеричный код символа, например
f199, заданный атрибутомcharCode.В следующем примере показаны оба способа:
<fontIcon fontFamily="Material Icons" ligature="search"/> <fontIcon fontFamily="Material Icons" charCode="e8b6"/>