如何在 Angular Material 中使用自定义 SVG 图标

简介: 如何在 Angular Material 中使用自定义 SVG 图标

简介

Angular Material 库提供了一套使用 Material Design 样式的 Angular 组件。其中之一是 组件。有许多现成的 Material 图标。但如果我们想在保持 Material Design 样式一致的同时显示一些自定义图标怎么办?让我们学习如何在 Angular Material 组件中使用自定义 SVG 图标。

在本教程中,您将使用 组件来使用标准的 Material Icons 字体。然后,您将使用 组件来支持自定义 SVG 图标。

完整的可工作代码可以在这个 GitHub 仓库中找到。

先决条件

要完成本教程,您需要:

  • 本地安装了 Node.js,您可以按照《如何安装 Node.js 并创建本地开发环境》进行操作。

本文假设您对 Angular v4.2+ 有一些基本知识。

本教程最初是使用 Angular v5.2+ 和 Angular Material v5.2.4 编写的。

本教程已经验证过可以在 Angular v10.0.5 和 Angular Material v10.1.1 上运行。

如果您刚开始使用 Angular Material,可以参考本文。

步骤 1 —— 创建 Angular 项目并安装依赖项

首先,打开您的终端并创建一个新的项目目录:

mkdir angular-material-custom-svg

接下来,进入新目录:

cd angular-material-custom-svg

然后,使用 npm 安装 Angular CLI 作为 devDependency

npm install @angular/cli@10.0.4 --save-dev

现在,您可以使用 Angular CLI 创建一个新的 Angular 项目,并为本教程的需要设置一些选项:

ng new angular-material-custom-svg --directory=. --skipTests=true --routing=false --style=css

这样就在当前目录中得到了一个全新的 Angular 项目。让我们使用以下命令安装 Angular Material 及其依赖项:

npm install @angular/material@10.1.1 @angular/cdk@10.1.1 --save

这样就完成了教程项目的设置。现在我们可以继续在项目中使用 Material 图标。

步骤 2 —— 使用 显示图标字体

要使用默认的 Material 图标,您首先需要在全局样式表中导入它们。为此,请打开由 Angular CLI 生成的 styles.css 文件:

nano src/styles.css

用以下 import 语句替换文件的内容:

@import url("https://fonts.googleapis.com/icon?family=Material+Icons");

接下来,您需要导入 MatIconModule。打开 app.module.ts 文件:

nano src/app.module.ts

然后,添加 MatIconModuleimport

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { MatIconModule } from "@angular/material/icon";

并将其添加到模块的 imports 数组中:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    MatIconModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})

现在,您可以使用 组件显示内置的 Material 图标。如果您添加图标的文本名称,它将显示关联的图标字形。

对于我们的教程,我们将添加 "mood" 图标(这类似于带笑脸的符号):

!Material 图标字形的 mood

Material Design 网站上有一个完整的 Material 图标列表,您可以直接使用。

打开 app.component.html 文件:

nano src/app/app.component.html

用以下代码替换文件的内容:

<mat-icon>mood</mat-icon>

让我们来看看我们到目前为止做了什么!启动应用程序:

ng serve

在您的 Web 浏览器中查看应用程序(localhost:4200),您将看到 "mood" 图标。

这样就完成了使用 显示图标字体。我们现在可以继续使用 显示 SVG。

步骤 3 —— 使用 显示 SVG

让我们向项目中添加一个自定义 "unicorn" 图标。

将图标保存为 unicorn_icon.svg,并放到项目的 src/assets 文件夹中。

要使用我们的自定义 unicorn 图标与 组件标签一起,我们需要导入 HttpClientModule

打开 app.module.ts 文件:

nano src/app/app.module.ts

然后,添加 HttpClientModuleimport

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { MatIconModule } from "@angular/material/icon";
import { HttpClientModule } from "@angular/common/http";

并将其添加到模块的 imports 数组中:

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    MatIconModule,
    HttpClientModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})

现在,我们可以使用 Angular Material 提供的 MatIconRegistry 服务注册我们的自定义 "unicorn" 图标。

打开 app.component.ts

nano src/app/app.component.ts

然后,添加 MatIconRegistryimport

import { Component } from "@angular/core";
import { MatIconRegistry } from "@angular/material/icon";

并将该服务注入到组件中:

export class AppComponent{
  constructor(private matIconRegistry: MatIconRegistry){
    // ...
  }
}

在组件的 constructor 方法中添加 addSvgIcon 方法:

export class AppComponent{
  constructor(private matIconRegistry: MatIconRegistry){
    this.matIconRegistry.addSvgIcon(
      `icon_label`,
      `path_to_custom_icon.svg`
    );
  }
}

addSvgIcon 方法通过两个参数注册我们的图标。

第一个参数是图标标签,类型为 string

第二个参数是指向图标文件位置的相对 URL 路径。

这个 URL 路径字符串的类型是 SafeResourceUrl。为了将 URL 路径字符串解析为 SafeResourceUrl,我们可以使用 Angular 提供的 DomSanitizer

接下来,添加 DomSanitizerimport

import { Component } from "@angular/core";
import { MatIconRegistry } from "@angular/material/icon";
import { DomSanitizer } from "@angular/platform-browser";

并将该服务注入到组件中:

export class AppComponent{
  constructor(
    private matIconRegistry: MatIconRegistry,
    private domSanitizer: DomSanitizer
  ){
    this.matIconRegistry.addSvgIcon(
      `icon_label`,
      `path_to_custom_icon.svg`
    );
  }
}

给定一个相对 URL 路径字符串,DomSanitizer 上的 bypassSecurityTrustResourceUrl 方法将返回一个安全的资源 URL,这是 addSvgIcon 方法所需的。

现在,您可以将icon_label替换为自定义的 "unicorn" 标签。将 path_to_custom_icon.svg 替换为自定义的 "unicorn_icon.svg" 图标。

让我们更新 addSvgIcon 中的行:

export class AppComponent{
  constructor(
    private matIconRegistry: MatIconRegistry,
    private domSanitizer: DomSanitizer
  ){
    this.matIconRegistry.addSvgIcon(
      "unicorn",
      this.domSanitizer.bypassSecurityTrustResourceUrl("../assets/unicorn_icon.svg")
    );
  }
}

现在,自定义的 "unicorn" 图标已经正确注册到 MatIconRegistry 服务中。

要显示自定义图标,您需要更新组件的模板。打开 app.component.html

nano src/app/app.component.html

并将图标标签传递给 svgIcon 输入属性:

<mat-icon svgIcon="unicorn"></mat-icon>

让我们来看看您到目前为止做了什么!启动应用程序:

ng serve

在您的 Web 浏览器中查看应用程序(localhost:4200),您将看到自定义图标以 Material 样式显示。

现在,您可以在应用程序中使用 Material 样式显示一整套自定义图标。

为了使代码更清晰、更易维护,我们可以通过将 MatIconRegistry 移入一个服务类来重构代码。

结论

在本教程中,您已经完成了对使用 Angular Material 的 组件与 Material Icons 字体和自定义 SVG 的初步探索。这为您提供了一种在应用程序中保持一致地遵循 Material Design 样式的方法。


目录
相关文章
|
4月前
|
前端开发 开发者 开发框架
JSF与Bootstrap,打造梦幻响应式网页!让你的应用跨设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,响应式设计至关重要,以确保不同设备上的良好用户体验。本文探讨了JSF(JavaServer Faces)与Bootstrap框架的结合使用,展示了如何构建响应式网页。JSF是一个基于Java的Web应用框架,提供丰富的UI组件和表单处理功能;而Bootstrap则是一个基于HTML、CSS和JavaScript的前端框架,专注于实现响应式设计。通过结合两者的优势,开发者能够更便捷地创建自适应布局,提升Web应用体验。然而,这种组合也有其局限性,如JSF组件库较小和较高的学习成本等,因此在选择开发框架时需综合考虑具体需求和应用场景。
56 0
|
4月前
|
前端开发 开发者 C#
深度解析 Uno Platform 中的 MVVM 模式:从理论到实践的全方位指南,助你轻松掌握通过 C# 与 XAML 构建高效可维护的跨平台应用秘籍
【8月更文挑战第31天】本文详细介绍如何在优秀的跨平台 UI 框架 Uno Platform 中实施 MVVM(Model-View-ViewModel)模式,通过一个简单的待办事项列表应用演示其实现过程。MVVM 模式有助于分离视图层与业务逻辑层,提升代码组织性、易测性和可维护性。Uno Platform 的数据绑定机制使视图与模型间的同步变得高效简便。文章通过构造 `TodoListViewModel` 类及其相关视图,展示了如何解耦视图与模型,实现动态数据绑定及命令处理,从而提高代码质量和开发效率。通过这一模式,开发者能更轻松地构建复杂的跨平台应用。
63 0
|
4月前
|
JavaScript 前端开发
如何在 Angular 中为响应式表单创建自定义验证器
如何在 Angular 中为响应式表单创建自定义验证器
33 0
|
4月前
|
JavaScript
如何在自定义 Angular 指令中使用 @HostBinding 和 @HostListener
如何在自定义 Angular 指令中使用 @HostBinding 和 @HostListener
44 0
|
4月前
在Angular中创建自定义管道
在Angular中创建自定义管道
19 0
|
4月前
|
JavaScript
如何使用 ControlValueAccessor 在 Angular 中创建自定义表单控件
如何使用 ControlValueAccessor 在 Angular 中创建自定义表单控件
27 0
|
JavaScript 定位技术
Angular1.x入门级自定义组件(导航条)
Angular1.x入门级自定义组件(导航条)
|
JavaScript 前端开发 API
让Angular自定义组件支持form表单验证
让Angular自定义组件支持form表单验证
167 0
|
4月前
|
API 开发者 UED
PrimeFaces:JSF的魔法衣橱,解锁UI设计的无限可能!
【8月更文挑战第31天】本文介绍如何结合 JSF(JavaServer Faces)和 PrimeFaces 构建美观且功能强大的现代用户界面。PrimeFaces 提供丰富的 UI 组件库,包括按钮、输入框、数据网格等,支持现代 Web 标准,简化界面开发。文章通过具体示例展示如何使用 `&lt;p:inputText&gt;` 和 `&lt;p:calendar&gt;` 等组件创建用户表单,并用 `&lt;p:dataTable&gt;` 展示数据集合,提升 JSF 应用的易用性和开发效率。
70 0
|
4月前
|
开发者 安全 SQL
JSF安全卫士:打造铜墙铁壁,抵御Web攻击的钢铁防线!
【8月更文挑战第31天】在构建Web应用时,安全性至关重要。JavaServer Faces (JSF)作为流行的Java Web框架,需防范如XSS、CSRF及SQL注入等攻击。本文详细介绍了如何在JSF应用中实施安全措施,包括严格验证用户输入、使用安全编码实践、实施内容安全策略(CSP)及使用CSRF tokens等。通过示例代码和最佳实践,帮助开发者构建更安全的应用,保护用户数据和系统资源。
62 0
下一篇
DataWorks