Skip to content

Commit d4623ff

Browse files
crisbetojelbourn
authored andcommitted
fix(slider): track not being rendered under some conditions when using a thumb label (#12079)
Fixes a rendering issue where the slider track won't be rendered when starting a drag from 0% or 100% while the thumb label is enabled. Fixes #12071.
1 parent 25eb43f commit d4623ff

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

src/lib/slider/slider.spec.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,21 @@ describe('MatSlider', () => {
9393
});
9494

9595
it('should update the track fill on click', () => {
96-
expect(trackFillElement.style.transform).toContain('scaleX(0)');
96+
expect(trackFillElement.style.transform).toContain('scale3d(0, 1, 1)');
9797

9898
dispatchClickEventSequence(sliderNativeElement, 0.39);
9999
fixture.detectChanges();
100100

101-
expect(trackFillElement.style.transform).toContain('scaleX(0.39)');
101+
expect(trackFillElement.style.transform).toContain('scale3d(0.39, 1, 1)');
102102
});
103103

104104
it('should update the track fill on slide', () => {
105-
expect(trackFillElement.style.transform).toContain('scaleX(0)');
105+
expect(trackFillElement.style.transform).toContain('scale3d(0, 1, 1)');
106106

107107
dispatchSlideEventSequence(sliderNativeElement, 0, 0.86, gestureConfig);
108108
fixture.detectChanges();
109109

110-
expect(trackFillElement.style.transform).toContain('scaleX(0.86)');
110+
expect(trackFillElement.style.transform).toContain('scale3d(0.86, 1, 1)');
111111
});
112112

113113
it('should add and remove the mat-slider-sliding class when sliding', () => {
@@ -330,15 +330,15 @@ describe('MatSlider', () => {
330330
fixture.detectChanges();
331331

332332
// The closest snap is halfway on the slider.
333-
expect(trackFillElement.style.transform).toContain('scaleX(0.5)');
333+
expect(trackFillElement.style.transform).toContain('scale3d(0.5, 1, 1)');
334334
});
335335

336336
it('should snap the fill to the nearest value on slide', () => {
337337
dispatchSlideEventSequence(sliderNativeElement, 0, 0.74, gestureConfig);
338338
fixture.detectChanges();
339339

340340
// The closest snap is at the halfway point on the slider.
341-
expect(trackFillElement.style.transform).toContain('scaleX(0.5)');
341+
expect(trackFillElement.style.transform).toContain('scale3d(0.5, 1, 1)');
342342
});
343343

344344
it('should adjust fill and ticks on mouse enter when min changes', () => {
@@ -348,7 +348,7 @@ describe('MatSlider', () => {
348348
dispatchMouseenterEvent(sliderNativeElement);
349349
fixture.detectChanges();
350350

351-
expect(trackFillElement.style.transform).toContain('scaleX(0.75)');
351+
expect(trackFillElement.style.transform).toContain('scale3d(0.75, 1, 1)');
352352
expect(ticksElement.style.backgroundSize).toBe('75% 2px');
353353
// Make sure it cuts off the last half tick interval.
354354
expect(ticksElement.style.transform).toContain('translateX(37.5%)');
@@ -365,7 +365,7 @@ describe('MatSlider', () => {
365365
dispatchMouseenterEvent(sliderNativeElement);
366366
fixture.detectChanges();
367367

368-
expect(trackFillElement.style.transform).toContain('scaleX(0.5)');
368+
expect(trackFillElement.style.transform).toContain('scale3d(0.5, 1, 1)');
369369
expect(ticksElement.style.backgroundSize).toBe('50% 2px');
370370
// Make sure it cuts off the last half tick interval.
371371
expect(ticksElement.style.transform).toContain('translateX(25%)');
@@ -440,7 +440,7 @@ describe('MatSlider', () => {
440440
fixture.detectChanges();
441441

442442
// The closest step is at 75% of the slider.
443-
expect(trackFillElement.style.transform).toContain('scaleX(0.75)');
443+
expect(trackFillElement.style.transform).toContain('scale3d(0.75, 1, 1)');
444444
});
445445

446446
it('should set the correct step value on slide', () => {
@@ -455,7 +455,7 @@ describe('MatSlider', () => {
455455
fixture.detectChanges();
456456

457457
// The closest snap is at the end of the slider.
458-
expect(trackFillElement.style.transform).toContain('scaleX(1)');
458+
expect(trackFillElement.style.transform).toContain('scale3d(1, 1, 1)');
459459
});
460460

461461
it('should round the value inside the label based on the provided step', () => {
@@ -671,15 +671,15 @@ describe('MatSlider', () => {
671671

672672
it('should initialize based on bound value', () => {
673673
expect(sliderInstance.value).toBe(50);
674-
expect(trackFillElement.style.transform).toContain('scaleX(0.5)');
674+
expect(trackFillElement.style.transform).toContain('scale3d(0.5, 1, 1)');
675675
});
676676

677677
it('should update when bound value changes', () => {
678678
testComponent.val = 75;
679679
fixture.detectChanges();
680680

681681
expect(sliderInstance.value).toBe(75);
682-
expect(trackFillElement.style.transform).toContain('scaleX(0.75)');
682+
expect(trackFillElement.style.transform).toContain('scale3d(0.75, 1, 1)');
683683
});
684684
});
685685

@@ -707,7 +707,7 @@ describe('MatSlider', () => {
707707
});
708708

709709
it('should set the fill to the min value', () => {
710-
expect(trackFillElement.style.transform).toContain('scaleX(0)');
710+
expect(trackFillElement.style.transform).toContain('scale3d(0, 1, 1)');
711711
});
712712
});
713713

@@ -735,7 +735,7 @@ describe('MatSlider', () => {
735735
});
736736

737737
it('should set the fill to the max value', () => {
738-
expect(trackFillElement.style.transform).toContain('scaleX(1)');
738+
expect(trackFillElement.style.transform).toContain('scale3d(1, 1, 1)');
739739
});
740740
});
741741

@@ -1173,24 +1173,24 @@ describe('MatSlider', () => {
11731173
});
11741174

11751175
it('should update the track fill on click', () => {
1176-
expect(trackFillElement.style.transform).toContain('scaleY(0)');
1176+
expect(trackFillElement.style.transform).toContain('scale3d(1, 0, 1)');
11771177

11781178
dispatchClickEventSequence(sliderNativeElement, 0.39);
11791179
fixture.detectChanges();
11801180

1181-
expect(trackFillElement.style.transform).toContain('scaleY(0.61)');
1181+
expect(trackFillElement.style.transform).toContain('scale3d(1, 0.61, 1)');
11821182
});
11831183

11841184
it('should update the track fill on click in inverted mode', () => {
11851185
testComponent.invert = true;
11861186
fixture.detectChanges();
11871187

1188-
expect(trackFillElement.style.transform).toContain('scaleY(0)');
1188+
expect(trackFillElement.style.transform).toContain('scale3d(1, 0, 1)');
11891189

11901190
dispatchClickEventSequence(sliderNativeElement, 0.39);
11911191
fixture.detectChanges();
11921192

1193-
expect(trackFillElement.style.transform).toContain('scaleY(0.39)');
1193+
expect(trackFillElement.style.transform).toContain('scale3d(1, 0.39, 1)');
11941194
});
11951195

11961196
it('should have aria-orientation vertical', () => {

src/lib/slider/slider.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -339,19 +339,25 @@ export class MatSlider extends _MatSliderMixinBase
339339

340340
/** CSS styles for the track background element. */
341341
get _trackBackgroundStyles(): { [key: string]: string } {
342-
let axis = this.vertical ? 'Y' : 'X';
343-
let sign = this._invertMouseCoords ? '-' : '';
342+
const axis = this.vertical ? 'Y' : 'X';
343+
const scale = this.vertical ? `1, ${1 - this.percent}, 1` : `${1 - this.percent}, 1, 1`;
344+
const sign = this._invertMouseCoords ? '-' : '';
345+
344346
return {
345-
'transform': `translate${axis}(${sign}${this._thumbGap}px) scale${axis}(${1 - this.percent})`
347+
// scale3d avoids some rendering issues in Chrome. See #12071.
348+
transform: `translate${axis}(${sign}${this._thumbGap}px) scale3d(${scale})`
346349
};
347350
}
348351

349352
/** CSS styles for the track fill element. */
350353
get _trackFillStyles(): { [key: string]: string } {
351-
let axis = this.vertical ? 'Y' : 'X';
352-
let sign = this._invertMouseCoords ? '' : '-';
354+
const axis = this.vertical ? 'Y' : 'X';
355+
const scale = this.vertical ? `1, ${this.percent}, 1` : `${this.percent}, 1, 1`;
356+
const sign = this._invertMouseCoords ? '' : '-';
357+
353358
return {
354-
'transform': `translate${axis}(${sign}${this._thumbGap}px) scale${axis}(${this.percent})`
359+
// scale3d avoids some rendering issues in Chrome. See #12071.
360+
transform: `translate${axis}(${sign}${this._thumbGap}px) scale3d(${scale})`
355361
};
356362
}
357363

0 commit comments

Comments
 (0)