Cours Angular · Module 13: UI et styles

Le design responsive

2 min de lecture
Dans cette leçon4

Tout comme un château adapte sa défense aux différentes attaques, l'interface doit s'adapter aux différents appareils.

Media queries

1// mixins.scss
2@mixin mobile {
3  @media (max-width: 599px) { @content; }
4}
5
6@mixin tablet {
7  @media (min-width: 600px) and (max-width: 959px) { @content; }
8}
9
10@mixin desktop {
11  @media (min-width: 960px) { @content; }
12}
13
14// Usage
15.samurai-grid {
16  display: grid;
17  gap: 1rem;
18
19  @include mobile {
20    grid-template-columns: 1fr;
21  }
22
23  @include tablet {
24    grid-template-columns: repeat(2, 1fr);
25  }
26
27  @include desktop {
28    grid-template-columns: repeat(4, 1fr);
29  }
30}

CDK BreakpointObserver

1import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';
2
3@Component({
4  template: `
5    @if (isMobile()) {
6      <app-mobile-nav />
7    } @else {
8      <app-desktop-nav />
9    }
10
11    <div [class]="layoutClass()">
12      <ng-content />
13    </div>
14  `
15})
16export class ResponsiveLayoutComponent {
17  private breakpointObserver = inject(BreakpointObserver);
18
19  isMobile = toSignal(
20    this.breakpointObserver.observe([Breakpoints.Handset]).pipe(
21      map(result => result.matches)
22    ),
23    { initialValue: false }
24  );
25
26  layoutClass = computed(() => this.isMobile() ? 'mobile-layout' : 'desktop-layout');
27}

Mises en page Flexbox

1@Component({
2  template: `
3    <div class="flex-container">
4      <aside class="sidebar">Menu</aside>
5      <main class="content">
6        <ng-content />
7      </main>
8    </div>
9  `,
10  styles: [`
11    .flex-container {
12      display: flex;
13      flex-wrap: wrap;
14      min-height: 100vh;
15    }
16
17    .sidebar {
18      flex: 0 0 250px;
19    }
20
21    .content {
22      flex: 1;
23      min-width: 0;  /* Important for overflow */
24    }
25
26    @media (max-width: 768px) {
27      .sidebar {
28        flex: 0 0 100%;
29        order: 2;
30      }
31      .content {
32        order: 1;
33      }
34    }
35  `]
36})
37export class LayoutComponent {}

Container queries (CSS)

1// Modern approach
2.card-container {
3  container-type: inline-size;
4  container-name: card;
5}
6
7.card {
8  @container card (min-width: 400px) {
9    display: grid;
10    grid-template-columns: 1fr 2fr;
11  }
12
13  @container card (max-width: 399px) {
14    display: block;
15  }
16}

Tu as repéré une erreur dans cette leçon ?

Teste tes connaissances

Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.

  1. 1. À quoi sert BreakpointObserver du package @angular/cdk/layout ?

  2. 2. Quelle fonction a été utilisée dans la leçon pour convertir l'Observable de BreakpointObserver en signal ?

Voici 2 des 3 questions de cette leçon. Réponds aux autres dans le jeu.

Tâches pratiques dans le jeu

  • Tri horizontal

    Ordonne sur une seule ligne l'en-tête de media query pour les appareils mobiles.

  • Éditeur de code

    Complète le composant qui réagit à la taille de l'écran.

  • Tri vertical

    Ordonne les breakpoints du cours, du plus petit au plus grand écran.

Articles utiles