Skip to content

Commit ea3a01e

Browse files
michaelthejelbourn
authored andcommitted
fix(progress spinner) : fix flickering animation (#9833)
1 parent 06b4017 commit ea3a01e

File tree

2 files changed

+25
-14
lines changed

2 files changed

+25
-14
lines changed

src/lib/progress-spinner/progress-spinner.scss

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,24 +69,31 @@ $_mat-progress-spinner-default-circumference: $pi * $_mat-progress-spinner-defau
6969
stylelint-disable declaration-block-single-line-max-declarations,
7070
declaration-block-semicolon-space-after
7171
*/
72+
73+
// .0001 percentage difference is necessary in order to avoid unwanted animation frames
74+
// for example because the animation duration is 4 seconds, .1% accounts to 4ms
75+
// which are enough to see the flicker described in
76+
// https://github.com/angular/material2/issues/8984
77+
//
78+
// NOTE: this is replaced by js for any diameter other that 100
7279
0% { stroke-dashoffset: $start; transform: rotate(0); }
7380
12.5% { stroke-dashoffset: $end; transform: rotate(0); }
74-
12.51% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(72.5deg); }
81+
12.5001% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(72.5deg); }
7582
25% { stroke-dashoffset: $start; transform: rotateX(180deg) rotate(72.5deg); }
7683

77-
25.1% { stroke-dashoffset: $start; transform: rotate(270deg); }
84+
25.0001% { stroke-dashoffset: $start; transform: rotate(270deg); }
7885
37.5% { stroke-dashoffset: $end; transform: rotate(270deg); }
79-
37.51% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(161.5deg); }
86+
37.5001% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(161.5deg); }
8087
50% { stroke-dashoffset: $start; transform: rotateX(180deg) rotate(161.5deg); }
8188

82-
50.01% { stroke-dashoffset: $start; transform: rotate(180deg); }
89+
50.0001% { stroke-dashoffset: $start; transform: rotate(180deg); }
8390
62.5% { stroke-dashoffset: $end; transform: rotate(180deg); }
84-
62.51% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(251.5deg); }
91+
62.5001% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(251.5deg); }
8592
75% { stroke-dashoffset: $start; transform: rotateX(180deg) rotate(251.5deg); }
8693

87-
75.01% { stroke-dashoffset: $start; transform: rotate(90deg); }
94+
75.0001% { stroke-dashoffset: $start; transform: rotate(90deg); }
8895
87.5% { stroke-dashoffset: $end; transform: rotate(90deg); }
89-
87.51% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(341.5deg); }
96+
87.5001% { stroke-dashoffset: $end; transform: rotateX(180deg) rotate(341.5deg); }
9097
100% { stroke-dashoffset: $start; transform: rotateX(180deg) rotate(341.5deg); }
9198
// stylelint-enable
9299
}

src/lib/progress-spinner/progress-spinner.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,30 @@ export class MatProgressSpinnerBase {
4444
}
4545
export const _MatProgressSpinnerMixinBase = mixinColor(MatProgressSpinnerBase, 'primary');
4646

47+
// .0001 percentage difference is necessary in order to avoid unwanted animation frames
48+
// for example because the animation duration is 4 seconds, .1% accounts to 4ms
49+
// which are enough to see the flicker described in
50+
// https://github.com/angular/material2/issues/8984
4751
const INDETERMINATE_ANIMATION_TEMPLATE = `
4852
@keyframes mat-progress-spinner-stroke-rotate-DIAMETER {
4953
0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }
5054
12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }
51-
12.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
55+
12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
5256
25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
5357
54-
25.1% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }
58+
25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }
5559
37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }
56-
37.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
60+
37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
5761
50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
5862
59-
50.01% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }
63+
50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }
6064
62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }
61-
62.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
65+
62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
6266
75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
6367
64-
75.01% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }
68+
75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }
6569
87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }
66-
87.51% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
70+
87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
6771
100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
6872
}
6973
`;

0 commit comments

Comments
 (0)