Requires that color is not the only way to convey information, show an action or tell elements apart, so people who cannot see color still get the meaning.
About one in twelve men and one in two hundred women have a color vision difference. Many more people use a screen in bright light, in grayscale or with a high contrast mode, and blind users cannot see color at all. If color is the only thing that tells them something, they miss it.
This criterion requires that color is not the only visual means of conveying information, indicating an action, prompting a response or distinguishing a visual element. Color can still be used, as long as another cue, such as text, a shape, a pattern or an underline, carries the same meaning.
People with color vision differences cannot tell some colors apart. Blind users get no information from color. People with low vision, people who use a screen in strong light, people who use grayscale, high contrast or forced colors modes, and people who print in black and white also lose color cues. Clear text and symbols help everyone, including people with cognitive differences.
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. Information that does not depend on color alone is part of "perceivable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 1.4.1 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.1.4.1 | Web pages | Web content must satisfy WCAG success criterion 1.4.1. |
| 10.1.4.1 | Non-web documents (PDF, Office files) | The same criterion applies to documents, such as charts and highlighted text in a PDF. |
| 11.1.4.1 | Non-web software (native mobile apps) | Software that supports screen readers must satisfy the criterion. |
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 1.4.1 is the same in WCAG 2.1 and 2.2.
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 link in running text needs a cue other than color. An underline is the simplest one.
a { color: #0066cc; text-decoration: none; }a { color: #0066cc; text-decoration: underline; }Show the error in text, and connect it to the field. Color and an icon can support it.
<label for="email">Email</label>
<input id="email" style="border: 2px solid red"><label for="email">Email</label>
<input id="email" aria-invalid="true"
aria-describedby="email-error"
style="border: 2px solid #c62828">
<p id="email-error" class="error">
<span aria-hidden="true">⚠</span>
Error: enter an email address, for example [email protected].
</p>Say that a field is required in its label.
<label for="name" style="color:red">Name</label>
<input id="name"><label for="name">Name <span>(required)</span></label>
<input id="name" required>A colored dot alone does not say anything to a user who cannot see the color.
<span class="dot dot-green"></span><span class="dot dot-green" aria-hidden="true"></span>
<span>Online</span>When lines or bars differ only by color, add direct labels or different markers and patterns.
<!-- Three lines, red, green and blue, with a color legend -->
<svg>…</svg><!-- Three lines with direct labels and different markers -->
<svg>
<path d="…" stroke="#c62828" />
<text x="300" y="40">Sales ●</text>
<path d="…" stroke="#2e7d32" stroke-dasharray="6 4" />
<text x="300" y="90">Costs ▲</text>
</svg>Mark the selected item with more than a color change, for example a bold weight, a check or an underline, and expose the state in code.
.tab { color: #666; }
.tab.active { color: #0066cc; }.tab { color: #595959; }
.tab[aria-selected="true"] {
color: #0b5fff;
font-weight: 700;
border-bottom: 3px solid currentColor;
}The same rule applies in native mobile apps. Pair every color with an icon or text, and make sure the accessibility label states the status too.
import SwiftUI
struct StatusRow: View {
let online: Bool
var body: some View {
HStack(spacing: 8) {
// Color + icon + text, not color alone
Image(systemName: online ? "checkmark.circle.fill" : "xmark.circle.fill")
.foregroundStyle(online ? .green : .red)
.accessibilityHidden(true)
Text(online ? "Online" : "Offline")
}
.accessibilityElement(children: .combine)
}
}import androidx.compose.foundation.layout.Row
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.CheckCircle
import androidx.compose.material.icons.filled.Cancel
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.semantics.semantics
@Composable
fun StatusRow(online: Boolean) {
// Color + icon + text, not color alone
Row(modifier = Modifier.semantics(mergeDescendants = true) {}) {
Icon(
imageVector = if (online) Icons.Filled.CheckCircle else Icons.Filled.Cancel,
contentDescription = null,
tint = if (online) Color(0xFF2E7D32) else Color(0xFFC62828)
)
Text(if (online) "Online" else "Offline")
}
}aria-invalid and aria-selected?