前端组件库 ——Angular Material 知识点大全(二)

简介: 教程来源 https://www.amwtm.cn/ 本文详解 Angular Material 主题定制与核心组件:支持 Material Design 3(M3)调色板、动态 CSS 变量主题切换、多静态主题方案;涵盖 MatButton、表单控件、Toolbar/Card/Sidenav 布局、MatTable 数据表格及 MatDialog 对话框等实用用法。

三、主题定制

3.1 Material Design 3 (M3) 主题系统
Angular Material 的最新版本全面支持 Material Design 3(M3),引入了一套全新、更灵活的颜色系统。

与 M2 不同,M3 使用“调色板”和“色调”的概念来管理颜色,使颜色关系更清晰、主题定制更灵活。

示例:在 styles.scss 中自定义 M3 主题

@use '@angular/material' as mat;

html {
  // 定义自定义调色板颜色
  --my-brand-color: #7c3aed;   // 紫色
  --my-error-color: #ef4444;    // 红色

  @include mat.theme((
    color: (
      primary: mat.$violet-palette,
      tertiary: mat.$blue-palette,
    ),
    typography: Roboto,
    density: 0,
  ));
}

3.2 动态 CSS 变量主题
若要实现运行时动态切换主题(例如让用户自定义主色),可以使用第三方库 angular-material-css-vars。
安装:

npm i angular-material-css-vars -S

配置(styles.scss):

@use "angular-material-css-vars" as mat-css-vars;

@include mat-css-vars.init-material-css-vars();

配置(AppModule / app.config.ts):

import { provideMaterialCssVars } from "angular-material-css-vars";

export const appConfig: ApplicationConfig = {
  providers: [
    provideMaterialCssVars({
      isAutoContrast: true,
      primary: "#3f51b5",
    }),
  ],
};

运行时动态修改主题:

import { MaterialCssVarsService } from "angular-material-css-vars";

@Component({...})
export class ThemeService {
  constructor(private materialCssVarsService: MaterialCssVarsService) {}

  setTheme(color: string) {
    this.materialCssVarsService.setPrimaryColor(color);
  }

  toggleDarkMode() {
    this.materialCssVarsService.setDarkTheme(true);
  }
}

3.3 创建多套静态主题
对于需要支持多品牌主题的场景,可以通过在外层容器添加 CSS 类来实现:

@use '@angular/material' as mat;
@import '~@angular/material/theming';

// 定义浅色默认主题
$light-primary: mat-palette($mat-indigo);
$light-accent: mat-palette($mat-pink, A200, A100, A400);
$light-theme: mat-light-theme($light-primary, $light-accent);

@include angular-material-theme($light-theme);

// 定义深色备用主题
$dark-primary: mat-palette($mat-blue-grey);
$dark-accent: mat-palette($mat-amber, A200, A100, A400);
$dark-theme: mat-dark-theme($dark-primary, $dark-accent);

// 应用深色主题的容器类
.dark-theme {
  @include angular-material-theme($dark-theme);
}

在组件中使用:

<!-- 默认主题 -->
<mat-toolbar color="primary">...</mat-toolbar>

<!-- 深色主题 -->
<div class="dark-theme">
  <mat-toolbar color="primary">...</mat-toolbar>
</div>

四、核心组件详解

4.1 按钮组件(MatButton)
MatButton 提供了多种按钮变体:

<!-- 普通文字按钮 -->
<button mat-button>文本按钮</button>

<!-- 凸起按钮 -->
<button mat-raised-button color="primary">凸起按钮</button>

<!-- 扁平按钮 -->
<button mat-flat-button color="accent">扁平按钮</button>

<!-- 描边按钮 -->
<button mat-stroked-button>描边按钮</button>

<!-- 圆形图标按钮 -->
<button mat-fab color="warn">
  <mat-icon>edit</mat-icon>
</button>

<!-- 禁用状态 -->
<button mat-button disabled>禁用按钮</button>

color 属性说明:color 属性可以设置为 primary、accent、warn,这些值会映射到主题调色板中定义的颜色。

4.2 表单控件
Material 的表单控件需要与 mat-form-field 配合使用,以获得 Material Design 特有的边框、标签动画和错误提示效果。

<!-- 标准文本输入框 -->
<mat-form-field appearance="outline">
  <mat-label>用户名</mat-label>
  <input matInput placeholder="请输入用户名" [formControl]="usernameControl">
  <mat-icon matSuffix>person</mat-icon>  <!-- 后缀图标 -->
  <mat-error *ngIf="usernameControl.invalid">用户名不能为空</mat-error>
</mat-form-field>

<!-- 密码输入框 -->
<mat-form-field>
  <mat-label>密码</mat-label>
  <input matInput [type]="hide ? 'password' : 'text'" [formControl]="passwordControl">
  <button mat-icon-button matSuffix (click)="hide = !hide">
    <mat-icon>{
  {hide ? 'visibility_off' : 'visibility'}}</mat-icon>
  </button>
</mat-form-field>

<!-- 下拉选择器 -->
<mat-form-field>
  <mat-label>选择班级</mat-label>
  <mat-select [formControl]="classControl">
    <mat-option *ngFor="let class of classes" [value]="class.id">
      {
  {class.name}}
    </mat-option>
  </mat-select>
</mat-form-field>

<!-- 日期选择器 -->
<mat-form-field>
  <mat-label>出生日期</mat-label>
  <input matInput [matDatepicker]="picker" [formControl]="dateControl">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker #picker></mat-datepicker>
</mat-form-field>

appearance 属性说明:

fill(默认):填充样式,背景色填充

outline:边框样式,更现代的外框设计

standard:下划线样式

4.3 布局组件
工具栏(MatToolbar):

<mat-toolbar color="primary" class="main-header">
  <!-- 图标按钮 -->
  <button mat-icon-button>
    <mat-icon aria-label="菜单">menu</mat-icon>
  </button>

  <!-- 品牌名称 -->
  <span class="branding">学生管理系统</span>

  <!-- 弹性空间,将后续内容推到右侧 -->
  <span class="spacer"></span>

  <!-- 右侧内容 -->
  <button mat-button>学生列表</button>
  <button mat-button>数据统计</button>
</mat-toolbar>

CSS 样式:

.spacer {
  flex: 1 1 auto;
}

.main-header {
  position: relative;
  box-shadow: 0 1px 8px rgba(0, 0, 0, .3);
  z-index: 9;
}

卡片(MatCard):

<mat-card>
  <mat-card-header>
    <mat-card-title>学生信息</mat-card-title>
    <mat-card-subtitle>张三</mat-card-subtitle>
  </mat-card-header>
  <img mat-card-image src="avatar.jpg" alt="头像">
  <mat-card-content>
    <p>学号:2023001</p>
    <p>班级:高一(1)班</p>
  </mat-card-content>
  <mat-card-actions>
    <button mat-button>编辑</button>
    <button mat-button>删除</button>
  </mat-card-actions>
</mat-card>

侧边栏导航(MatSidenav):

<mat-sidenav-container>
  <mat-sidenav #sidenav mode="side" opened>
    <mat-nav-list>
      <a mat-list-item routerLink="/students">学生管理</a>
      <a mat-list-item routerLink="/classes">班级管理</a>
      <a mat-list-item routerLink="/statistics">数据统计</a>
    </mat-nav-list>
  </mat-sidenav>

  <mat-sidenav-content>
    <mat-toolbar>
      <button mat-icon-button (click)="sidenav.toggle()">
        <mat-icon>menu</mat-icon>
      </button>
      <span>学生管理系统</span>
    </mat-toolbar>
    <router-outlet></router-outlet>
  </mat-sidenav-content>
</mat-sidenav-container>

4.4 数据表格(MatTable)

<!-- 定义表格列 -->
<ng-container matColumnDef="name">
  <th mat-header-cell *matHeaderCellDef>姓名</th>
  <td mat-cell *matCellDef="let student">{
  {student.name}}</td>
</ng-container>

<ng-container matColumnDef="class">
  <th mat-header-cell *matHeaderCellDef>班级</th>
  <td mat-cell *matCellDef="let student">{
  {student.className}}</td>
</ng-container>

<ng-container matColumnDef="actions">
  <th mat-header-cell *matHeaderCellDef>操作</th>
  <td mat-cell *matCellDef="let student">
    <button mat-icon-button (click)="editStudent(student)">
      <mat-icon>edit</mat-icon>
    </button>
    <button mat-icon-button (click)="deleteStudent(student)">
      <mat-icon>delete</mat-icon>
    </button>
  </td>
</ng-container>

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
  <ng-container *ngFor="let col of displayedColumns" [matColumnDef]="col">
    <th mat-header-cell *matHeaderCellDef>{
  {col}}</th>
    <td mat-cell *matCellDef="let element">{
  {element[col]}}</td>
  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

<!-- 分页器 -->
<mat-paginator [length]="totalRecords" 
               [pageSize]="10" 
               [pageSizeOptions]="[5, 10, 20]"
               (page)="onPageChange($event)">
</mat-paginator>

配合*ngFor动态生成:

<!-- 循环生成多个卡片 [citation:3] -->
<div class="card-container">
  <mat-card *ngFor="let student of students">
    <mat-card-header>
      <mat-card-title>{
  {student.name}}</mat-card-title>
    </mat-card-header>
    <mat-card-content>
      <p>学号:{
  {student.studentNo}}</p>
      <mat-progress-bar mode="determinate" [value]="student.attendanceRate"></mat-progress-bar>
    </mat-card-content>
  </mat-card>
</div>

4.5 对话框(MatDialog)
对话框服务:

import { MatDialog } from '@angular/material/dialog';

export class StudentListComponent {
  constructor(private dialog: MatDialog) {}

  openStudentDialog(student?: Student): void {
    const dialogRef = this.dialog.open(StudentDialogComponent, {
      width: '500px',
      data: student || { id: null, name: '', classId: null }
    });

    dialogRef.afterClosed().subscribe(result => {
      if (result) {
        this.saveStudent(result);
      }
    });
  }
}

对话框组件:

import { Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';

@Component({
  selector: 'app-student-dialog',
  template: `
    <h2 mat-dialog-title>{
  {data.id ? '编辑学生' : '添加学生'}}</h2>
    <mat-dialog-content>
      <mat-form-field appearance="outline" class="full-width">
        <mat-label>姓名</mat-label>
        <input matInput [(ngModel)]="data.name">
      </mat-form-field>
      <mat-form-field appearance="outline" class="full-width">
        <mat-label>班级</mat-label>
        <mat-select [(ngModel)]="data.classId">
          <mat-option *ngFor="let class of classes" [value]="class.id">
            {
  {class.name}}
          </mat-option>
        </mat-select>
      </mat-form-field>
    </mat-dialog-content>
    <mat-dialog-actions align="end">
      <button mat-button (click)="onCancel()">取消</button>
      <button mat-raised-button color="primary" (click)="onSave()">保存</button>
    </mat-dialog-actions>
  `
})
export class StudentDialogComponent {
  constructor(
    public dialogRef: MatDialogRef<StudentDialogComponent>,
    @Inject(MAT_DIALOG_DATA) public data: Student
  ) {}

  onCancel(): void {
    this.dialogRef.close();
  }

  onSave(): void {
    this.dialogRef.close(this.data);
  }
}

来源:
https://amwtm.cn/

相关文章
|
2月前
|
人工智能 安全 Linux
阿里云OpenClaw镜像太香了!开箱即用、内置Skills、分钟级部署AI龙虾助理
阿里云OpenClaw镜像基于Alibaba Cloud Linux 3 LTS,开箱即用,阿里云龙虾官方部署链接:https://t.aliyun.com/U/vFiCUH 预装Docker、VS Code等工具及agent-browser等增强Skills,支持钉钉/飞书等多渠道集成与qwen3.5-plus等多模态模型,分钟级部署本地AI助理,安全稳定、计费可控。
276 4
|
2月前
|
SQL JSON 缓存
别再用过时的地区数据了!闸北区都消失了,教你一次性搞定省市区同步更新!(附实战源码)
本文记录了更新地区表至最新行政区划的完整实践:从权威数据源获取2024年省市区数据,通过Python脚本实现新旧表(省-市-区三级)精准比对,支持新增、软删除及层级关系维护,并附详细代码与分步缓存策略,兼顾准确性、安全性和可追溯性。(239字)
207 5
|
2月前
|
弹性计算 测试技术 数据库
阿里云服务器秒杀活动介绍:秒杀配置、价格、活动入口与秒杀策略
2026年阿里云服务器秒杀活动推出两款轻量应用服务器:2核2G配置38元1年,2核4G配置9.9元1个月、199元1年,每天10点和15点限量开抢。活动助力个人和中小企业优惠上云,服务器预装应用镜像,适合开发者、学生等快速搭建应用。秒杀规则严格,需提前准备。若秒杀失败或不符合条件,可考虑长效特惠方案,如99元/年的经济型e实例或199元/年的通用算力型u1实例。
|
2月前
|
SQL 关系型数据库 MySQL
EXPLAIN 执行计划:一眼看穿你的SQL慢在哪
数据库小学妹带你轻松掌握SQL性能诊断!通过EXPLAIN查看执行计划,精准识别索引失效、全表扫描(ALL)、key为NULL等瓶颈。聚焦type、key、rows等6个关键字段,结合实战案例与避坑指南(如函数滥用、最左前缀破坏),让优化有的放矢。学完即用,告别盲目调优!
|
2月前
|
人工智能 数据可视化 C++
OpenClaw 与 Hermes 全面对比与一键部署指南
2026年AI智能体爆发,OpenClaw(24小时在线秘书,适配钉钉/微信等,快速上手)与Hermes(自进化型助理,擅复杂任务与自主学习)成两大热门开源框架。本文深度对比+阿里云一键部署指南,助你零门槛启用AI Agent!
468 14
|
2月前
|
供应链 安全 Java
Java安全漏洞深潜——反序列化、Log4Shell与供应链攻击
由于Java广泛应用于银行、政府、大型企业,其安全性备受瞩目。然而近年来频频爆发的高危漏洞(Log4Shell、Spring4Shell、FastJSON反序列化等)敲响了警钟。
255 7
|
2月前
|
自然语言处理 数据挖掘 调度
《一套可复制的ClawHub专属工作流搭建完整指南》
本文纠正了多数人零散使用ClawHub技能的普遍误区,指出其核心价值并非单个工具的能力,而是作为生产力编排平台实现技能自由组合。作者基于两个月的深度实测与二十多个专属工作流的搭建经验,系统分享了任务原子化拆分、技能专一性匹配、统一中间数据格式、主从架构调度等核心方法,并以每日行业早报自动化工作流为例展示落地效果。文章最终提出,技能组合的终极意义是将个人经验固化为可重复执行的流程,实现生产力的指数级提升。
161 4
|
2月前
|
编解码 人工智能 API
HappyHorse(快乐小马)介绍指南:150亿参数量、Transformer单流架构,生成视频定价最低0.9元/秒
HappyHorse(快乐小马)是阿里ATH创新事业部研发的原生多模态AI视频生成大模型,2026年4月登顶全球Video Arena双榜。采用40层单流Transformer架构,首创音画联合生成技术,15B参数,支持1080P/3–15秒视频生成,单H100卡38秒出片,中文理解与人物一致性突出,已通过阿里云百炼、官网及千问App开放灰度测试。
2392 7
|
2月前
|
人工智能 JavaScript API
【简单操作】OpenClaw 2.6.2 环境搭建全流程指南
OpenClaw虾壳云版(v2.6.2)是一键式AI自动化工具安装包,专为Windows 10/11设计。全程可视化操作,内置Python/Node.js等全部依赖,5分钟极速部署,无需命令行与手动配置,新手友好。需关闭杀软以确保正常安装。
|
2月前
|
Oracle 关系型数据库 MySQL
MySQL 9.0数据库安装教程:自定义路径+密码配置(64位)
MySQL是Oracle旗下的流行关系型数据库,广泛用于Web应用。本文详解MySQL 9.0(64位)在Windows系统的安装与配置流程:从下载解压、管理员运行安装向导、自定义路径、设置root密码,到服务配置及命令行验证,步骤清晰,操作简便。(239字)