Angular Material 18+ 高级教程 – CDK Layout の Breakpoints
前言
CDK Layout 主要是用于处理 Breakpoints,它底层是依靠 window.matchMedia 来实现的。
Material Design 2 & 3 Breakpoints
Material Design 有对 Breakpoints 的规范,Angular CDK 依照的是 Material Design 2。
相关源码在 breakpoints.ts

没什么特别的,它就只是一个 Definition,不同 Viewport Size / Device 对应不同的 Media Query。
如果我们不喜欢 Material Design 2 的规范,我们自己也可以 Define 一个 Material Design 3 的 Breakpoints。
export const M3Breakpoints = {
Compact: '(max-width: 599.98px)',
Medium: '(min-width: 600px) and (max-width: 839.98px)',
Expanded: '(min-width: 840px) and (max-width: 1199.98px)',
Large: '(min-width: 1200px) and (max-width: 1599.98px)',
Extralarge: '(min-width: 1600px)',
PhoneInPortrait: '(max-width: 599.98px)',
TabletInPortrait: '(min-width: 600px) and (max-width: 839.98px)',
PhoneInLandscape: '(min-width: 840px) and (max-width: 1199.98px)',
TabletInLandscape: '(min-width: 840px) and (max-width: 1199.98px)',
DesktopSmall: '(min-width: 840px) and (max-width: 1199.98px)',
DesktopMedium: '(min-width: 1200px) and (max-width: 1599.98px)',
DesktopLarge: '(min-width: 1600px)',
};
MediaMatcher
MediaMatcher 是一个 Root Level Injector Service Provider。
它是 Angular CDK 对 window.mediaMatch 的封装。
源码在 media-matcher.ts

使用方式
export class AppComponent {
constructor() {
// 1. inject MediaMatcher
const mediaMatcher = inject(MediaMatcher);
// 2. match media query
const mediaQueryList = mediaMatcher.matchMedia('(max-width: 599.98px)');
// 3. 使用 MediaQueryList
const isMatched = mediaQueryList.matches;
mediaQueryList.addEventListener('change', () => {});
}
}
和 window.matchMedia 用法一模一样。
BreakpointObserver
BreakpointObserver 是一个 Root Level Injector Service Provider。

isMatched 方法
BreakpointObserver.isMatched 方法可以判断当前的 viewport 是否满足特定的 media query。
export class AppComponent {
constructor() {
// 1. inject BreakpointObserver
const breakpointObserver = inject(BreakpointObserver);
// 2. 判断当前 viewport 是否满足 media query
const matched1 = breakpointObserver.isMatched('(max-width: 599.98px)');
// 3. 判断当前 viewport 是否满足 Material Design 2 XSmall media query
const matched2 = breakpointObserver.isMatched(Breakpoints.XSmall);
// 4. 判断当前 viewport 是否满足 Material Design 3 Compact media query
const matched3 = breakpointObserver.isMatched(M3Breakpoints.Compact);
}
}
isMatched 还支持 multiple media query,只要其中一个 matched 就算 matched。
const matched3 = breakpointObserver.isMatched(
[
M3Breakpoints.Compact,
M3Breakpoints.Medium
]
);
传入一个 array 就可以了。
或者用 string join by 逗号也行
const matched5 = breakpointObserver.isMatched(`${M3Breakpoints.Compact}, ${M3Breakpoints.Medium}`);
逛源码

调用 _regsiterQuery 方法然后拿 mql.matches,我们继续看 mql 是什么
_regsiterQuery 方法

简而言之
const matched1 = breakpointObserver.isMatched('(max-width: 599.98px)');
const matched2 = window.matchMedia('(max-width: 599.98px)').matches;
这 2 句是等价的。
observe 方法
constructor() {
// 1. inject BreakpointObserver
const breakpointObserver = inject(BreakpointObserver);
// 2. 监听 media query
breakpointObserver.observe(
[
M3Breakpoints.Compact,
M3Breakpoints.Medium
]
).subscribe(({ breakpoints, matches }) => {
console.log('breakpoints', breakpoints);
console.log('matches', matches);
});
}
效果

observe 和 isMatched 用法大同小异,只有 2 个区别:
次数不同
isMatched 只判断当前 viewport 一次,而 observe 会一直监听 viewport (resize),然后每一次重新判断。
因此 isMatched 返回的是 boolean,而 observe 返回的是可监听的 RxJS Observable。
返回的 result 不同
当有你有 multiple media query 时,
isMatched 只能告诉你整体是 matched or not matched,你无法知道具体是哪一个 media query matched。
observe 除了告诉你整体是 matched or not matched,它还会返回一个对象,里面的 key 是 media query,value 是表示这个 media query 有没有 matched。

observe 源码我们就不逛,它底层实现方式是 window.matchMedia + addEventListener(''change),上一 part 逛源码时已经有看到一点了。
另外,subscribe observe 返回的 Observable 会立马触发一次,获得当下 viewport match media query result,这点和 window.matchMedia + addEventListener(''change) 不同哦。

总结
虽然它们只是对 window.matchMedia 的小封装,但还是鼓励大家用,尽量不要直接依赖 window 是顺风水的。
目录
上一篇 Angular Material 18+ 高级教程 – CDK Portal
下一篇 Angular Material 18+ 高级教程 – CDK Scrolling
想查看目录,请移步 Angular 18+ 高级教程 – 目录
喜欢请点推荐,若发现教程内容以新版脱节请评论通知我。happy coding
Angular Material 18+ 高级教程 – CDK Layout の Breakpoints的更多相关文章
- [转]VS Code 扩展 Angular 6 Snippets - TypeScript, Html, Angular Material, ngRx, RxJS & Flex Layout
本文转自:https://marketplace.visualstudio.com/items?itemName=Mikael.Angular-BeastCode VSCode Angular Typ ...
- Angular Material 教程之布局篇
Angular Material 教程之布局篇 (一) : 布局简介https://segmentfault.com/a/1190000007215707 Angular Material 教程之布局 ...
- Angular Material TreeTable Component 使用教程
一. 安装 npm i ng-material-treetable --save npm i @angular/material @angular/cdk @angular/animations -- ...
- Angular Material design设计
官网: https://material.io/design/ https://meterial.io/components 优秀的Meterial design站点: http://material ...
- Material使用11 核心模块和共享模块、 如何使用@angular/material
1 创建项目 1.1 版本说明 1.2 创建模块 1.2.1 核心模块 该模块只加载一次,主要存放一些核心的组件及服务 ng g m core 1.2.1.1 创建一些核心组件 页眉组件:header ...
- Angular 2 to Angular 4 with Angular Material UI Components
Download Source - 955.2 KB Content Part 1: Angular2 Setup in Visual Studio 2017, Basic CRUD applicat ...
- Siki_Unity_2-9_C#高级教程(未完)
Unity 2-9 C#高级教程 任务1:字符串和正则表达式任务1-1&1-2:字符串类string System.String类(string为别名) 注:string创建的字符串是不可变的 ...
- Angular Material Starter App
介绍 Material Design反映了Google基于Android 5.0 Lollipop操作系统的原生应用UI开发理念,而AngularJS还发起了一个Angular Material ...
- 关于 Angular引用Material出现node_modules/@angular/material/button-toggle/typings/button-toggle.d.ts(154,104): error TS2315: Type 'ElementRef' is not generic.问题
百度了好久 ,,,最后谷歌出来了.. 该错误可能来自于您将@ angular / material设置为6.0.0, 但所有其他Angular包都是5.x.您应该始终确保Material主要版本与An ...
- Angular Material & Hello World
前言 Angular Material(下称Material)的组件样式至少是可以满足一般的个人开发需求(我真是毫无设计天赋),也是Angular官方推荐的组件.我们通过用这个UI库来快速实现自己的i ...
随机推荐
- 【实操记录】MySQL二进制安装包部署
截至2023年11月2日,MySQL社区版最新版本是8.0.35,本文详细描述了采用二进制安装的各个步骤,具有较强的参考意义,基本可作为标准步骤实施. ■ 下载数据库介质 社区版的下载地址为oracl ...
- 编程好帮手:通义灵码(TONGYI Lingma),是阿里云出品的一款基于通义大模型的智能编码辅助工具
通义灵码(TONGYI Lingma),是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写.自然语言生成代码.单元测试生成.代码注释生成.代码解释.研发智能问答.异常报错排查 ...
- API网关实践-网易云轻舟微服务
微服务最佳实践中,我们需要通过统一的 API 网关进行服务能力的共享,API 网关为用户提供发布.管理.保护和监控 API的能力,帮助用户在自己的多个系统之间,或者内部系统与合作伙伴以及第三方的系统之 ...
- 如何在 XAMPP 中使用 不同的 PHP 版本?
你有没有碰到这种情况,你工作的项目需要的是PHP8,而你自己的项目需要的是PHP7,而你又特别钟爱于XAMPP,奈何它却不能自由切换PHP版本,下面就讲下本人在用的方法将PHP7更新到PHP8,可以通 ...
- thinkphp5 关于跨域的一些坑
1.首先在tp5的入口文件:public/index.php 在里面添加三行: // [ 应用入口文件 ] header("Access-Control-Allow-Origin:*&quo ...
- mysql大数据表添加字段
方案一.老表数据迁移四部曲方案1.新建老表t_order_goods的备份表t_order_goods_bak,同时加一个字段:isVirtual 并给默认值2.迁移老表t_order_goods数据 ...
- 【2024最新】4000字搞懂sora!一张脑图贯穿!
话不多说,上图! 下面就是对sora的具体阐释: Sora是OpenAI推出的一款革命性的视频生成模型,能够根据文本指令.静态图像或视频生成长达60秒的完整视频.这一模型基于扩散式模型和自注意力深度学 ...
- Python在linux系统和window系统相对路径导致找不到文件报错
文件路径 project1 -dir1 --test1.py -dir2 --test2.text -main.py test1.py from pathlib import Path "& ...
- java中使用jdbc连接数据库操作
先贴代码,在做说明 import java.sql.*; import java.util.ArrayList; import java.util.List; public class Conn { ...
- 解决Prism中对话框服务中对话框开启时回调函数不会触发的问题
解决办法 新建一个类DialogServiceExtend,然后在再注册 public class DialogServiceExtend : DialogService { public Dialo ...