如何使用AngularCDK检测断点

来自菜鸟教程
跳转至:导航、​搜索

介绍

Angular CDK 有一个布局包,其中包含检测视口大小和匹配媒体查询的服务。 这使您可以完全控制 UI 并适应不同的屏幕尺寸。

在本文中,您将在 Angular 项目中应用 CDK 的布局模块。

先决条件

如果您想继续阅读本文,您将需要:

  • Node.js 安装在本地,您可以按照【X57X】如何安装Node.js 并创建本地开发环境【X126X】进行。
  • 本教程还将假设您已全局安装 @angular/cli
  • CSS 媒体查询 有一定的了解。

本教程已使用 Node v16.6.1、npm 7.20.3、@angular/core v12.2.0 和 @angular/cdk v12.2.0 进行了验证。

设置项目

您可以使用 @angular/cli 创建一个新的 Angular 项目。

在您的终端窗口中,使用以下命令:

ng new AngularBreakpointsExample --style=css --routing=false --skip-tests

这将配置一个新的 Angular 项目,其样式设置为“CSS”(与“Sass”、“Less”或“Stylus”相对)、无路由和跳过测试。

导航到新创建的项目目录:

cd AngularBreakpointsExample

接下来,安装 @angular/cdk

npm install @angular/cdk@12.2.0

然后导入布局模块并将其添加到 NgModule 的导入列表中:

src/app/app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { LayoutModule } from '@angular/cdk/layout';

import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    LayoutModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

您现在可以开始使用组件中的可用服务和实用程序。 让我们讨论它们中的每一个。

使用 BreakpointObserver.observeBreakpointState

observe 方法返回一个 BreakpointState 类型的可观察对象,可用于观察视口何时在匹配媒体查询之间发生变化。

这是一个示例,如果视口大小在小于 500 像素和等于或大于 500 像素之间发生变化,则会将消息记录到控制台:

src/app/app.component.ts

import { Component, OnInit } from '@angular/core';
import {
  BreakpointObserver,
  BreakpointState
} from '@angular/cdk/layout';

@Component({ 
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  constructor(public breakpointObserver: BreakpointObserver) {}
  
  ngOnInit() {
    this.breakpointObserver
      .observe(['(min-width: 500px)'])
      .subscribe((state: BreakpointState) => {
        if (state.matches) {
          console.log('Viewport width is 500px or greater!');
        } else {
          console.log('Viewport width is less than 500px!');
        }
      });
  }
}

注意: 您可能还需要从 app.component.html 中删除 模板:Title 以防止出错。


BreakpointState 接口为我们提供了一个名为 matches 的布尔属性。

使用 Breakpoints

除了使用手写的媒体查询,我们还可以使用 Breakpoints 对象,它为我们提供了常用断点的键:

src/app/app.component.ts

import { Component, OnInit } from '@angular/core';
import {
  BreakpointObserver,
  Breakpoints,
  BreakpointState
} from '@angular/cdk/layout';

@Component({ 
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  constructor(public breakpointObserver: BreakpointObserver) {}

  ngOnInit() {
    this.breakpointObserver
      .observe([Breakpoints.Small, Breakpoints.HandsetPortrait])
      .subscribe((state: BreakpointState) => {
        if (state.matches) {
          console.log(
            'Matches small viewport or handset in portrait mode'
          );
        }
      });
  }
}

此示例使用 Breakpoints.SmallBreakpoints.HandsetPortrait 的预定义断点。

使用 BreakpointObserver.isMatched

对于一次性匹配,我们可以使用 isMatching method 代替。

src/app/app.component.ts

import { Component, OnInit } from '@angular/core';
import {
  BreakpointObserver,
  BreakpointState
} from '@angular/cdk/layout';

@Component({ 
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  constructor(public breakpointObserver: BreakpointObserver) {}

  ngOnInit() {
    if (this.breakpointObserver.isMatched('(min-height: 40rem)')) {
      console.log('Viewport has a minimum height of 40rem!');
    }
  }
}

如果组件初始化时视口至少有 40rem 高,这将记录一条消息。

使用 MediaMatcher

MediaMatcher 是一种围绕 JavaScript 的 matchMedia 的服务。 与 BreakpointObserver.observe 一样,它也可以用于观察视口大小对给定媒体查询的变化。

这是一个检查 min-width 是否为 500px 宽的示例:

src/app/app.component.html

import { Component, OnInit, OnDestroy } from '@angular/core';
import { MediaMatcher } from '@angular/cdk/layout';

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

  constructor(public mediaMatcher: MediaMatcher) {}

  ngOnInit() {
    this.matcher = this.mediaMatcher.matchMedia('(min-width: 500px)');

    this.matcher.addEventListener('change', this.myListener);
  }

  ngOnDestroy() {
    this.matcher.removeEventListener('change', this.myListener);
  }

  myListener(event: { matches: any; }) {
    console.log(event.matches ? 'match' : 'no match');
  }
}

BreakpointObserver.observe 的区别在于 MediaMatcher 让我们可以访问本机 MatchQueryList 对象,这在某些场景中可能需要。

注: 之前,本例使用了addListenerremoveListeneraddListener 已弃用,现代浏览器推荐使用 addEventListener。 并且 removeListener 已被弃用,现代浏览器推荐使用 removeEventListener


现在,您拥有了在 Angular 中做出反应或调整 UI 以适应不同视口大小所需的一切。

结论

在本文中,在 Angular 项目中应用了 CDK 的布局模块。

继续学习 CDK 的布局模块 API 参考文档