Директива атрибута ngStyle
в сочетании с назначенными функциями, которые используются в нескольких различных элементах ползунка, запускают преобразования CSS каждый раз, когда изменяется значение ползунка:
<!-- slider html template excerpt -->
<div class="mat-slider-wrapper" #sliderWrapper>
<div class="mat-slider-track-wrapper">
<div class="mat-slider-track-background" [ngStyle]="_trackBackgroundStyles"></div>
<div class="mat-slider-track-fill" [ngStyle]="_trackFillStyles"></div>
</div>
...
</div>
// slider component excerpt
get _trackBackgroundStyles(): { [key: string]: string } {
const axis = this.vertical ? 'Y' : 'X';
const scale = this.vertical ? `1, ${1 - this.percent}, 1` : `${1 - this.percent}, 1, 1`;
const sign = this._shouldInvertMouseCoords() ? '-' : '';
return {
// scale3d avoids some rendering issues in Chrome. See #12071.
transform: `translate${axis}(${sign}${this._thumbGap}px) scale3d(${scale})`
};
}
...
(см. Полный источник: MatSlider html source и MatSlider ts source ).
В связи с тем, как компонент создается и внедряется в диалоговое окно, здесь происходит преобразование в процессе инициализации. Поэтому для достижения желаемого поведения CSS-анимации должны быть (временно) отключены.
(возможно, очень хакерское, но работающее) решение - отключить анимацию, добавив класс к mat-slider
, который удалит переход и удалит этот класс после завершения инициализации:
<!-- insert.component.html -->
<mat-slider [ngClass]="{'disableAnimation':isAnimationDisabled}" min="0" max="100" [(ngModel)]="progressBarValue" (change)="changeProgress($event)"></mat-slider>
/* insert.component.css */
::ng-deep .disableAnimation *{
transition: none !important;
}
// insert.component.ts
...
@Component({
...
})
export class InsertComponent implements AfterViewInit {
...
isAnimationDisabled: boolean = true;
...
ngAfterViewInit() {
setTimeout(() => {
this.isAnimationDisabled = false;
})
}
}
Поскольку процесс инициализации завершается очень и очень быстро, в этом примере вам необходимо использовать setTimeout, в противном случае вы получите ExpressionChangedAfterItHasBeenCheckedError. Чтобы предотвратить это, вы также можете изменить ChangeDetectionStrategy на OnPush и вручную запустить обнаружение изменений после завершения инициализации.
Я создал Stackblitz , чтобы вы могли играть с ним.