Bildbeskrivning: Vägskylt med en pil som pekar åt vänster och symboliserar riktning eller val.
Tillgängliga felmeddelanden
Tillgängliga felmeddelanden: Den fullständiga guiden
Varje formulärfält du skapar, varje validering du aktiverar, varje felmeddelande du visar – det är i dessa ögonblick som digitala produkter antingen inkluderar eller exkluderar miljontals människor. Så här gör du för att få allt rätt.
De dolda kostnaderna för meningslösa fel
Du har säkert stött på det: ett formulär som visar meddelandet ”Ogiltig inmatning” efter att du noggrant har skrivit in ditt telefonnummer. En kassa där ett fält markeras med rött utan någon förklaring. Ett felmeddelande med kryptiska koder som bara förstås av den utvecklare som skrev det klockan 23 på en fredagskväll.
Det här är inte bara små irritationsmoment i användarupplevelsen. För de 1,3 miljarder människor världen över som lever med någon form av funktionsnedsättning kan dåligt utformade felmeddelanden göra en digital produkt helt oanvändbar. För användare av skärmläsare är ett felmeddelande som bara byter färg osynligt. För användare med kognitiva funktionsnedsättningar kan en vag enradare som ”Något gick fel” vara förlamande. För någon som är beroende av röststyrning kan ett formulärfel som plötsligt tar fokus bryta hela arbetsflödet.
Tillgängliga felmeddelanden handlar inte om att lägga till ARIA-attribut i efterhand. De kräver ett genomtänkt språk, en lämplig DOM-struktur, visuella och icke-visuella signaler samt en djup respekt för mångfalden bland dina användare. Den här guiden går igenom alla aspekter av hur man får till det rätt – från WCAG-kriterier och principer för textförfattande till praktiska kodmönster.
Vi fokuserar på valideringsfel på klientsidan och serversidan i webbgränssnitt, även om de flesta principerna gäller i lika hög grad för mobilappar, kioskterminaler och röstgränssnitt. Om inget annat anges hänvisar vi till WCAG 2.2 AA.
Vad standarden faktiskt kräver
WCAG 2.2, som publicerades i oktober 2023, är den nuvarande standarden för webbtillgänglighet och utgångspunkten för de flesta rättsliga ramverk – däribland EU:s direktiv om webbtillgänglighet, den brittiska lagen om jämlikhet (Equality Act) och den amerikanska lagen ADA. Flera av framgångskriterierna gäller direkt för felmeddelanden. Det är viktigt att förstå bokstaven i varje kriterium innan man kan gå vidare och tillämpa dem i praktiken.
| Kriterium | Nivå | Vad som krävs | För felmeddelanden |
|---|---|---|---|
| 1.3.1 Information och relationer | A | Förmedla struktur och samband genom semantik, inte bara genom utformningen. | Ett felmeddelande som endast visas med hjälp av färg fungerar inte. Sambandet mellan ett fält och dess fel måste kunna fastställas programmatiskt – använd <label>, aria-invalid="true", och aria-describedby för att koppla feltexten till inmatningen. |
| 1.4.1 Användning av färg | A | Använd inte färg som det enda visuella sättet att förmedla information. | Röda kantlinjer räcker inte. Lägg till en ikon, en textetikett eller ett mönster. |
| 1.4.3 Kontrast (minimivärde) | AA | Texten måste ha ett kontrastförhållande på minst 4,5:1 (3:1 för stor text). | Feltexten i ljusrött (#f87171) på vit bakgrund uppnår endast ~2,93:1 – långt under det erforderliga värdet på 4,5:1. Använd mörkare nyanser: #b91c1c på vit bakgrund ger ~7,1:1 och klarar testet utan problem. |
| 2.4.3 Fokusordning | A | Ordningen måste bevara betydelsen och funktionaliteten. | Om fokus hanteras felaktigt efter ett misslyckat inlämningsförsök kan det bryta den logiska sekvensen (t.ex. om fokus hamnar efter felmeddelandet, vilket gör det oåtkomligt). Att flytta fokus till en felöversikt vid misslyckad inlämning är en rekommenderad teknik – främst för att uppfylla SC 3.3.1 och 3.3.2 – som dessutom säkerställer en sammanhängande fokusordning enligt 2.4.3. |
| 3.3.1 Felidentifiering | A | Om ett inmatningsfel upptäcks identifieras posten och felet beskrivs i text. | Felet måste beskrivas i text – det räcker inte med en visuell markering. |
| 3.3.2 Etiketter eller anvisningar | A | Ange etiketter eller instruktioner när innehållet kräver att användaren gör en inmatning. | Formateringsanvisningar (t.ex. ”DD/MM/ÅÅÅÅ”) måste finnas med redan vid inlämningen, inte bara när ett fel uppstår. |
| 3.3.3 Förslag på fel | AA | Om ett fel upptäcks och det finns kända lösningsförslag, ange dessa. | ”Ogiltigt datum” är otillräckligt. ”Ange ett datum i formatet DD/MM/ÅÅÅÅ, t.ex. 23/03/2026” är korrekt. |
| 3.3.4 Förebyggande av fel | AA | För juridiska, ekonomiska eller datarelaterade inlämningar: granska, bekräfta eller återkalla. | Låt användarna granska och korrigera innan den slutgiltiga inlämningen. |
| 4.1.3 Statusmeddelanden | AA | Statusmeddelanden kan fastställas programmatiskt utifrån roll eller egenskap utan att fönstret får fokus. | Användning role="alert", role="status", eller aria-live så att AT-användarna får meddelandet. |
Många team tolkar ”identifierade och beskrivna i text” som att det räcker med att lägga till en etikett. Men det fält där felet uppstått måste gå att identifiera – det vill säga att felmeddelandet antingen måste stå i anslutning till fältet eller så måste fältets namn förekomma i feltexten. ”Vänligen korrigera de markerade fälten” uppfyller inte detta krav.
Vad kännetecknar ett bra felmeddelande?
Ett välformulerat felmeddelande består av fyra komponenter som är absolut nödvändiga. Var och en av dem fyller ett specifikt syfte – tar du bort någon av dem försämras upplevelsen för en del av dina användare.
Språkramverket: Sex regler för felkopiering
Felmeddelanden är en form av UX-text. De är inte loggutskrifter. De är inte anteckningar för utvecklare. De är mänsklig kommunikation i en stressad situation – skrivna för någon som just har misslyckats med något och behöver lyckas.
1. Var konkret
Berätta för användaren exakt vad som är fel. ”Ogiltigt” säger ingenting. ”Lösenordet måste bestå av minst 8 tecken” säger allt.
2. Var konkret
Meddelandet bör antingen antyda eller direkt ange hur felet ska åtgärdas. Ange formatexempel om formatet inte är självklart.
3. Undvik att skylla på andra
Säg aldrig ”du angav”, ”din inmatning” eller ”du misslyckades”. Använd hellre passiva konstruktioner: ”Den angivna e-postadressen är ofullständig.”
4. Använd ett enkelt språk
Skriv på en läsnivå som motsvarar en 11-åring. Undvik jargong, tekniska uttryck och passivt-aggressiva formuleringar som ”försök igen”.
5. Välj rätt tidpunkt
Visa felmeddelanden direkt när användaren lämnar fältet, inte vid varje tangenttryckning. Visa sammanfattande felmeddelanden först efter att användaren har försökt skicka in formuläret.
6. Ta hänsyn till sammanhanget
Ett fel i betalningsformuläret kräver mer tröst än ett sökfilter. Anpassa tonen och detaljnivån efter hur viktig uppgiften är.
Verkliga felmeddelanden: före och efter
Skillnaden mellan ett svårbegripligt och ett begripligt felmeddelande är ofta bara några ord och två attribut. Dessa jämförelser visar exakt vad som förändras – och varför varje förändring är viktig.
Validering av obligatoriska fält
Problem: Identifierar inte vilket fält. Utför ingen åtgärd. Visas ofta endast med färgförändring (uppfyller inte 1.4.1). Nej role="alert" vilket innebär att skärmläsare inte läser upp det.
Varför det fungerar: Anger fältets namn. Förklarar varför det behövs. Kopplat till inmatningsfältet via aria-describedby. Textkontrast ≥ 4,5:1. Skärmläsare läser upp detta vid inlämning via role="alert".
Formatvalidering (datum)
Problem: Användaren vet inte vilket format som förväntas. Det anges vad som är fel, men inte hur man åtgärdar det. Uppfyller inte 3.3.3 (Felmeddelande). Inget exempel anges.
Varför det fungerar: Anger vilket format som krävs. Ger ett konkret exempel (uppfyller 3.3.3). Kortfattat och tydligt. Läses upp av skärmläsare direkt när fokus flyttas från fältet.
Lösenordsverifiering
Problem: ”Svag” är ett subjektivt begrepp och ger ingen tydlig väg framåt. Visas vanligtvis med en röd styrkebalk – vilket endast är visuell feedback (uppfyller inte 1.4.1). Det finns inget samband mellan balkens status och AT-utmatningen.
Varför det fungerar: Varje krav anges separat. Användarna kan gå igenom och åtgärda varje brist. Styrkeindikatorn kompletterar texten och använder både färg OCH textetiketter (”Svag / Stark”). Ingen information förmedlas enbart genom färg.
Server-/systemfel
Problem: Den tekniska koden är obegriplig för de flesta användare. Meddelandet ”Något gick fel” ger ingen vägledning om vad man ska göra. Inlagd i DOM utan interaktivt område – ger ingen feedback till skärmläsare. Inget förslag på hur man kan åtgärda problemet.
Varför det fungerar: Mänskligt språk. Bekräftar vad som gick fel. Ger två tydliga lösningar. Införs i en aria-live="assertive" området så att skärmläsare läser upp det direkt. Fokus flyttas till meddelandet.
Det bästa felmeddelandet är det som förhindrar att felet uppstår från första början. Det näst bästa felmeddelandet är det som gör det uppenbart hur man åtgärdar felet.
Felkoder och när man ska använda dem
Olika felsituationer kräver olika interaktionsmönster. Att välja fel behållare eller meddelandemekanism är ett av de vanligaste tillgänglighetsproblemen i formulär.
| Mönster | Bäst för | Implementering av ARIA | Fokusbeteende | Obligatoriskt |
|---|---|---|---|---|
| Fel i ett fält i texten | Omedelbar validering på fältnivå (vid fokusförskjutning) | aria-invalid="true" + aria-describedby |
Ingen fokusförflyttning. Ett fel hörs vid nästa fokusering av fältet. | Obligatoriskt |
| Banner med felöversikt | Fel vid inlämning av formulär med flera fält | role="alert" eller aria-live="assertive" |
Flytta fokus till rubriken ”Sammanfattning” vid inlämning. | Krävs för formulär med fler än tre fält |
| Meddelande från Toast/snackbaren | Fel som inte beror på formuläret (sparningen misslyckades, nätverksproblem) | role="alert" eller aria-live="assertive" |
Flytta INTE fokus. Stäng automatiskt efter ≥5 sekunder (eller aldrig). | Rekommenderas |
| Fel i modaldialogrutan | Bekräftelse av skadliga åtgärder, kritiska fel | role="dialog" + aria-modal="true" + aria-labelledby |
Flytta fokus till det första interaktiva elementet i dialogrutan. | Vid allvarliga/oåterkalleliga fel |
| Varningsområde på sidnivå | Serverfel uppstod efter att sidan laddats om | role="alert" at top of <main> |
Bör vara det första elementet som går att fokusera på efter hoppa-över-länken. | Måste laddas om den finns |
| Vänligt meddelande om status | Feedback med låg prioritet (sparas automatiskt, valfritt fält hoppas över) | aria-live="polite" + role="status" |
Ingen fokusförflyttning. Meddelas när det aktuella talet är avslutat. | Valfritt / beroende på sammanhanget |
Tvåskiktsmetoden för formulär med flera fält
För formulär med tre eller fler fält räcker det inte med ett enda visningssätt. Både Government Digital Service (GDS) och ARIA Authoring Practices Guide rekommenderar ett system med två nivåer: en felöversikt högst upp i formuläret samt felmeddelanden direkt bredvid varje berört fält.
Vid inlämning med fel: (1) Infoga en sammanfattning av felen högst upp i formuläret med en rubrik som ”Det finns 3 fel. Rätta till dessa för att fortsätta.” samt länkar till varje fält som innehåller fel. (2) Flytta tangentbordsfokus till den här rubriken. (3) Varje länk i sammanfattningen hoppar till motsvarande fält. (4) Varje fält visar sitt eget inbyggda felmeddelande med en länk via aria-describedby. Användare av skärmläsare hör båda lagren; seende användare ser båda lagren. Ingen lämnas utanför.
Kodmönster som fungerar
Att förstå teorin är halva jobbet. Nedan följer produktionsklara mallar för de vanligaste scenarierna, med kommentarer om vilka WCAG-kriterier varje attribut uppfyller.
Validering av fält i realtid
<!-- The label is always present and always linked --> <div class="field-group"> <label for="email"> Email address <span class="required-indicator" aria-label="required"> *</span> </label> <input type="email" id="email" name="email" autocomplete="email" aria-required="true" aria-invalid="true" <!-- set when invalid --> aria-describedby="email-hint email-error" /> <!-- Hint text always shown (WCAG 3.3.2) --> <p id="email-hint" class="field-hint"> We'll send your confirmation here. </p> <!-- Error message (shown only on error) --> <p id="email-error" class="field-error" role="alert" aria-live="assertive" > <!-- inject error text here --> Enter a complete email address — for example, [email protected] </p> </div>
Felöversikt (formulär med flera fält)
<!-- Inject this above the form on submission, then focus #error-summary --> <div id="error-summary" role="alert" aria-labelledby="error-summary-title" tabindex="-1" <!-- allows programmatic focus --> class="error-summary" > <h2 id="error-summary-title"> There are 2 errors. Fix these to continue. </h2> <ul> <li><a href="#email">Email address: enter a complete email</a></li> <li><a href="#dob">Date of birth: use DD/MM/YYYY format</a></li> </ul> </div> <!-- JavaScript: move focus to summary after injection --> <script> const summary = document.getElementById('error-summary'); summary.focus(); // fires after DOM update </script>
Dynamiska fel/AJAX-fel (sidan laddas inte om)
När fel returneras asynkront – till exempel från ett API-anrop – kan man inte förlita sig på att de visas automatiskt när sidan laddas. Här är ARIA-mönstret för live-regioner avgörande.
// Set up the live region once on page load (empty, hidden) // <div id="live-error" role="alert" aria-live="assertive" aria-atomic="true"></div> async function submitForm(data) { try { const res = await fetch('/api/save', { method: 'POST', body: data }); if (!res.ok) throw new Error(await res.text()); announceStatus('Your changes have been saved.', 'polite'); } catch (err) { announceStatus( 'We couldn\'t save your changes. Try again or contact support.', 'assertive' ); } } function announceStatus(message, urgency = 'polite') { const region = document.getElementById('live-error'); region.setAttribute('aria-live', urgency); // Clear first to re-trigger announcement if same message region.textContent = ''; requestAnimationFrame(() => { region.textContent = message; }); }
Skärmläsare läser endast upp innehåll som ändringar i en aktiv region. Om du infogar samma felmeddelande två gånger i rad kommer vissa AT-enheter inte att läsa upp det igen. Lösningen: rensa regionen till en tom sträng och fyll sedan i den i en requestAnimationFrame återanrop. Detta tvingar fram den DOM-ändring som AT lyssnar efter.
Checklista för granskning av tillgänglighet
Använd denna checklista vid granskning av design, kodgranskning och kvalitetssäkring. Den täcker alla kriterier på nivå A och nivå AA i WCAG 2.2 som är relevanta för felmeddelanden.
Bild och innehåll
- Felmeddelanden ska förmedlas genom text, inte enbart genom färg (WCAG 1.4.1)
- Feltexten har ett kontrastförhållande på minst 4,5:1 mot bakgrunden (WCAG 1.4.3)
- En ikon eller en visuell markör kompletterar färgförändringen
- Felmeddelandet nämner fältet eller ligger fysiskt intill det
- Felmeddelandet förklarar vad som är fel (inte bara ”ogiltigt”)
- Felmeddelandet innehåller information om hur felet åtgärdas (WCAG 3.3.3)
- Det finns formatexempel för datum, telefonnummer, postnummer och liknande fält
- Språket är enkelt, icke-tekniskt och undviker att lägga skulden på någon
- Felmeddelandet försvinner inte förrän felet har åtgärdats
- Formateringsanvisningar (t.ex. ”DD/MM/ÅÅÅÅ”) visas innan inlämning, inte bara vid fel
Programmatisk annonsering och hjälpmedel
aria-invalid="true"är inställd på den felaktiga inmatningen- Felmeddelandet är länkat via
aria-describedbyvid ingången - Användningsområden för felbehållare
role="alert"elleraria-live="assertive" - Felområdet är inte tomt i DOM innan några fel finns (förifylld tom behållare)
- En felöversikt infogas och lyfts fram automatiskt vid misslyckad formulärinlämning
- Länkarna i felöversikten leder till motsvarande formulärfält
- Testningen med skärmläsare har godkänts i NVDA/Firefox och VoiceOver/Safari
- Sidans titel uppdateras för att visa felstatus vid inlämning av helsidesformulär
- Användning av statusmeddelanden
role="status"medaria-live="polite"för icke-kritisk feedback
Fokus och tangentbord
- Fokus flyttas till felöversikten (eller fältet för det första felet) efter att inlämningen misslyckats
- Fokusindikatorn är tydligt synlig på alla interaktiva element som befinner sig i ett felstillstånd (WCAG 2.4.11)
- Modala felrutor låser fokus inom rutan
- När man avbryter ett fel (t.ex. genom att stänga ett popup-fönster) återgår fokus till en logisk position
- Ingen felhantering kräver en pekdon
- Timeout-fel ger tillräcklig varning och tid för att förlänga sessionen (WCAG 2.2.1)
WCAG 3.3.6 (Felförebyggande – Alla) kräver att användarna ska kunna granska, bekräfta och ångra alla inlämningar – inte bara ekonomiska sådana. Även om detta är en AAA-krav och inte lagstadgat i de flesta sammanhang, minskar det avsevärt den stress som fel kan orsaka hos användare med kognitiva funktionsnedsättningar. Betrakta det som en guldstandard som är värd att eftersträva.
Hur vi hamnade här: En kort tidslinje
role="alert" och aria-live mönster. Nu är det äntligen möjligt att uppnå enhetligt stöd i webbläsare och hjälpmedel för dynamiska felmeddelanden.
Felmeddelanden som en spegel av produktens värden
Felmeddelandet är ett av de mest avslöjande ögonblicken i varje digital upplevelse. Det dyker upp just när användaren befinner sig i en stressad situation – när hen har gjort ett misstag eller när något utanför hens kontroll har gått fel. Hur du agerar i det ögonblicket säger allt om hur seriöst du tar inkludering.
En röd ram utan text är inte ett felmeddelande. En kodutskrift är inte ett felmeddelande. Ett vagt ”något gick fel” är inte ett felmeddelande. Ett tillgängligt felmeddelande är ett tydligt, vänligt och konkret meddelande som fungerar för alla – inklusive de 26 % av användarna som har någon form av funktionsnedsättning, de 15 % som förlitar sig på tangentbordsnavigering och de 100 % av användarna som någon gång kommer att stöta på ett fel.
Tillgänglighet är inte en funktion. Det är ett kvalitetskännetecken för varje funktion ni lanserar – och det är i felmeddelandena som denna kvalitet sätts på prov under de tuffaste förhållandena.
Den goda nyheten är att det kräver mycket lite extra arbete att skapa tillgängliga felmeddelanden om man tar hänsyn till detta redan från början. ARIA-attributen är få. Riktlinjerna för texterna är tydliga. Mönstren är väl etablerade. Det som krävs är en medveten vilja – ett medvetet beslut att testa med hjälpmedel, att skriva för människor istället för system och att se varje fel som en möjlighet att vinna förtroende.
På AIOPSGROUP, ett företag inom valantic-koncernen, utvecklar vi digitala produkter som fungerar för alla. Tillgänglighetsarbete är en integrerad del av vårt designsystem, våra kodgranskningar och vår kvalitetssäkringsprocess – det är inte något som läggs till i efterhand. Om ditt team behöver hjälp med att granska, implementera eller bygga upp ett tillgängligt designsystem från grunden, står vi gärna till tjänst.
WCAG 2.2 – Snabbguide — Hjälp vid inmatning · Guide till ARIA-utformning · GDS-komponent för felmeddelanden · WebAIM Million Report 2024