網站搜尋

html - 使用 Angular 2 動畫來創建手風琴導航


我正在嘗試在 Angular 2 中創建一個可折疊的手風琴菜單。目前我的代碼允許子菜單使用 Angular 2 動畫進行展開和收起。問題是當點擊父菜單時,我需要某個子菜單展開。

我目前的設置看起來是這樣的:

<nav>
<ul>
  <li>
    <span (click)="toggleSubMenu()">
      List Item 1
    </span>
    <ul [@subMenuToggle]="subMenuState" class="sub-menu">
      <li><a href="#">New</a></li>
      <li><a href="#">Edit</a></li>
      <li><a href="#">Remove</a></li>
    </ul>
  </li>
  <li>
    <span (click)="toggleSubMenu()">
      List Item 2
    </span>
    <ul [@subMenuToggle]="subMenuState" class="sub-menu">
      <li><a href="#">New</a></li>
      <li><a href="#">Edit</a></li>
      <li><a href="#">Remove</a></li>
    </ul>
  </li>
 </ul>
 </nav>

現在當我點擊主選單項目之一(列表項目 1 或 2)時,兩個子選單都會展開。(我只想要對應的子選單展開)

我目前的動畫觸發器看起來是這樣:

trigger('subMenuToggle',[
  state('subMenuSelected', style({opacity: '1', height: '*'})),
  state('subMenuDeselected', style({opacity: '0', height: '0px', overflow: 'hidden'})),
  transition('subMenuSelected <=> subMenuDeselected', [
    animate('150ms ease-out')
  ])
])

而 toggleSubMenu() 方法會改變狀態:

 export class NavSidebarComponent {

  subMenuState: string = 'subMenuDeselected';


  toggleSubMenu() {
    this.subMenuState = (this.subMenuState === 'subMenuSelected' ? 'subMenuDeselected' : 'subMenuSelected');
  }

}

有沒有一個好的方法可以使用 toggleSubMenu() 方法來判斷哪個菜單項被點擊,然後展開對應的子菜單?還是我必須為每個父菜單項分別創建一個切換方法?

謝謝

答案#1

我其實無法僅使用動畫就弄清楚這件事,除非為每個列表項目創建一個方法,因此我採取了不同的方式,決定為下拉效果創建一個自訂指令。在我的下拉指令中,我有:

import {Directive, HostBinding, HostListener} from '@angular/core';

@Directive({
  selector: '[appDropdown]'
})
export class DropdownDirective {

  @HostBinding('class.open') get opened() {
    return this.isOpen;
  }
  @HostListener('click') open() {
    this.isOpen = (this.isOpen === true ? false : true);
  }

  private isOpen = false;

}

這基本上會追蹤當元素被點擊時是 true 還是 false,並且每次點擊會在 true 和 false 之間切換。當為 true 時,它會將 .open CSS 類別添加到元素上。

在我創建指令後,我將它導入到我的導航元件中:

import { DropdownDirective } from "./dropdown.directive";

接下來,我將自訂下拉指令附加到我的元素上:

<nav>
<ul>
  <li>
    <span appDropdown>
      List Item 1
    </span>
    <ul class="sub-menu">
      <li><a href="#">New</a></li>
      <li><a href="#">Edit</a></li>
      <li><a href="#">Remove</a></li>
    </ul>
  </li>
  <li>
    <span appDropdown>
      List Item 2
    </span>
    <ul class="sub-menu">
      <li><a href="#">New</a></li>
      <li><a href="#">Edit</a></li>
      <li><a href="#">Remove</a></li>
    </ul>
  </li>
 </ul>
 </nav>

最後,我使用了 CSS 來實現實際的下拉動畫,方法是最初通過將子選單 <ul> 設為 height: 0; 和 opacity: 0; 來隱藏它,然後當 .open 類被添加到 span 元素時,我只是將子選單的樣式改為 opacity: 1; 和 height: 100%;

.sub-menu{
   opacity: 0;
   overflow: hidden;
   height: 0;
}

.open + ul.sub-menu {
    opacity: 1;
    height: 100%;
}

答案#2

你可以傳遞一個參數給 toggleSubMenu() 嗎?例如:

<span (click)="toggleSubMenu(1)">
  List Item 1
</span>