Instalación de Angular Material

Intermedio
Angular
Angular
Actualizado: 24/09/2025

Integración con Angular Material

Angular Material es la implementación oficial de Material Design para Angular, proporcionando un conjunto completo de componentes de interfaz de usuario que siguen las especificaciones de Google. La integración con proyectos Angular modernos se ha simplificado considerablemente gracias al soporte nativo para componentes standalone.

Instalación mediante Angular CLI

La forma más sencilla de añadir Angular Material a un proyecto Angular es mediante el comando ng add, que automatiza todo el proceso de configuración:

ng add @angular/material

Durante la instalación, el comando te preguntará por varias opciones de configuración:

  • Tema prediseñado: Puedes elegir entre varios temas preconstruidos como Indigo/Pink, Deep Purple/Amber, Pink/Blue Grey, o Purple/Green.
  • Tipografía global: Si deseas aplicar los estilos tipográficos de Material Design globalmente.
  • Animaciones del navegador: Si quieres incluir las animaciones de Angular que mejoran la experiencia de usuario.

Configuración automática

El comando ng add realiza automáticamente las siguientes tareas de configuración:

Instalación de dependencias: Añade los paquetes necesarios incluyendo @angular/material, @angular/cdk (Component Development Kit), y @angular/animations.

Configuración de estilos: Importa el tema seleccionado en el archivo styles.css global y añade los estilos base de Material Design.

Configuración de fuentes: Si seleccionaste la tipografía global, añade las fuentes Roboto y los iconos de Material Icons mediante enlaces CDN en el index.html.

/* Ejemplo de configuración automática en styles.css */
@import '@angular/material/prebuilt-themes/indigo-pink.css';

html, body { height: 100%; }
body { margin: 0; font-family: Roboto, "Helvetica Neue", sans-serif; }

Integración con componentes standalone

Angular Material funciona perfectamente con la arquitectura standalone de Angular 20. Para usar un componente de Material, simplemente importas el módulo correspondiente en el array imports de tu componente:

import { Component } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';

@Component({
  selector: 'app-example',
  imports: [MatButtonModule, MatCardModule],
  template: `
    <mat-card>
      <mat-card-content>
        <p>Contenido de la tarjeta</p>
        <button mat-raised-button color="primary">
          Botón Material
        </button>
      </mat-card-content>
    </mat-card>
  `
})
export class ExampleComponent { }

Configuración de animaciones

Las animaciones de Angular son esenciales para que muchos componentes de Material funcionen correctamente. Si durante la instalación elegiste incluir animaciones, se añadirá automáticamente el provider correspondiente en tu app.config.ts:

import { ApplicationConfig } from '@angular/core';
import { provideAnimations } from '@angular/platform-browser/animations';

export const appConfig: ApplicationConfig = {
  providers: [
    provideAnimations(),
    // otros providers...
  ]
};

Verificación de la instalación

Para confirmar que Angular Material se ha integrado correctamente, puedes crear un componente simple que use elementos de Material:

import { Component } from '@angular/core';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';

@Component({
  selector: 'app-test',
  imports: [MatToolbarModule, MatButtonModule, MatIconModule],
  template: `
    <mat-toolbar color="primary">
      <span>Mi aplicación Angular Material</span>
    </mat-toolbar>
    
    <div style="padding: 20px;">
      <button mat-fab color="accent">
        <mat-icon>add</mat-icon>
      </button>
    </div>
  `
})
export class TestComponent { }

Gestión de temas

Angular Material incluye varios temas predefinidos que puedes cambiar fácilmente modificando la importación en styles.css:

/* Temas disponibles */
@import '@angular/material/prebuilt-themes/indigo-pink.css';
@import '@angular/material/prebuilt-themes/deeppurple-amber.css';
@import '@angular/material/prebuilt-themes/pink-bluegrey.css';
@import '@angular/material/prebuilt-themes/purple-green.css';

La integración de Angular Material proporciona una base sólida para crear interfaces de usuario modernas y consistentes, aprovechando la potencia del sistema de diseño de Google junto con las características avanzadas de Angular 20.

Componentes de Angular Material

Angular Material ofrece una amplia gama de componentes listos para usar que implementan las especificaciones de Material Design 3. Estos componentes están organizados en diferentes categorías según su funcionalidad y caso de uso.

Componentes de navegación

Los componentes de navegación ayudan a estructurar la aplicación y facilitan el movimiento entre diferentes secciones:

Toolbar y Sidenav

import { Component } from '@angular/core';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatSidenavModule } from '@angular/material/sidenav';
import { MatListModule } from '@angular/material/list';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';

@Component({
  selector: 'app-navigation',
  imports: [
    MatToolbarModule, 
    MatSidenavModule, 
    MatListModule, 
    MatIconModule, 
    MatButtonModule
  ],
  template: `
    <mat-sidenav-container style="height: 100vh;">
      <mat-sidenav mode="side" opened>
        <mat-nav-list>
          <a mat-list-item href="#">
            <mat-icon>home</mat-icon>
            <span>Inicio</span>
          </a>
          <a mat-list-item href="#">
            <mat-icon>person</mat-icon>
            <span>Perfil</span>
          </a>
        </mat-nav-list>
      </mat-sidenav>
      
      <mat-sidenav-content>
        <mat-toolbar color="primary">
          <button mat-icon-button>
            <mat-icon>menu</mat-icon>
          </button>
          <span>Mi Aplicación</span>
        </mat-toolbar>
        
        <div style="padding: 20px;">
          <p>Contenido principal</p>
        </div>
      </mat-sidenav-content>
    </mat-sidenav-container>
  `
})
export class NavigationComponent { }

Componentes de entrada de datos

Los componentes de formulario facilitan la captura y validación de información del usuario:

Input Fields y Select

import { Component } from '@angular/core';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { FormsModule } from '@angular/forms';

@Component({
  selector: 'app-form-example',
  imports: [
    MatInputModule,
    MatSelectModule, 
    MatFormFieldModule,
    MatCheckboxModule,
    FormsModule
  ],
  template: `
    <div style="padding: 20px; max-width: 400px;">
      <mat-form-field appearance="fill">
        <mat-label>Nombre completo</mat-label>
        <input matInput [(ngModel)]="nombre" placeholder="Introduce tu nombre">
      </mat-form-field>
      
      <mat-form-field appearance="fill">
        <mat-label>País</mat-label>
        <mat-select [(ngModel)]="paisSeleccionado">
          <mat-option value="es">España</mat-option>
          <mat-option value="mx">México</mat-option>
          <mat-option value="ar">Argentina</mat-option>
        </mat-select>
      </mat-form-field>
      
      <mat-checkbox [(ngModel)]="aceptaTerminos">
        Acepto los términos y condiciones
      </mat-checkbox>
    </div>
  `
})
export class FormExampleComponent {
  nombre = '';
  paisSeleccionado = '';
  aceptaTerminos = false;
}

Componentes de layout

Los componentes de organización visual ayudan a estructurar el contenido de manera atractiva:

Cards y Grid List

import { Component } from '@angular/core';
import { MatCardModule } from '@angular/material/card';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatButtonModule } from '@angular/material/button';

@Component({
  selector: 'app-layout-example',
  imports: [MatCardModule, MatGridListModule, MatButtonModule],
  template: `
    <div style="padding: 20px;">
      <mat-grid-list cols="2" rowHeight="300px" gutterSize="16px">
        @for (producto of productos; track producto.id) {
          <mat-grid-tile>
            <mat-card style="width: 100%; height: 100%;">
              <mat-card-header>
                <mat-card-title>{{ producto.nombre }}</mat-card-title>
                <mat-card-subtitle>{{ producto.precio | currency:'EUR' }}</mat-card-subtitle>
              </mat-card-header>
              
              <mat-card-content>
                <p>{{ producto.descripcion }}</p>
              </mat-card-content>
              
              <mat-card-actions>
                <button mat-button color="primary">COMPRAR</button>
                <button mat-button>DETALLES</button>
              </mat-card-actions>
            </mat-card>
          </mat-grid-tile>
        }
      </mat-grid-list>
    </div>
  `
})
export class LayoutExampleComponent {
  productos = [
    { 
      id: 1, 
      nombre: 'Producto A', 
      precio: 29.99, 
      descripcion: 'Descripción del producto A' 
    },
    { 
      id: 2, 
      nombre: 'Producto B', 
      precio: 49.99, 
      descripcion: 'Descripción del producto B' 
    }
  ];
}

Componentes de datos

Los componentes de presentación de datos permiten mostrar información de forma organizada y accesible:

Table y Paginator

import { Component } from '@angular/core';
import { MatTableModule } from '@angular/material/table';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatSortModule } from '@angular/material/sort';

@Component({
  selector: 'app-data-table',
  imports: [MatTableModule, MatPaginatorModule, MatSortModule],
  template: `
    <div style="padding: 20px;">
      <mat-table [dataSource]="usuarios" matSort>
        <ng-container matColumnDef="nombre">
          <mat-header-cell *matHeaderCellDef mat-sort-header>
            Nombre
          </mat-header-cell>
          <mat-cell *matCellDef="let usuario">
            {{ usuario.nombre }}
          </mat-cell>
        </ng-container>
        
        <ng-container matColumnDef="email">
          <mat-header-cell *matHeaderCellDef>
            Email
          </mat-header-cell>
          <mat-cell *matCellDef="let usuario">
            {{ usuario.email }}
          </mat-cell>
        </ng-container>
        
        <ng-container matColumnDef="activo">
          <mat-header-cell *matHeaderCellDef>
            Estado
          </mat-header-cell>
          <mat-cell *matCellDef="let usuario">
            @if (usuario.activo) {
              <span style="color: green;">Activo</span>
            } @else {
              <span style="color: red;">Inactivo</span>
            }
          </mat-cell>
        </ng-container>
        
        <mat-header-row *matHeaderRowDef="columnasVisibles"></mat-header-row>
        <mat-row *matRowDef="let row; columns: columnasVisibles;"></mat-row>
      </mat-table>
      
      <mat-paginator [pageSizeOptions]="[5, 10, 20]" showFirstLastButtons>
      </mat-paginator>
    </div>
  `
})
export class DataTableComponent {
  columnasVisibles: string[] = ['nombre', 'email', 'activo'];
  usuarios = [
    { nombre: 'Ana García', email: 'ana@example.com', activo: true },
    { nombre: 'Carlos López', email: 'carlos@example.com', activo: false },
    { nombre: 'María Rodríguez', email: 'maria@example.com', activo: true }
  ];
}

Componentes de feedback

Los componentes de retroalimentación proporcionan información sobre el estado de la aplicación y las acciones del usuario:

Snackbar y Dialog

import { Component, inject } from '@angular/core';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatDialog } from '@angular/material/dialog';
import { MatButtonModule } from '@angular/material/button';

@Component({
  selector: 'app-feedback-example',
  imports: [MatButtonModule],
  template: `
    <div style="padding: 20px;">
      <button mat-raised-button color="primary" (click)="mostrarSnackbar()">
        Mostrar Notificación
      </button>
      
      <button mat-raised-button color="accent" (click)="abrirDialog()">
        Abrir Dialog
      </button>
    </div>
  `
})
export class FeedbackExampleComponent {
  private snackBar = inject(MatSnackBar);
  private dialog = inject(MatDialog);
  
  mostrarSnackbar() {
    this.snackBar.open('¡Acción completada exitosamente!', 'Cerrar', {
      duration: 3000,
      horizontalPosition: 'center',
      verticalPosition: 'bottom'
    });
  }
  
  abrirDialog() {
    const dialogRef = this.dialog.open(DialogExampleComponent);
    
    dialogRef.afterClosed().subscribe(resultado => {
      if (resultado) {
        this.snackBar.open('Dialog cerrado con resultado: ' + resultado, 'OK');
      }
    });
  }
}

Estrategia de importación modular

Para optimizar el bundle de tu aplicación, Angular Material permite importar solo los módulos que realmente necesitas:

// Crear un archivo shared-material.module.ts
import { NgModule } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatInputModule } from '@angular/material/input';
import { MatToolbarModule } from '@angular/material/toolbar';

const MaterialModules = [
  MatButtonModule,
  MatCardModule,
  MatInputModule,
  MatToolbarModule
];

@NgModule({
  imports: MaterialModules,
  exports: MaterialModules
})
export class SharedMaterialModule { }

Los componentes de Angular Material proporcionan una base sólida para construir interfaces de usuario profesionales y accesibles, manteniendo la consistencia visual y siguiendo las mejores prácticas de UX establecidas por Material Design.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Angular

Documentación oficial de Angular
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Angular es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Angular

Explora más contenido relacionado con Angular y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender cómo instalar Angular Material usando Angular CLI y configurar temas, tipografía y animaciones.
  • Aprender a integrar Angular Material con la arquitectura standalone de Angular 20.
  • Conocer los principales componentes de Angular Material para navegación, formularios, layout, datos y feedback.
  • Saber cómo verificar la correcta instalación y uso de Angular Material en un proyecto.
  • Entender la estrategia modular para importar solo los módulos necesarios y optimizar el bundle de la aplicación.