Skip to content

Commit 4699f30

Browse files
authored
fix(progress-bar): buffer not rendering correctly on ios (#19346)
Switches to using a 3d transform for the progress bar in order to avoid a rendering issue in `buffer` mode on iOS Safari. Fixes #19328.
1 parent 49927ae commit 4699f30

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

src/material/progress-bar/progress-bar.spec.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -75,27 +75,27 @@ describe('MatProgressBar', () => {
7575
const progressElement = fixture.debugElement.query(By.css('mat-progress-bar'))!;
7676
const progressComponent = progressElement.componentInstance;
7777

78-
expect(progressComponent._primaryTransform()).toEqual({transform: 'scaleX(0)'});
78+
expect(progressComponent._primaryTransform()).toEqual({transform: 'scale3d(0, 1, 1)'});
7979
expect(progressComponent._bufferTransform()).toBe(null);
8080

8181
progressComponent.value = 40;
82-
expect(progressComponent._primaryTransform()).toEqual({transform: 'scaleX(0.4)'});
82+
expect(progressComponent._primaryTransform()).toEqual({transform: 'scale3d(0.4, 1, 1)'});
8383
expect(progressComponent._bufferTransform()).toBe(null);
8484

8585
progressComponent.value = 35;
8686
progressComponent.bufferValue = 55;
87-
expect(progressComponent._primaryTransform()).toEqual({transform: 'scaleX(0.35)'});
87+
expect(progressComponent._primaryTransform()).toEqual({transform: 'scale3d(0.35, 1, 1)'});
8888
expect(progressComponent._bufferTransform()).toBe(null);
8989

9090
progressComponent.mode = 'buffer';
91-
expect(progressComponent._primaryTransform()).toEqual({transform: 'scaleX(0.35)'});
92-
expect(progressComponent._bufferTransform()).toEqual({transform: 'scaleX(0.55)'});
91+
expect(progressComponent._primaryTransform()).toEqual({transform: 'scale3d(0.35, 1, 1)'});
92+
expect(progressComponent._bufferTransform()).toEqual({transform: 'scale3d(0.55, 1, 1)'});
9393

9494

9595
progressComponent.value = 60;
9696
progressComponent.bufferValue = 60;
97-
expect(progressComponent._primaryTransform()).toEqual({transform: 'scaleX(0.6)'});
98-
expect(progressComponent._bufferTransform()).toEqual({transform: 'scaleX(0.6)'});
97+
expect(progressComponent._primaryTransform()).toEqual({transform: 'scale3d(0.6, 1, 1)'});
98+
expect(progressComponent._bufferTransform()).toEqual({transform: 'scale3d(0.6, 1, 1)'});
9999
});
100100

101101
it('should prefix SVG references with the current path', () => {

src/material/progress-bar/progress-bar.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,9 @@ export class MatProgressBar extends _MatProgressBarMixinBase implements CanColor
172172

173173
/** Gets the current transform value for the progress bar's primary indicator. */
174174
_primaryTransform() {
175+
// We use a 3d transform to work around some rendering issues in iOS Safari. See #19328.
175176
const scale = this.value / 100;
176-
return {transform: `scaleX(${scale})`};
177+
return {transform: `scale3d(${scale}, 1, 1)`};
177178
}
178179

179180
/**
@@ -182,8 +183,9 @@ export class MatProgressBar extends _MatProgressBarMixinBase implements CanColor
182183
*/
183184
_bufferTransform() {
184185
if (this.mode === 'buffer') {
186+
// We use a 3d transform to work around some rendering issues in iOS Safari. See #19328.
185187
const scale = this.bufferValue / 100;
186-
return {transform: `scaleX(${scale})`};
188+
return {transform: `scale3d(${scale}, 1, 1)`};
187189
}
188190
return null;
189191
}

0 commit comments

Comments
 (0)