Skip to content

Commit d429ecb

Browse files
simeonoffdaforkaraivanov
authored
fix(button): prevent initial transition flicker (#16858)
Define --_button-transition in button theme and temporarily disable transitions during init, restoring them on the next animation frame to avoid style flickering. --------- Co-authored-by: Alexander M <niron_hsc@yahoo.com> Co-authored-by: Radoslav Karaivanov <rkaraivanov@infragistics.com>
1 parent 96e024d commit d429ecb

2 files changed

Lines changed: 12 additions & 9 deletions

File tree

projects/igniteui-angular/core/src/core/styles/components/button/_button-theme.scss

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,6 @@
6161
$variant
6262
);
6363

64-
$button-transition: color var(--_init-transition, #{$time}) ease-in-out,
65-
background-color var(--_init-transition, #{$time}) ease-in-out,
66-
border-color var(--_init-transition, #{$time}) ease-in-out,
67-
box-shadow var(--_init-transition, #{$time}) ease-in-out;
68-
6964
$button-disabled-shadow: none;
7065

7166
$button-floating-width: rem(56px);
@@ -287,6 +282,12 @@
287282
}
288283

289284
%igx-button-display {
285+
--_button-transition:
286+
color var(--_init-transition, #{$time}) ease-in-out,
287+
background-color var(--_init-transition, #{$time}) ease-in-out,
288+
border-color var(--_init-transition, #{$time}) ease-in-out,
289+
box-shadow var(--_init-transition, #{$time}) ease-in-out;
290+
290291
@include sizable();
291292

292293
position: relative;
@@ -312,7 +313,7 @@
312313
-webkit-tap-highlight-color: transparent;
313314
overflow: hidden;
314315
white-space: nowrap;
315-
transition: $button-transition;
316+
transition: var(--_button-transition);
316317
gap: pad-inline(
317318
map.get($items-gap, 'compact'),
318319
map.get($items-gap, 'cosy'),
@@ -330,7 +331,7 @@
330331
width: var(--igx-icon-size, #{$icon-in-button-size});
331332
height: var(--igx-icon-size, #{$icon-in-button-size});
332333
font-size: var(--igx-icon-size, #{$icon-in-button-size});
333-
transition: $button-transition;
334+
transition: var(--_button-transition);
334335
}
335336
}
336337

@@ -525,7 +526,7 @@
525526
color: var-get($outlined-theme, 'focus-visible-foreground');
526527
border-color: var-get($outlined-theme, 'focus-visible-border-color');
527528

528-
@if $variant == 'material' or $variant == 'bootstrap' {
529+
@if $variant == 'material' or $variant == 'bootstrap' {
529530
igx-icon {
530531
color: var-get($outlined-theme, 'icon-color-hover');
531532
}
@@ -701,7 +702,7 @@
701702
align-items: center;
702703
outline: none;
703704
cursor: pointer;
704-
transition: $button-transition;
705+
transition: var(--_button-transition);
705706
user-select: none;
706707
-webkit-tap-highlight-color: transparent;
707708
overflow: hidden;

projects/igniteui-angular/directives/src/directives/button/button-base.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ export abstract class IgxButtonBaseDirective implements AfterViewInit, OnDestroy
105105
// Fix style flickering https://github.com/IgniteUI/igniteui-angular/issues/14759
106106
if (this._platformUtil.isBrowser) {
107107
this.element.nativeElement.style.setProperty('--_init-transition', '0s');
108+
this.element.nativeElement.style.setProperty('transition', 'none');
108109
}
109110
}
110111

@@ -114,6 +115,7 @@ export abstract class IgxButtonBaseDirective implements AfterViewInit, OnDestroy
114115

115116
this._animationScheduler = animationFrameScheduler.schedule(() => {
116117
this.element.nativeElement.style.removeProperty('--_init-transition');
118+
this.element.nativeElement.style.setProperty('transition', 'var(--_button-transition)');
117119
});
118120
}
119121
}

0 commit comments

Comments
 (0)