Angular

Angular

Tutorial Angular: Layout con Angular Material

Angular Material layout: diseño responsivo. Aprende a usar layout en Angular Material para crear diseños responsivos con ejemplos detallados.

El layout con Angular Material es una solución que permite estructurar y organizar la interfaz de usuario de una aplicación Angular utilizando componentes flexibles y responsivos que siguen las mejores prácticas de diseño y usabilidad. 

Estos componentes están diseñados para proporcionar una experiencia de usuario consistente y visualmente atractiva en diferentes tipos de dispositivos y tamaños de pantalla.

En términos técnicos, la integración de Angular Material en un layout permite:

- Facilitar el diseño responsivo mediante el uso de directivas y componentes que se adaptan a diferentes resoluciones de pantalla.

- Utilizar una amplia gama de componentes preconstruidos como MatToolbar, MatSidenav, MatGridList, entre otros, que ayudan a organizar y estructurar de manera eficiente los distintos elementos visuales de la aplicación.

- Seguir los principios de Material Design, lo que garantiza una interfaz limpia, coherente y moderna.

- Mejorar la accesibilidad mediante componentes que ya integran buenas prácticas de accesibilidad (ARIA).

- Agilizar el desarrollo al reducir el tiempo necesario para crear interfaces de usuario complejas y responsivas.

Introducción al sistema de layout

El sistema de layout en Angular Material se basa principalmente en CSS Grid y Flexbox. Angular Material proporciona componentes y clases CSS que facilitan la creación de layouts complejos y responsivos.

Prerrequisitos

  1.- Tener un proyecto Angular configurado.

 2.- Instalar Angular Material ejecutando el siguiente comando:

ng add @angular/material

Este comando instalará Angular Material y Angular CDK, configurará angular.json, y agregará los estilos necesarios a la aplicación.

Durante este proceso, se te pedirá seleccionar un tema de Material Design, configurar las animaciones y añadir las configuraciones globales en Styles. Selecciona las opciones según conveniencia.

Importación de componentes de Angular Material

Para utilizar cualquier componente de Angular Material en tu aplicación Angular, es necesario importar el módulo correspondiente a ese componente. Este paso es crucial y se debe realizar para cada tipo de componente que desees utilizar.

El proceso general es el siguiente:

  1. Importar el módulo del componente desde @angular/material.
  2. Añadir el módulo importado a la lista de imports de tu componente (si es un componente standalone) o al array de imports de tu NgModule.

Este procedimiento permite que Angular sepa qué componentes estás utilizando y cargue solo el código necesario, lo que ayuda a optimizar el rendimiento de tu aplicación.

Veamos cómo se aplica esto usando el componente mat-card como ejemplo:

import { MatCardModule } from '@angular/material/card';

@Component({
  selector: 'app-mi-componente',
  templateUrl: './mi-componente.component.html',
  styleUrls: ['./mi-componente.component.css'],
  standalone: true,
  imports: [
    MatCardModule,
    // Otros módulos que necesites
  ]
})
export class MiComponenteComponent {
  // Lógica del componente
}

Una vez importado, puedes usar el componente en tu plantilla HTML:

<mat-card>
  <mat-card-header>
    <mat-card-title>Título de la Tarjeta</mat-card-title>
  </mat-card-header>
  <mat-card-content>
    Contenido de la tarjeta
  </mat-card-content>
</mat-card>

Componentes principales para layouts

Angular Material ofrece varios componentes clave para trabajar con layouts:

  1. mat-grid-list: Para crear layouts basados en grillas.
  2. mat-card: Para crear tarjetas con contenido.
  3. mat-toolbar: Para crear barras de herramientas y encabezados.
  4. mat-sidenav: Para crear menús laterales y layouts de tipo "drawer".

mat-toolbar

El componente MatToolbar proporciona una barra de herramientas que generalmente se utiliza como encabezado de la aplicación. Es ideal para incluir títulos, logotipos, botones de navegación, y más.

<mat-toolbar color="primary">
  <span>Mi Aplicación</span>
</mat-toolbar>

mat-grid-list

El componente MatGridList es útil para crear una cuadrícula responsiva de elementos. 

Permite definir filas y columnas que se adaptan a diferentes tamaños de pantalla.

<mat-grid-list cols="4" rowHeight="100px">
  <mat-grid-tile>Tile 1</mat-grid-tile>
  <mat-grid-tile>Tile 2</mat-grid-tile>
  <mat-grid-tile>Tile 3</mat-grid-tile>
  <mat-grid-tile>Tile 4</mat-grid-tile>
</mat-grid-list>

Puedes ajustar el número de columnas y la altura de las filas según tus necesidades.

mat-card

Para presentar contenido de manera agrupada y estilizada, el componente MatCard se utiliza ampliamente. 

Es ideal para mostrar imágenes, títulos y copias de contenido bien organizadas.

<mat-card>
  <mat-card-header>
    <mat-card-title>Título de la Tarjeta</mat-card-title>
    <mat-card-subtitle>Subtítulo</mat-card-subtitle>
  </mat-card-header>
  <img mat-card-image src="imagen.jpg" alt="Imagen de la Tarjeta">
  <mat-card-content>
    <p>Contenido descriptivo dentro de la tarjeta.</p>
  </mat-card-content>
  <mat-card-actions>
    <button mat-button>Acción 1</button>
    <button mat-button>Acción 2</button>
  </mat-card-actions>
</mat-card>

Layout con mat-sidenav

El componente MatSidenav se emplea para crear un panel de navegación lateral. 

Puede estar oculto o visible dependiendo del estado de la aplicación (por ejemplo, visible en dispositivos más grandes y oculto en dispositivos móviles).

Para crear un layout de aplicación típico con barra lateral:

<mat-sidenav-container>
  <mat-sidenav #sidenav mode="side" opened>
    <p>Elemento de Navegación</p>
  </mat-sidenav>

  <mat-sidenav-content>
    <p>Contenido Principal</p>
  </mat-sidenav-content>
</mat-sidenav-container>

Para abrir y cerrar el MatSidenav, puedes vincularlo a botones de la siguiente manera:

<mat-toolbar color="primary">
  <button mat-icon-button (click)="sidenav.toggle()">
    <mat-icon>menu</mat-icon>
  </button>
  <span>Mi Aplicación</span>
</mat-toolbar>

Ejemplo completo

En el siguiente ejemplo, veremos cómo se pueden unir varios componentes clave de Angular Material para crear un layout completo y funcional. Este ejercicio práctico demuestra cómo mat-toolbar, mat-sidenav, mat-grid-list y mat-card trabajan en armonía para construir una interfaz de usuario robusta y responsive.

Código HTML:

<mat-toolbar color="primary">
  <button mat-icon-button (click)="toggleMenu()">
    <mat-icon>menu</mat-icon>
  </button>
  <span>Mi Tienda Online</span>
  <span class="toolbar-spacer"></span>
  <button mat-icon-button>
    <mat-icon>notifications</mat-icon>
  </button>
  <button mat-icon-button>
    <mat-icon>account_circle</mat-icon>
  </button>
</mat-toolbar>

<mat-sidenav-container>
  <mat-sidenav [opened]="isMenuOpen" mode="side">
    <mat-nav-list>
      <a mat-list-item>
        <mat-icon mat-list-icon>dashboard</mat-icon>
        <span>Dashboard</span>
      </a>
      <a mat-list-item>
        <mat-icon mat-list-icon>inventory</mat-icon>
        <span>Productos</span>
      </a>
      <a mat-list-item>
        <mat-icon mat-list-icon>shopping_cart</mat-icon>
        <span>Pedidos</span>
      </a>
      <a mat-list-item>
        <mat-icon mat-list-icon>people</mat-icon>
        <span>Clientes</span>
      </a>
    </mat-nav-list>
  </mat-sidenav>

  <mat-sidenav-content>
    <div class="content-container">
      <h1>Productos Destacados</h1>

      <mat-grid-list cols="2" rowHeight="2:1" gutterSize="16px">
        <mat-grid-tile *ngFor="let product of products">
          <mat-card class="product-card">
            <img mat-card-image [src]="product.image" [alt]="product.name">
            <mat-card-content>
              <h2>{{product.name}}</h2>
              <p>Precio: ${{product.price}}</p>
              <p>Stock: {{product.stock}}</p>
            </mat-card-content>
            <mat-card-actions>
              <button mat-button color="primary">Editar</button>
              <button mat-button color="warn">Eliminar</button>
            </mat-card-actions>
          </mat-card>
        </mat-grid-tile>
      </mat-grid-list>
    </div>
  </mat-sidenav-content>
</mat-sidenav-container>

Así se vería en el navegador:

Responsividad

Angular Material está diseñado para ser responsivo por defecto. Sin embargo, puedes usar las clases de utilidad de Angular Material para ajustar el comportamiento en diferentes tamaños de pantalla:

<div class="mat-headline-5 mat-headline-5-sm">Título responsivo</div>

Estas clases se ajustarán automáticamente según el tamaño de la pantalla.

Espaciado y alineación

Angular Material proporciona clases CSS para espaciado y alineación:

<div class="mat-elevation-z2 mat-p-4">
  Contenido con sombra y padding
</div>

<div class="mat-text-center">
  Texto centrado
</div>

Flexbox con Angular Material

Aunque Angular Material no proporciona directivas específicas para Flexbox, puedes usar Flexbox directamente con las clases de Angular Material:

<div class="mat-display-flex mat-justify-content-between">
  <div>Elemento 1</div>
  <div>Elemento 2</div>
</div>
Certifícate en Angular con CertiDevs PLUS

Ejercicios de esta lección Layout con Angular Material

Evalúa tus conocimientos de esta lección Layout con Angular Material con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Signals en Angular

Angular
Puzzle

Guards funcionales

Angular
Test

Decodificar JWT en Angular

Angular
Test

Servicio con HttpClient

Angular
Código

Ciclo de vida de componentes en Angular

Angular
Test

Gestión de productos de Fake Store API

Angular
Proyecto

Data binding en Angular

Angular
Test

Routes sin módulos en Angular

Angular
Código

Router en Angular

Angular
Test

Instalación de Angular

Angular
Puzzle

Route Guards basados en interfaces

Angular
Código

La directiva @if en Angular

Angular
Puzzle

Formularios reactivos en Angular

Angular
Código

Servicios en Angular

Angular
Puzzle

Interceptor funcional

Angular
Test

Servicio con Array

Angular
Código

La directiva @for en Angular

Angular
Puzzle

Interceptores HTTP

Angular
Código

Componentes standalone true

Angular
Puzzle

Formularios con ngModel en Angular

Angular
Puzzle

Routes en Angular

Angular
Test

Comunicación entre componentes Angular

Angular
Test

Parámetros en rutas con ActivatedRoute

Angular
Test

CRUD de Restaurantes y Platos

Angular
Proyecto

Tablas en Angular Material

Angular
Puzzle

Formulario de registro de usuarios

Angular
Proyecto

Instalación y uso de NgBoostrap

Angular
Puzzle

Desarrollo de componentes Angular

Angular
Test

JWT en Angular

Angular
Código

Formularios reactivos en Angular

Angular
Puzzle

Formularios en Angular Material

Angular
Puzzle

Layout con Angular Material

Angular
Puzzle

Effects en Angular

Angular
Test

Data binding

Angular
Código

HttpClient en servicios de Angular

Angular
Puzzle

Desarrollo de módulos Angular

Angular
Puzzle

Comandos Angular CLI

Angular
Puzzle

Subir archivo en formularios

Angular
Test

La directiva routerLink en Angular

Angular
Test

Todas las lecciones de Angular

Accede a todas las lecciones de Angular y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Instalación Angular

Angular

Introducción Y Entorno

Comandos Angular Cli

Angular

Introducción Y Entorno

Desarrollo De Componentes Angular

Angular

Componentes

Data Binding En Angular

Angular

Componentes

Ciclo De Vida De Componentes En Angular

Angular

Componentes

Comunicación Entre Componentes Angular

Angular

Componentes

La Directiva @If En Angular

Angular

Componentes

La Directiva @For En Angular

Angular

Componentes

Componentes Standalone

Angular

Componentes

Desarrollo De Módulos Angular

Angular

Módulos

Routes En Angular

Angular

Enrutado Y Navegación

Router En Angular

Angular

Enrutado Y Navegación

La Directiva Routerlink En Angular

Angular

Enrutado Y Navegación

Parámetros En Rutas Con Activatedroute

Angular

Enrutado Y Navegación

Routes Sin Módulos En Angular

Angular

Enrutado Y Navegación

Servicios En Angular

Angular

Servicios E Inyección De Dependencias

Httpclient En Servicios De Angular

Angular

Servicios E Inyección De Dependencias

Formularios Con Ngmodel En Angular

Angular

Formularios

Formularios Reactivos En Angular

Angular

Formularios

Subir Archivo En Formularios

Angular

Formularios

Layout Con Angular Material

Angular

Integración Con Angular Material

Tablas En Angular Material

Angular

Integración Con Angular Material

Formularios En Angular Material

Angular

Integración Con Angular Material

Instalación Y Uso De Ngboostrap

Angular

Integración Con Bootstrap Css

Signals En Angular

Angular

Signals Y Reactividad

Effects En Angular

Angular

Signals Y Reactividad

Route Guards Basados En Interfaces

Angular

Autenticación Y Autorización

Guards Funcionales

Angular

Autenticación Y Autorización

Interceptores Http Basados En Interfaz

Angular

Autenticación Y Autorización

Interceptores Http Funcionales

Angular

Autenticación Y Autorización

Seguridad Jwt En Angular

Angular

Autenticación Y Autorización

Decodificar Tokens Jwt En Angular

Angular

Autenticación Y Autorización

Certificados de superación de Angular

Supera todos los ejercicios de programación del curso de Angular y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

- Comprender cómo integrar Angular Material en un proyecto Angular.

- Aprender a utilizar componentes clave como MatToolbar, MatSidenav, MatGridList, y MatCard.

- Implementar layouts responsivos usando CSS Grid y Flexbox con Angular Material.

- Agilizar el desarrollo mediante el uso de componentes preconstruidos.