Angular 项目 PC 端适配移动端,我只用了3步,1-2天全页面落地

3 阅读4分钟

Angular 项目 PC 端适配移动端,我只用了3步,1-2天全页面落地

亲测在3个生产级Angular中后台项目落地,完全不改动原有PC核心逻辑,零样式污染,普通项目1-2天就能完成页面适配。

前言

相信很多做Angular开发的朋友都遇到过这个场景:项目初期只面向PC端做了中后台系统,上线后产品突然提需求,要求手机端也能正常访问操作。直接硬改CSS很容易把原本稳定的PC布局搞崩,完全重写一套独立H5项目又要投入大量人力,后续还要维护两套代码,迭代时两边同步简直是噩梦。

今天给大家分享一套经过实战验证的极简适配方案,不用大动架构,不用重构历史代码,3步就能快速完成PC端到移动端的适配。

一、基础配置:10分钟搭好适配地基

这一步完全不涉及业务逻辑,只需要修改几个基础配置,就能把移动端适配的环境搭建好。

1. 配置标准视口在index.html的head标签中加入这段meta代码,这是所有移动端适配的前提,能让页面在手机浏览器中以理想视口正常渲染,避免页面被缩放:

2. 引入Angular官方适配工具不用自己手写大量媒体查询,直接用Angular生态自带的成熟工具,减少造轮子的成本:

npm install @angular/flex-layout @angular/cdk

安装完成后,在app.module.ts中导入FlexLayoutModule即可使用。

3. 全局统一断点标准在全局样式文件中定义统一的适配阈值,全项目所有页面都遵循同一个规则,避免不同页面适配逻辑混乱:

// styles.scss

// 768px以上为PC端,以下为移动端

$mobileBreakpoint: 768px;

二、布局适配:告别冗余媒体查询****

利用@angular/flex-layout的声明式特性,直接在模板中控制不同屏幕的布局行为,比手写CSS效率提升3倍,原有PC布局完全不需要改动。

三、核心组件适配:表格直接变卡片****

中后台系统适配最头疼的就是数据表格,强行在手机上展示多列表格会导致横向滚动、内容拥挤,体验极差。我们利用Angular CDK的能力,直接根据屏幕尺寸切换组件形态,PC用表格,移动端用卡片,两套结构完全独立互不干扰。

1. 监听屏幕状态在组件中注入BreakpointObserver,实时获取当前设备是否为移动端:

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

import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';

import { Subscription } from 'rxjs';

@Component({

selector: 'app-user-list',

templateUrl: './user-list.component.html'

})

export class UserListComponent implements OnInit, OnDestroy {

isMobile = false;

private breakpointSub: Subscription;

constructor(private breakpointObserver: BreakpointObserver) {}

ngOnInit() {

this.breakpointSub = this.breakpointObserver

.observe([Breakpoints.Small])

.subscribe(result => {

this.isMobile = result.matches;

});

}

ngOnDestroy() {

if (this.breakpointSub) {

this.breakpointSub.unsubscribe();

}

}

}

  1. 模板条件渲染

直接在模板中做判断,渲染不同的组件结构:


<!-- PC端:传统数据表格 -->

<mat-table *ngIf="!isMobile" [dataSource]="userList">

  <ng-container matColumnDef="name">

    <mat-header-cell *matHeaderCellDef>姓名</mat-header-cell>

    <mat-cell *matCellDef="let user">{{user.name}}</mat-cell>

  </ng-container>

  <ng-container matColumnDef="phone">

    <mat-header-cell *matHeaderCellDef>手机号</mat-header-cell>

    <mat-cell *matCellDef="let user">{{user.phone}}</mat-cell>

  </ng-container>

  <ng-container matColumnDef="action">

    <mat-header-cell *matHeaderCellDef>操作</mat-header-cell>

    <mat-cell *matCellDef="let user">

      <button mat-button color="primary">编辑</button>

    </mat-cell>

  </ng-container>

  <mat-header-row *matHeaderRowDef="['name','phone','action']"></mat-header-row>

  <mat-row *matRowDef="let row; columns: ['name','phone','action']"></mat-row>

</mat-table>

<!-- 移动端:卡片式列表 -->

<div *ngIf="isMobile" class="mobile-card-list">

  <mat-card *ngFor="let user of userList" class="user-card">

    <mat-card-title>{{user.name}}</mat-card-title>

    <mat-card-content>

      <p>手机号:{{user.phone}}</p>

    </mat-card-content>

    <mat-card-actions align="end">

      <button mat-button color="primary">编辑</button>

    </mat-card-actions>

  </mat-card>

</div>

## **四、3个细节优化,体验直接拉满******

完成基础适配后,做好这3个小细节,就能解决90%的移动端常见体验问题:

1. **触摸热区优化**:所有可点击的按钮、图标最小尺寸设置为44px,符合移动端手指操作标准,避免用户点不中

2. **iOS兼容处理**:所有输入框设置字体大小为16px,避免iOS Safari自动放大页面导致布局错乱

3. **长列表性能优化**:数据量大的列表使用Angular CDK虚拟滚动,避免生成过多DOM节点导致移动端卡顿


这套方案完全不改动原有PC端的核心逻辑,不会出现样式污染的问题,后续迭代只需要维护一套代码,不用同时更新PC和H5两个项目,开发和维护成本都降到了最低。我在3个生产级Angular中后台项目中都落地过这套方案,稳定性完全有保障。