3
votes

Comment afficher le matériau angulaire déroulant au survol de la souris?

Maintenant, en cliquant sur le menu hamburger, j'obtiens une liste déroulante à la place, j'en ai besoin en survolant le menu hamburger, voici le blitz de pile lien .

 entrez la description de l'image ici


0 commentaires

7 Réponses :


1
votes

Ajoutez une variable de référence pour le bouton du tapis, utilisez pour déclencher click sur un événement mouseover .

<button mat-icon-button
        #matBtn
        (mouseover)="matBtn._elementRef.nativeElement.click()"
        [matMenuTriggerFor]="menu"
>

Remarque: j'ai vraiment ne préférez pas accéder aux propriétés "privées" d'un objet comme celui-ci, cette solution est plutôt une solution de contournement, veuillez l'utiliser si vous n'en trouvez pas d'autre.


0 commentaires

0
votes

app.component.html:

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


@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  @ViewChild('clickMe') clickMe: any;

  clickOnHover() {
    this.clickMe._elementRef.nativeElement.click();
  }

}

app.component.ts:

<mat-toolbar color="primary" >
  <span class="fill-remaining-space">
    <button #clickMe mat-icon-button [matMenuTriggerFor]="menu" (mouseenter)="clickOnHover()">
      <mat-icon>menu</mat-icon>
    </button>
    <mat-menu #menu="matMenu" [overlapTrigger]="false">
      <button mat-menu-item>
        <mat-icon>home</mat-icon>
        <span>Home</span>
      </button>
      <button mat-menu-item>
        <mat-icon>people_outline</mat-icon>
        <span>Connecting</span>
      </button>
      <button mat-menu-item>
        <mat-icon>videocam</mat-icon>
        <span>Let's talk</span>
      </button>
      <button mat-menu-item>
        <mat-icon>exit_to_app</mat-icon>
        <span>Logout</span>
      </button>
    </mat-menu>
  </span>
  <span class="fill-remaining-space">Application Title</span>
</mat-toolbar>


0 commentaires

11
votes

Vous pouvez le faire en utilisant la directive matMenuTrigger

<mat-menu #menu="matMenu" [overlapTrigger]="false">
    <span (mouseleave)="menuTrigger.closeMenu()">
      <button mat-menu-item>
        <mat-icon>home</mat-icon>
        <span>Home</span>
        ........
       <mat-icon>exit_to_app</mat-icon>
       <span>Logout</span>
     </button>
    </span>
</mat-menu>

Pour masquer le menu, ajoutez l'événement mouseleave pour un menu.

Regroupez tous vos éléments de menu dans une balise span ou div . Et puis attachez-lui l'événement (mouseleave)

<button mat-icon-button [matMenuTriggerFor]="menu" 
    #menuTrigger="matMenuTrigger" (mouseenter)="menuTrigger.openMenu()">

Forked DEMO


5 commentaires

à la souris, le menu déroulant devrait aller


@PrashanthGH ajoute une autre liaison d'événement pour (mouseleave)


@Amit chigadani j'ai ajouté l'événement (mouseleave) mais il ne fonctionne pas correctement voici le blitz de pile stackblitz.com/edit/...


@PrashanthGH Hey vérifier la réponse mise à jour et la démo aussi


Cela devrait être le premier lien dans StackOverflow



0
votes

J'espère que cela vous aidera

utiliser la fonction (mouseenter) Angular-hover-stackblitz


0 commentaires

1
votes

MatMenuTrigger

Cette directive est destinée à être utilisée en conjonction avec un menu mat marque. Il est chargé de basculer l'affichage du menu fourni instance.

<button #r="matMenuTrigger" mat-icon-button [matMenuTriggerFor]="menu" >
      <mat-icon (mouseover)="open(r)"  >menu</mat-icon>
</button>

Exemple: https://stackblitz.com/edit/example-angular-material-toolbar-menu-wrut3v


0 commentaires

1
votes

remplace l'événement mouseover et crée la variable de référence #menuTrigger . cela résoudra votre problème.

  <button mat-icon-button [matMenuTriggerFor]="menu" #menuTrigger="matMenuTrigger" 
  (mouseover)="menuTrigger.openMenu()" >

J'ai mis à jour votre stackblitz


1 commentaires

si plusieurs menus, cela ne fonctionne pas. Quoi qu'il en soit, j'ai voté.



1
votes

Je sais que je suis très en retard à la fête, mais rien de ce qui précède n'a vraiment fait l'affaire pour moi. J'ai fini par écrire une directive, alors résolvez ce problème pour moi.

HoverDropDownDirective

<div *ngFor="let category of categories">
    <button #menuTrigger="matMenuTrigger"
            mat-button
            [matMenuTriggerFor]="children"
            (click)="navigateMain(category.Category)"

            hoverDropDown
            [menu]="children"
            [hoverTrigger]="menuTrigger">
             {{category.Category.Description}}
    </button>
    <mat-menu #children="matMenu" hasBackdrop="false">
        <button mat-menu-item *ngFor="let sub of category.SubCategories" (click)="navigateSubCategory(sub)">{{sub.Description}}</button>
    </mat-menu>
</div>

app.module

import { HoverDropDownDirectiveModule } from '../../directives/hover-drop-down.directive';

imports: [
    HoverDropDownDirectiveModule
]

HTML

import { NgModule } from '@angular/core';
import { Directive, Input, ElementRef, OnInit } from '@angular/core';
import { MatMenuTrigger, _MatMenu } from '@angular/material';

@Directive({
    selector: '[hoverDropDown]'
})
export class HoverDropDownDirective implements OnInit {
    isInHoverBlock = false;

    constructor(private el: ElementRef) {}

    @Input() hoverTrigger: MatMenuTrigger;
    @Input() menu: any;

    ngOnInit() {
        this.el.nativeElement.addEventListener('mouseenter', () => {
            this.setHoverState(true);
            this.hoverTrigger.openMenu();

            const openMenu = document.querySelector(`.mat-menu-after.${this.menu._elementRef.nativeElement.className}`);
            if (!openMenu) {
                this.hoverTrigger.closeMenu();
                return;
            }
            openMenu.addEventListener('mouseenter', () => {
                this.setHoverState(true);
            });
            openMenu.addEventListener('mouseleave', () => {
                this.setHoverState(false);
            });
        });
        this.el.nativeElement.addEventListener('mouseleave', () => {
            this.setHoverState(false);
        });
    }

    private setHoverState(isInBlock: boolean) {
        this.isInHoverBlock = isInBlock;
        if (!isInBlock) {
            this.checkHover();
        }
    }

    private checkHover() {
        setTimeout(() => {
            if (!this.isInHoverBlock && this.hoverTrigger.menuOpen) {
                this.hoverTrigger.closeMenu();
            }
        }, 50);
    }
}

@NgModule({
    declarations: [
        HoverDropDownDirective
    ],
    exports: [
        HoverDropDownDirective
    ]
})
export class HoverDropDownDirectiveModule {}

2 choses à noter:

  1. Les 3 attributs du bouton principal ("hoverDropDown", "[menu]" et "[hoverTrigger]")
  2. Attribut
  3. hasBackdrop = "false" dans le menu du tapis

L'attribut hasBackdrop = "false" est documenté sur Matériau angulaire . J'espère que cela fonctionne pour vous ...


1 commentaires

Fonctionne très bien pour plusieurs menus.