添加自定义图标
自定义图标以独立 SVG 文件、SVG 精灵图(Sprite)或图标字体的形式添加。
选择格式
| 格式 | 最适合 | 特点 |
|---|---|---|
独立 SVG 文件 |
少量自定义图标 |
每个图标存储在单独的文件中。浏览器只加载 UI 中使用的图标。 |
SVG 精灵图 |
一组自定义图标 |
多个图标作为符号存储在一个文件中,并通过标识符选择。 |
图标字体 |
已有的基于字体的图标库 |
需要字体文件和 CSS 配置。图标通过 CSS 类、连字或字符代码选择。 |
有关使用属性、XML 元素或 Java 配置图标的信息,请参见 使用图标。
独立 SVG 文件
SVG 文件可以添加到静态内容目录中。默认情况下,Spring Boot 从类路径中的以下位置提供静态资源:/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 精灵图:
-
在
/frontend/icons/目录中为图标集创建一个 JavaScript 文件。以下代码定义了一个包含三个图标的 sprite: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
还可以从 Google Fonts 在线加载 Material Icons,而不是将字体文件存储在本地。此选项要求用户的浏览器能够通过网络访问 Google Fonts。
从主题的 styles.css 中移除对 material/material-icons.css 的导入,改为添加以下导入:
@import url("https://fonts.googleapis.com/css2?family=Material+Icons&display=swap");
导入的 Google Fonts 样式表提供了 Material Icons 的 @font-face 声明和 CSS 类,因此不需要本地字体文件或额外的 @font-face 声明。