7 способов добавить всплывающие подсказки к меткам вкладок Mat в Angular Material

Всплывающие подсказки — отличный способ предоставить пользователям дополнительную информацию или контекст при взаимодействии с элементами на веб-странице. В этой статье мы рассмотрим несколько способов прикрепления всплывающих подсказок к меткам вкладок Mat в Angular Material. Мы предоставим примеры кода для каждого метода, чтобы помочь вам эффективно реализовать всплывающие подсказки в вашем приложении Angular.

Метод 1: использование директивы MatTooltip Angular Material
Директива MatTooltip, предоставляемая Angular Material, позволяет нам легко добавлять всплывающие подсказки к любому элементу HTML. Вот как его можно использовать с метками Mat Tab:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <span matTooltip="Tooltip content">{{ tab.label }}</span>
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

Метод 2: настраиваемая директива всплывающей подсказки
Если вы предпочитаете более настраиваемое решение для всплывающей подсказки, вы можете создать настраиваемую директиву, которая прикрепляет всплывающую подсказку к меткам вкладок Mat. Вот пример:

import { Directive, ElementRef, Input, OnInit } from '@angular/core';
import { MatTooltip } from '@angular/material/tooltip';
@Directive({
  selector: '[matTabLabelTooltip]'
})
export class MatTabLabelTooltipDirective implements OnInit {
  @Input('matTabLabelTooltip') tooltipText: string;
  constructor(private el: ElementRef, private matTooltip: MatTooltip) {}
  ngOnInit() {
    this.matTooltip.message = this.tooltipText;
    this.matTooltip.showDelay = 500;
    this.matTooltip.hideDelay = 200;
    this.matTooltip.position = 'above';
    this.matTooltip.show();
  }
}

Использование:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <span matTabLabelTooltip="Tooltip content">{{ tab.label }}</span>
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

Метод 3: всплывающая подсказка на основе CSS
Вы также можете создать всплывающую подсказку на основе CSS для меток вкладок Mat. Вот пример:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <span class="tooltip">
        {{ tab.label }}
        <span class="tooltip-text">Tooltip content</span>
      </span>
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

CSS:

.tooltip {
  position: relative;
  display: inline-block;
  cursor: pointer;
}
.tooltip .tooltip-text {
  visibility: hidden;
  width: 120px;
  background-color: #000;
  color: #fff;
  text-align: center;
  border-radius: 6px;
  padding: 5px;
  position: absolute;
  z-index: 1;
  bottom: 125%;
  left: 50%;
  transform: translateX(-50%);
  opacity: 0;
  transition: opacity 0.3s;
}
.tooltip:hover .tooltip-text {
  visibility: visible;
  opacity: 1;
}

Метод 4: всплывающая подсказка на основе наложения
Другой подход — использовать модуль Overlay Angular для создания всплывающей подсказки на основе наложения. Вот пример:

import { ComponentPortal } from '@angular/cdk/portal';
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
import { Component, ComponentRef, ViewChild, TemplateRef } from '@angular/core';
@Component({
  selector: 'app-tooltip',
  template: `
    <ng-template>
      <div class="tooltip">
        <span>{{ tooltipText }}</span>
      </div>
    </ng-template>
  `,
  styles: [`
    .tooltip {
      background-color: #000;
      color: #fff;
      padding: 5px;
      border-radius: 4px;
    }
  `],
})
export class TooltipComponent {
  tooltipText: string;
}
@Component({
  selector: 'app-tab',
  template: `
    <ng-template>
      <span (mouseenter)="showTooltip()" (mouseleave)="hideTooltip()">{{ tab.label }}</span>
    </ng-template>
  `,
})
export class TabComponent {
  @ViewChild(TemplateRef) templateRef: TemplateRef<any>;
  private overlayRef: OverlayRef;
  private tooltipComponentRef: ComponentRef<TooltipComponent>;
  constructor(private overlay: Overlay) {}
  showTooltip() {
    if (!this.overlayRef) {
      const overlayConfig = new OverlayConfig({
        hasBackdrop: false,
        positionStrategy: this.overlay.position().connectedTo(this.templateRef.elementRef,{ "top": "bottom", "right": "center" }).withOffsetY(8),
        scrollStrategy: this.overlay.scrollStrategies.close(),
      });
      this.overlayRef = this.overlay.create(overlayConfig);
      this.tooltipComponentRef = this.overlayRef.attach(new ComponentPortal(TooltipComponent));
      this.tooltipComponentRef.instance.tooltipText = 'Tooltip content';
    }
  }
  hideTooltip() {
    if (this.overlayRef) {
      this.overlayRef.detach();
      this.overlayRef = null;
    }
  }
}

Использование:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <app-tab></app-tab>
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

Метод 5: сторонние библиотеки подсказок
Вы также можете использовать сторонние библиотеки, такие как ngx-bootstrap или ng-bootstrap, которые обеспечивают функциональность всплывающих подсказок. Вот пример использования ngx-bootstrap:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <span tooltip="Tooltip content">{{ tab.label }}</span>
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

Обязательно установите необходимую библиотеку и импортируйте необходимые модули.

Метод 6: значок Material Design с подсказкой
Если вы используете значки Material Design в метках вкладок Mat, вы можете напрямую прикрепить всплывающую подсказку к элементу значка. Вот пример:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <mat-icon matTooltip="Tooltip content">{{ tab.icon }}</mat-icon>
      {{ tab.label }}
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

Метод 7: использование пользовательской директивы с MatTooltip
Вы можете создать пользовательскую директиву, которая объединяет директиву MatTooltip с компонентом MatTab для прикрепления всплывающих подсказок к меткам Mat Tab. Вот пример:

import { Directive, ElementRef, Input, OnInit } from '@angular/core';
import { MatTooltip } from '@angular/material/tooltip';
import { MatTab } from '@angular/material/tabs';
@Directive({
  selector: '[matTabLabelTooltip]'
})
export class MatTabLabelTooltipDirective implements OnInit {
  @Input('matTabLabelTooltip') tooltipText: string;
  constructor(private el: ElementRef, private matTooltip: MatTooltip, private matTab: MatTab) {}
  ngOnInit() {
    this.matTab._getHostElement().setAttribute('title', this.tooltipText);
    this.matTooltip.disabled = true;
  }
}

Использование:

<mat-tab-group>
  <mat-tab *ngFor="let tab of tabs">
    <ng-template mat-tab-label>
      <span matTabLabelTooltip="Tooltip content">{{ tab.label }}</span>
    </ng-template>
    <!-- tab content goes here -->
  </mat-tab>
</mat-tab-group>

В этой статье мы рассмотрели семь различных способов прикрепления всплывающих подсказок к меткам вкладок Mat в Angular Material. В зависимости от ваших требований вы можете выбрать метод, который наилучшим образом соответствует вашим потребностям. Предпочитаете ли вы использовать директиву MatTooltip Angular Material, пользовательские директивы, всплывающие подсказки на основе CSS, всплывающие подсказки на основе наложений, сторонние библиотеки или комбинировать MatTooltip с другими компонентами Angular Material, теперь у вас есть ряд возможностей для улучшения вашего пользовательского интерфейса с помощью всплывающих подсказок..