Skip to content

Commit 6165dbf

Browse files
committed
fix(material/slide-toggle): Fix a11y issues by hiding label when it has no content.
1 parent a947f68 commit 6165dbf

File tree

3 files changed

+40
-10
lines changed

3 files changed

+40
-10
lines changed

src/dev-app/slide-toggle/slide-toggle-demo.html

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,30 @@
11
<div class="demo-slide-toggle">
2-
<mat-slide-toggle color="primary" [(ngModel)]="firstToggle">Default Slide Toggle</mat-slide-toggle>
2+
<mat-slide-toggle color="primary" [(ngModel)]="firstToggle"
3+
>Default Slide Toggle</mat-slide-toggle
4+
>
35
<mat-slide-toggle [(ngModel)]="firstToggle" disabled>Disabled Slide Toggle</mat-slide-toggle>
46
<mat-slide-toggle [disabled]="firstToggle">Disable Bound</mat-slide-toggle>
5-
<mat-slide-toggle disabled disabledInteractive [(ngModel)]="firstToggle">Disabled Interactive Toggle</mat-slide-toggle>
7+
<mat-slide-toggle disabled disabledInteractive [(ngModel)]="firstToggle"
8+
>Disabled Interactive Toggle</mat-slide-toggle
9+
>
610
<mat-slide-toggle hideIcon [(ngModel)]="firstToggle">No icon</mat-slide-toggle>
711

812
<p>With label before the slide toggle.</p>
913

10-
<mat-slide-toggle labelPosition="before" color="primary" [(ngModel)]="firstToggle">Default Slide Toggle</mat-slide-toggle>
11-
<mat-slide-toggle labelPosition="before" [(ngModel)]="firstToggle" disabled>Disabled Slide Toggle</mat-slide-toggle>
14+
<mat-slide-toggle labelPosition="before" color="primary" [(ngModel)]="firstToggle"
15+
>Default Slide Toggle</mat-slide-toggle
16+
>
17+
<mat-slide-toggle labelPosition="before" [(ngModel)]="firstToggle" disabled
18+
>Disabled Slide Toggle</mat-slide-toggle
19+
>
1220
<mat-slide-toggle labelPosition="before" [disabled]="firstToggle">Disable Bound</mat-slide-toggle>
13-
<mat-slide-toggle labelPosition="before" hideIcon [(ngModel)]="firstToggle">No icon</mat-slide-toggle>
21+
<mat-slide-toggle labelPosition="before" hideIcon [(ngModel)]="firstToggle"
22+
>No icon</mat-slide-toggle
23+
>
24+
25+
<p>With no label.</p>
26+
27+
<mat-slide-toggle aria-label="Toggle only" hideLabel color="primary" [(ngModel)]="firstToggle" />
1428

1529
<p>Example where the slide toggle is required inside of a form.</p>
1630

src/material/slide-toggle/slide-toggle.scss

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ $fallbacks: m3-slide-toggle.get-tokens();
3333
}
3434
}
3535

36+
// Ensure no label element (with a click handler) present to ensure hidden from screen readers.
37+
label:empty {
38+
display: none;
39+
}
40+
3641
.mdc-switch__track {
3742
overflow: hidden;
3843
position: relative;
@@ -66,9 +71,13 @@ $fallbacks: m3-slide-toggle.get-tokens();
6671

6772
.mdc-switch--disabled & {
6873
border-width: token-utils.slot(
69-
slide-toggle-disabled-unselected-track-outline-width, $fallbacks);
74+
slide-toggle-disabled-unselected-track-outline-width,
75+
$fallbacks
76+
);
7077
border-color: token-utils.slot(
71-
slide-toggle-disabled-unselected-track-outline-color, $fallbacks);
78+
slide-toggle-disabled-unselected-track-outline-color,
79+
$fallbacks
80+
);
7281
}
7382
}
7483

@@ -223,7 +232,9 @@ $fallbacks: m3-slide-toggle.get-tokens();
223232

224233
&:has(.mdc-switch__icons) {
225234
margin: token-utils.slot(
226-
slide-toggle-unselected-with-icon-handle-horizontal-margin, $fallbacks);
235+
slide-toggle-unselected-with-icon-handle-horizontal-margin,
236+
$fallbacks
237+
);
227238
}
228239
}
229240

@@ -234,7 +245,9 @@ $fallbacks: m3-slide-toggle.get-tokens();
234245

235246
&:has(.mdc-switch__icons) {
236247
margin: token-utils.slot(
237-
slide-toggle-selected-with-icon-handle-horizontal-margin, $fallbacks);
248+
slide-toggle-selected-with-icon-handle-horizontal-margin,
249+
$fallbacks
250+
);
238251
}
239252
}
240253

@@ -275,7 +288,8 @@ $fallbacks: m3-slide-toggle.get-tokens();
275288
left: 0;
276289
position: absolute;
277290
top: 0;
278-
transition: background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),
291+
transition:
292+
background-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1),
279293
border-color 75ms 0ms cubic-bezier(0.4, 0, 0.2, 1);
280294
z-index: -1;
281295

src/material/slide-toggle/slide-toggle.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,8 @@ describe('MatSlideToggle with forms', () => {
654654

655655
it('should update checked state on click if control is checked initially', fakeAsync(() => {
656656
fixture = TestBed.createComponent(SlideToggleWithModel);
657+
fixture.detectChanges();
658+
657659
slideToggle = fixture.debugElement.query(By.directive(MatSlideToggle))!.componentInstance;
658660
labelElement = fixture.debugElement.query(By.css('label'))!.nativeElement;
659661

0 commit comments

Comments
 (0)