gpt4 book ai didi

css - 改变垫子扩展指示器的旋转

转载 作者:太空宇宙 更新时间:2023-11-04 00:47:08 25 4
gpt4 key购买 nike

我成功地将 mat Indicator 向左移动,而不是向右移动,并且我使用 transform 属性使其在展开时向内转动。但是,我希望指示器在展开时朝上,在折叠时朝下。我如何正确设置样式以实现此目的: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;
}

最佳答案

垫子扩展指示器的旋转由 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 上禁用默认动画;

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

然后在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 - 改变垫子扩展指示器的旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56852932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com