【问题标题】:Changing Rotation of Mat Expansion Indicator改变地垫膨胀指示器的旋转
【发布时间】:2019-11-13 03:06:01
【问题描述】:

我成功地将垫子指示器向左移动,而不是向右移动,并且我使用了变换属性使其在展开时向内转动。但是,我希望指标在展开时朝上,在折叠时朝下。如何正确设置它的样式以实现此目的:https://stackblitz.com/edit/indicatorrotation?file=styles.css

expansion-overview-example.css

  .mat-expansion-panel-header {
       flex-direction: row-reverse;
   } 

全局样式.css

  .mat-expansion-indicator::after {
      transform: rotate(225deg) !important;  
}

【问题讨论】:

  • 嗨!再次。将 globalstyle.css 设为 .mat-expansion-indicator::after { transform: rotate(45deg) !important; }
  • 嘿,感谢您的帮助。我试过了,但这会使箭头远离内容(从下到左)而不是朝向它(从下到右)

标签: css angular angular-material transform


【解决方案1】:

禁用默认动画:

<mat-expansion-panel-header [@.disabled]="true">

重写一些全局styles.scss中的样式

  .mat-expansion-panel {
    .mat-expansion-indicator {
      transition: transform .3s ease;

      &::after {
        transform: rotate(-135deg);
      }
    }

    &.mat-expanded {
      .mat-expansion-indicator {
        transform: rotate(40deg) !important;
      }
    }
  }

【讨论】:

    【解决方案2】:

    垫子扩展指示器的旋转由this animation 处理。在那里可以看到它很简单rotate(180deg)(顺时针180度)。指示器最初有rotate(45deg),当面板关闭时默认显示向下图标,当面板以顺时针动画打开时显示向上图标。

    当你应用旋转时;

    .mat-expansion-indicator::after {
        transform: rotate(225deg) !important;  
    }
    

    图标最初在面板关闭时向上旋转,单击时它顺时针旋转 180 度。此时,您无法在关闭时显示向下图标,在打开时无法显示向上图标,因为 rotate(225deg) 如果您更改它,您会因为动画顺时针开始而松动向内转动,但我们需要完全相反。

    最终不可能在不覆盖默认动画的情况下进行逆时针旋转。不幸的是,Angular Material 没有任何机制来覆盖默认动画 as seen here

    所以我的解决方案是完全禁用 mat-expansion-panel-header 上的默认动画并实现一个模仿 this animation 但逆时针方向的自定义指令。

    首先禁用mat-expansion-panel-header上的默认动画;

    &lt;mat-expansion-panel-header [@.disabled]="true"&gt;

    然后在styles.css 中创建新动画,并将same timing and behavior 作为默认动画。

    @keyframes inwards-open {
      0%   { transform: rotate(0deg); }
      100% { transform: rotate(-135deg); }
    }
    
    @keyframes inwards-close {
      0%   { transform: rotate(-135deg); }
      100% { transform: rotate(0deg); }
    }
    
    .openAnimate {
      animation: inwards-open 225ms cubic-bezier(0.4,0.0,0.2,1) !important;
    }
    
    .closeAnimate {
      animation: inwards-close 225ms cubic-bezier(0.4,0.0,0.2,1) !important;
    }
    

    并实现一个自定义指令,根据面板打开/关闭事件处理动画状态

    import { Directive, ElementRef, HostListener, AfterViewInit, OnDestroy } from '@angular/core';
    import { fromEvent, Subscription } from 'rxjs';
    
    @Directive({
      selector: '[appCustomMatExpansionToggle]'
    })
    export class CustomMatExpansionToggleDirective implements AfterViewInit, OnDestroy {
      private elem: HTMLSpanElement;
      private uns: Subscription;
      constructor(private elRef: ElementRef) {}
    
      ngAfterViewInit() {
        this.elem = this.elRef.nativeElement.querySelector(".mat-expansion-indicator");
    
        this.uns = fromEvent(this.elem, 'animationend').subscribe(() => {
          this.elem.classList.remove("openAnimate");
          this.elem.classList.remove("closeAnimate");
        });
      }
    
      @HostListener("opened")
      onOpen() {
        this.elem.classList.add("openAnimate");
      }
    
      @HostListener("closed")
      onClose() {
        this.elem.classList.add("closeAnimate");
      }
    
      ngOnDestroy() {
        this.uns.unsubscribe();
      }
    }
    

    最后将自定义指令应用到mat-expansion-panel

    <mat-expansion-panel appCustomMatExpansionToggle>
    

    这是一个工作演示https://stackblitz.com/edit/indicatorrotation-mp73uh

    【讨论】:

    • 谢谢,因为这是不可能的,我不知道是否值得我创建一个完整的自定义指令,但我会看到的。
    • 实际上,当我尝试上述解决方案时,我也是这么想的。这是我能想到的唯一解决方案。我还考虑了一些 CSS 解决方案,但最终动画必须被覆盖。所以我希望这会有所帮助。祝你有美好的一天。
    • 感谢您抽出时间来做这件事!
    猜你喜欢
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多