[Angular Material完全攻略] Day 03 - MatIcon (及颜色配置介绍)

今天是第一天正式介绍Angular Material的相关元件,就让我们先从比较简单轻鬆的Icon来开始,虽然说是比较简单轻鬆,但其实裡面也是有不少学问的,透过今天的介绍,你会发现其实Angular Material提供的Icon元件也是非常强大的!

关于Material Design 的 Icon

在Material Design这套设计语言裡面,将Icon分成两类-产品Icon(Product Icon)和系统Icon(System Icon),Product Icon象徵著产品或服务的最主要门面,而System Icon则是系统或服务裡面的操作行为的识别。

产品Icon(Product Icon)

关于Icon的设计,其实是有非常多学问在裡面的,毕竟这会影响著一隻程式的识别度,好的Icon可以让人轻鬆把你的产品跟Icon连结在一起,不好的Icon只会让人遗忘掉产品的存在,而Material Design在产品Icon的设计上面,给了非常多的建议,不过我们毕竟不是视觉设计师,而是前端开发人员,而且产品Icon也不是Angular Material的重点,就不多作介绍,有兴趣的朋友可以去看看Material Design对于产品Icon的设计哲学跟建议,对于要设计产品Icon的朋友应该会很有帮助。

系统Icon(System Icon)

身为前端开发人员,我们可能没有办法过度的深入产品Icon的设计,但在前端操作上我们则有著很大的生杀大权(?),尤其在不是以设计美感为主的后台程式或是新的产品需要一个快速的概念验证时,前端人员对于画面的掌控性就相对大很多,而画面上的各种操作,有时候只需要一个简单的Icon就可以说明一切,例如我们只需要看到如下磁片的图示,就知道这代表著"存档"的意思

image.png

这种系统Icon对于前端的UI来说就至关重要,有时候一个好的系统Icon可以完整的说明系统的行为或状态,而不好的Icon加上没有适当的说明,就会让操作变得更不流畅;只要有了适当的Icon,平凡的网页就立刻有的不凡的生命力,可以说是现代化网页设计非常重要的一个环节啊!而关于系统Icon,在Google官方也推出了一系列超过900个系统Icons,提供给大家使用,也就是Material Icons

轻鬆一下

分享一个网路上看到的有趣图片,说明了磁片时代的眼泪,过去的存放资料的重要媒介,如今也只不过是个最常见的存档Icon而已了,虽然一样都很重要,但认知上已有了极大的落差。

关于Material Icons

Google本身已经提供了超过900个系统Icons,而且完全Open Source,要用这些Icon本身很简单,如果在前一天安装Angular Material时有做最后一步骤加入Material Icons的CDN,就已经具备了使用Material Icons的条件,我们可以在Material Icons官网上方的Search搜寻框中输入想要使用的icon, 就可以找到使用这个icon所需要的使用的语法

image.png

例如我想要寻找跟人有关的icon,可以在搜寻框中输入person,即可看到跟person有关的icons

image.png

接著点击想要放到网页上的icon,下方就会显示可以加入网页的方法,例如下载SVG或PNG档,或是使用我们接下来要介绍的Icon Font的方式:

image.png

如果看到想要加入一个人的图像,可以使用以下语法

<i class="material-icons">person</i>

我们只需要直接在程式中加入这段语法,就能够轻易的将icon加到画面上啦!

image.png

有了基本的Material Icon概念和了解系统Icon的使用方法,接下来我们就来看看Angular Material中对于使用Icon还能有些什麽灵活的变化吧!!

关于Angular Material的MatIcon

使用<i class="material-icons">person</i>的方式来显示Material Icon本身已经是一件很容易的事情,但对于像Angular这种以元件的方式来开发的情境上,这种HTML Tag就略显得不够语意化,因此Angular Material在显示Icon上另外提供了一个元件,也就是MatIcon。

在MatIcon中使用Material Icons

要使用MatIcon,首先必须加入MatIconModule到你的目前使用的Module裡面:

import { MatIconModule } from '@angular/material';

@NgModule({
  ...
  imports: [
    ...,
    MatIconModule],
  ...
})
export class AppModule {}

而MatIcon的基本语法很简单:

<mat-icon>person</mat-icon>

中间的person一样是Material Icons裡面可以选的icon名称,不同的是外面由<mat-icon>这个元件标籤包起来;虽然效果是完全一样的,但比起原来必须看到class="material-icons"才知道使用的是Material Icon,现在只要看到<mat-icon>就知道了,同时以Angular Material为基础设计出来的元件,也能够有比较多的Material Design相关变化。

例如预设的MatIcon会是我们加入的theme的文字颜色(currentColor),但我们可以很容易的透过color属性,来切换icon的颜色类型。

未来我们加入Angular Material相关的Module,除非特别说明否则都会在 @angular/material 中。

关于Angular Material的颜色简介

Material Design的System Color指南中,建议配色的选择为两种主要颜色(primary color)次要颜色(secondary color),用来区分主要的功能颜色及强调可以选择的画面,另外在表单相关的元件上还加上了错误讯息(error message)的颜色,而在Angular Material的样式中将这三种颜色名称分别订为primaryaccentwarn

在大部分的Angular Material提供的元件中,我们都可以透过color来切换这三种颜色,以MatIcon为例

<div>
  这是一般的ICON颜色
  <mat-icon>person</mat-icon>
</div>

<div>
  这是加上primary颜色的ICON
  <mat-icon color="primary">thumb_up</mat-icon>
</div>

<div>
  这是加上accent颜色的ICON
  <mat-icon color="accent">info</mat-icon>
</div>

<div>
  这是加上warn颜色的ICON
  <mat-icon color="warn">warning</mat-icon>
</div>

结果如下图:

image.png

当然我们还是可以透过设定css来切换成不同的颜色,不过在设计上这种事情则需要尽量避免,在Material Design的建议中,除了文字颜色和背景颜色以外,主要就这三种颜色了,适当的搭配使用这三种颜色,可以让画面不至发生于颜色大爆炸,也能保持简单大方的设计样式,让使用者在操作时也不容易被颜色搞混,可以说是很重要的观念!

使用MatIconRegistry扩充

MatIcon除了能够直接使用Material Icon以外,我们还能够过MatIconRegistry来扩充能够使用的Icons;MatIconRegistry具有两个功能,一个是直接在MatIcon中加入SVG图档,另外一个则是支援使用其他的Icon Font,这在我们所需要的Icon超出Material Icon提供的范围时非常实用,同时又能保持使用一致的MatIcon元件来显示画面。

在MatIcon中使用SVG

在这边我们使用颜色单纯的SVG图片作为范例,图片来源来自Angular官方网站的Press Kit

先将这张图片下载到我们专案目录的src/asset/imges资料夹中

image.png

接著注入MatIconRegisteryDomSanitizer,由于SVG icon是在程式中透过路径载入,为了避免XSS的问题,必须透过Angular提供的DomSanitizer service来信任这个路径,如果你的图片放在网路上的其他来源,同时还需要注意cors的问题,不过这已经超出这次介绍的范围,就不多做说明。

import { Component, OnInit } from '@angular/core';
import { MatIconRegistry } from '@angular/material';
import { DomSanitizer } from '@angular/platform-browser';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'app';

  constructor(private matIconRegistry: MatIconRegistry, private domSanitizer: DomSanitizer) {}

  ngOnInit() {}
}

另外为了能够在程式中下载这张图片扩充为我们的icon,还需要再加入HttpClientModule,加入方法也已经是基本知识,就不多说明萝。

接著我们就可以透过MatRegistery来扩充SVG icon啦!

this.matIconRegistry.addSvgIconInNamespace(
  'custom-svg',
  'angular',
  this.domSanitizer.bypassSecurityTrustResourceUrl('assets/images/angular_solidBlack.svg'));

MatIconRegistery.addSvgIconInNamespace有三个参数:

  • namespace:icon的namespace,方便用来分类不同的icons,也能够避免名称衝突
  • iconName:给予这个icon一个名称
  • url:一个安全的图片来源

加入这个设定后,我们就可以直接在画面中使用这个icon啦!更棒的是,只要svg icon裡面没有特别设定任何颜色的话,我们还能够过color属性来直接调整我们的svg icon的颜色!

加入svg icon可以透过MatIcon的svgIcon属性来设定,必须依照[namespace]:[iconName]的方式来指定:

<h2>自行注册SVG icon</h2>

<div>
    <mat-icon svgIcon="custom-svg:angular"></mat-icon>
    <mat-icon svgIcon="custom-svg:angular" color="primary"></mat-icon>
    <mat-icon svgIcon="custom-svg:angular" color="accent"></mat-icon>
    <mat-icon svgIcon="custom-svg:angular" color="warn"></mat-icon>
</div>

结果如下:

image.png

在MatIcon中使用其他Icon Font

除了自订svg icon以外,网路上也有许多现成的icon font可以使用,例如知名的FontAwesomeIonIcons等等,使用方式基本上大同小异,而我们也能够很轻易的将这些icon font纳入MatIcon之中,让画面上的程式码更加一致!

以FontAwesome为例,我们可以先在index.html中加入FontAwesome的CDN:

<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">

在写这系列文章前没多久FontAwesome其实刚升上第5版,但使用上会稍有不同,为了教学方便,还是使用第4版做范例,不过纳入MatIcon的方式是完全一样的。

接著一样可以透过MatIconRegistery的方式加入

this.matIconRegistry.registerFontClassAlias('fontawesome', 'fa');

MatIconRegistery.registerFontClassAlias有两个参数:

  • alias:原来icon font class的别名,例如FontAwesome都会在class裡面加上fa之后才加上fa-*,这裡要设定的就是fa的别名。
  • className:原来icon font的主要class,以FontAwesome来说也就是fa

接著我们就可以使用MatIcon来显示FontAwesome,同时享受MatIcon的功能啦!

使用Icon Font需要设定两个属性,分别是fontSet代表刚才注册的alias,以及fontIcon代表真正要使用的icon class。

<h2>在MatIcon中使用FontAwesome</h2>

<div>
  <!-- 就是<i class="fa fa-thumbs-up">的概念 -->
  <mat-icon fontSet="fontawesome" fontIcon="fa-thumbs-up"></mat-icon>
  <mat-icon fontSet="fontawesome" fontIcon="fa-thumbs-up" color="primary"></mat-icon>
  <mat-icon fontSet="fontawesome" fontIcon="fa-thumbs-up" color="accent"></mat-icon>
  <mat-icon fontSet="fontawesome" fontIcon="fa-thumbs-up" color="warn"></mat-icon>
</div>

成果如下:

image.png

小提示1:FontAwesome提供了许多除了显示icon以外的class,例如让icon旋转的fa-spin等等,我们一样可以透过class="fa-spin"的方式加入。

小提示2:使用这种方式虽然具有一致性的效果,不过对于开发来说则未必是好事,尤是我们常常仰赖工具的code snippets时,这种语法反而会阻碍了我们原来的习惯,至于该如何选择就看个人喜好萝。

本日小结

今天我们认识了Material Design中的Icon设计哲学,以及身为前端开发人员最常使用的系统Icon使用方式,学到了Material Icon的使用方式。

而在Angular Material中我们能够透过MatIcon来帮助我们统一管理这些icons,让view上的语法呈现更加一致明确

同时我们也简单认识了Material Desing基本的配色概念,以及了解到Angular Material中使用这些颜色的方式。

MatIcon本身的能力也超过了Material Icon的范围,除了用来产生现有的Material Icons以外,我们也能自行加入SVG图档来当作icon显示,更方便的是我们还能把其他网路上知名的Icon Font样式一併套进来,通通使用MatIcon的方式进行管理,非常的方便及强大。

适度地替系统加上Icon能达到画面更简洁,但操作却更清楚的效果,把这些使用方式都学会,就能轻易的在画面上加入各种的icons啦!

本日的程式码GitHub:https://github.com/wellwind/it-ironman-demo-angular-material/tree/day-03-mat-icon
分支:day-03-mat-icon

相关资源


本文章转载自: https://wellwind.idv.tw/blog/2017/12/21/angular-material-03-icon/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容