Requires that headings and labels describe the topic or purpose of the content or control.
Headings tell people what a section is about, and labels tell them what to enter in a field or what a control does. "Section 1", "Details" and "Field" tell them nothing. Screen reader users jump between headings and form fields, and they depend on what those say.
This criterion requires that headings and labels describe topic or purpose. It does not require that headings or labels exist, but when they do, they must be descriptive.
Screen reader users, who navigate by headings and form controls. People with cognitive or short-term memory difficulties, who rely on clear headings to predict content. People who read slowly or scan, who use headings to find what they need. Voice control users who select controls by label.
The European Accessibility Act (Directive (EU) 2019/882) applies to in-scope products and services placed on the market after 28 June 2025. Recital 47 names four principles for websites and mobile applications: perceivable, operable, understandable and robust. Descriptive headings and labels are part of "operable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 2.4.6 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.2.4.6 | Web pages | Web content must satisfy WCAG success criterion 2.4.6. |
| 10.2.4.6 | Non-web documents (PDF, Office files) | Documents must have descriptive headings and labels where the standard applies the criterion to them. |
| 11.2.4.6 | Non-web software (native mobile apps) | Software must have descriptive headings and labels. |
Whether and how the criterion applies to non-web documents is stated in clause 10 of the standard. Clause numbers follow the "9. + WCAG number" pattern of EN 301 549. In V3.2.1 the software clause is divided into further subclauses for open and closed functionality. Check the exact numbers in the standard when you cite them.
Standard version: EN 301 549 V4.1.1 (September 2026) is based on WCAG 2.2 and is the first version prepared specifically for the EAA. It has not yet been cited in the Official Journal of the European Union, so for now it is best treated as a voluntary technical route to the EAA's requirements. Once cited, it will give a presumption of conformity. The text of criterion 2.4.6 is the same in WCAG 2.1 and 2.2. It is a Level AA criterion.
A note on EAA scope: Article 2(4) of the Directive excludes certain content from the requirements, for example office file formats published before 28 June 2025 and archives that are not updated after that date. Content you publish or change after that date is not covered by these exclusions.
Directive (EU) 2019/882, EUR-Lex, opens in a new tab
A heading should tell users what the section is about.
Section 1
Details
More
Delivery options
Returns and refunds
Contact the support team
A label must say what to enter.
When the same field appears more than once, the label or its group must tell them apart.
A button label should say what will happen.
A heading must be marked up as one, and must describe the section. Do not use heading levels just for styling.
Opening hours
Opening hours
An icon alone is acceptable only when its meaning is widely understood. Otherwise add text.
In native apps, screen titles, section headers and control labels need the same quality, and the labels must be exposed to assistive technology.
import SwiftUI
struct AddressForm: View {
@State private var street = ""
var body: some View {
Form {
// Descriptive section header, marked as a heading
Section(header: Text("Delivery address")) {
// Avoid: TextField("Field 1", text: $street)
TextField("Street and house number", text: $street)
.textContentType(.streetAddressLine1)
}
}
}
}import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.semantics
@Composable
fun AddressForm() {
var street by remember { mutableStateOf("") }
Text(
"Delivery address",
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.semantics { heading() }
)
// Avoid: label = { Text("Field 1") }
OutlinedTextField(
value = street,
onValueChange = { street = it },
label = { Text("Street and house number") }
)
}