Knapp
en kontroll som en person trycker på för att något ska hända
Vad det är
En knapp är den del av ett gränssnitt som utför något när den aktiveras: skickar
ett meddelande, sparar ett utkast, öppnar en dialog, stänger av ljudet i ett
samtal. På webben är den oftast HTML-elementet <button>, och i
tillgänglighetssammanhang är det allt som bär rollen button. Tryckknapp är ett
äldre namn på samma sak, och i kod och specifikationer heter den button.
WAI-ARIA 1.2 beskriver rollen som en inmatning där användaren utlöser en
handling genom att klicka eller trycka, och påpekar att knappar mest används för
avgränsade handlingar. En vanlig kommandoknapp minns ingenting. En
växlingsknapp, markerad med aria-pressed, förblir på eller av tills någon
trycker igen, och en menyknapp, markerad med aria-haspopup, öppnar en lista
med fler val.
Den gräns som betyder mest går mellan knapp och länk. En länk för läsaren någon annanstans; en knapp ändrar något där läsaren redan befinner sig. ARIA Authoring Practices Guide (APG) kallar de två funktionerna tydligt åtskilda. När en länk har ritats som en knapp, eller tvärtom, föredrar guiden att den visuella designen ändras så att den passar funktionen, framför att elementet lånar den andras roll.
HTML Living Standard beskriver <button> som en knapp vars etikett är dess
innehåll. Attributet type har tre nyckelord. submit skickar formuläret som
knappen hör till, reset återställer formulärets fält till startvärdena och
button gör ingenting av sig själv, utan lämnar handlingen åt ett skript.
Saknas type, eller är det felstavat, hamnar knappen i tillståndet Auto, och en
sådan knapp i ett formulär, utan något kommando kopplat till sig, är en
skickaknapp. Inget interaktivt innehåll får ligga inuti den: ingen länk, inget
fält och ingen andra knapp.
Standarden låter också en knapp verka på ett annat element utan skript.
commandfor pekar ut målet med dess ID, och command säger vad som ska göras
med det, till exempel att visa en popover eller öppna en dialog som modal. Hur
mycket av det en viss webbläsare har levererat är en fråga för den webbläsarens
egna versionsanteckningar.
Varför det spelar roll
Knappen är platsen där läsning blir handling: att köpa, skicka, spara och radera går alla genom en. En knapp som vissa människor inte hittar, når eller förstår stänger ute dem från just den del av produkten som betalar för resten.
Det riktiga elementet har beteendet med sig. En <button> tar emot
tangentbordsfokus, kör sin handling på mellanslag och på Enter, berättar för
hjälpmedlen att den är en knapp och vad den heter, och slutar svara när den bär
disabled. I förklaringsdokumentet till WCAG 2.2 för framgångskriterium 4.1.2,
Name, Role, Value, står att vanliga HTML-kontroller redan uppfyller kriteriet
när de används enligt specifikationen. En <div> med en klickhanterare har
inget av detta, och varje bit som fattas stänger ute någon.
Namnet är ett löfte. En skärmläsare presenterar en knapp med dess
tillgängliga namn och dess roll, så namnet ska säga vad knappen gör, inte hur
den ser ut. APG lägger till en regel för växlingsknappar som är lätt att bryta:
etiketten är densamma medan tillståndet ändras. Guidens exempel är en knapp med
namnet ”Mute”, som läses upp som ”Mute toggle button pressed” när den är
påslagen. Om designen hellre växlar mellan två etiketter, som ”Stäng av ljud”
och ”Slå på ljud”, behövs inget aria-pressed, eftersom etiketten själv
berättar tillståndet.
Storlek är ett krav, inte en smaksak. Framgångskriterium 2.5.8 i WCAG 2.2, Target Size (Minimum), på nivå AA, kräver att ett mål för pekaren är minst 24 gånger 24 CSS-pixlar. Undantagen gäller små mål med tillräckligt utrymme runt sig, en fullstor kontroll någon annanstans på sidan som gör samma sak, länkar mitt i en mening, kontroller vars storlek webbläsaren bestämmer och storlekar som är nödvändiga. Ett darrande finger, en buss i rörelse och en tumme på en telefon gör alla små mål svårare att träffa.
Fokus ska landa någonstans vettigt. Efter ett tryck förväntar sig APG att fokus flyttas in i en dialog som knappen öppnade, och att det när dialogen stängs normalt återvänder till knappen som öppnade den. Lämnar trycket läsaren i samma sammanhang, som en Verkställ-knapp gör, stannar fokus normalt på knappen. Den som använder tangentbord och får fokus kastat till sidans topp efter varje sparning börjar om sidan varje gång.
Så ser det ut i praktiken
Det tydligaste exemplet börjar med en enda uppläsning. I en SwiftUI-applikation byggd på systemsymboler läste skärmläsaren upp skicka-knappen som ”arrow up circle, button”, eftersom en symbol utan etikett presenteras med sitt interna namn. Arbetet med att ge alla sjutton ikonkontroller namn för skärmläsare gav var och en en etikett som namnger handlingen snarare än formen, och där en kontrolls betydelse beror på tillståndet följer etiketten tillståndet. Det som håller längst är kontrollen: en linter som letar upp konstruktionen som skapar en kontroll med enbart ikon och kräver en tillgänglighetsetikett inom åtta rader från den. Åtta rader valdes genom mätning och är medvetet grovt. Lintern godtar också en etikett som hör till en vy strax bredvid, så knappens namn kan fortfarande vara fel tills någon lyssnar på det.
Nästa lärdom handlar om det en knapp inte klarar av. I skiktet för betalningar och åtkomsträttigheter, byggt på Stripe och på köp i appen hos Apple och Google, avgör ett separat åtkomstschema på 11 tabeller om ett konto får använda företagskatalogen, sökningen och dataexporten. Servern prövar det svaret igen för varje anrop, vad knappen på skärmen än visar, och sidan säger skälet på en rad: en dold knapp är en artighet och inte ett skydd.
Knappar spelar roll också för läsare som inte är människor. Webbplatsens sida om att vara redo för AI-agenter noterar att många agenter som styr en webbläsare läser sidan genom dess tillgänglighetsträd, precis som en skärmläsare gör. Riktiga knappar och formulär med etiketter är en del av det som låter en agent hitta ett formulär och fylla i det.
Webbplatsens egna mallar innehåller inte ett enda <button>-element. Den fyllda
uppmaningen ”Hör av dig” är ett <a> som stylats som en knapp, eftersom den
leder till kontaktsidan, och regeln i dess stilmall sätter min-height till 24
pixlar, med en kommentar som hänvisar till framgångskriterium 2.5.8. Huvudmenyn
är ett <details>-element vars <summary> öppnar och stänger den, och
kommentaren i mallen säger att det är webbläsaren som äger det öppna tillståndet
och knappsemantiken, helt utan skript.
Var det går fel
- En klickbar ruta får stå i elementets ställe. En
<div>eller<span>med en klickhanterare svarar på musen och på lite annat: den tar inget fokus, struntar i mellanslag och Enter och presenteras som vanlig text. Att lägga tillrole="button"rättar bara uppläsningen; fokus och tangenter måste fortfarande skrivas för hand. - En länk gör en knapps jobb, eller tvärtom. En länk som raderar en post kan öppnas i en ny flik eller sparas som bokmärke, och då upprepas raderingen eller så tappar någon bort den. En knapp som bara navigerar går inte att öppna i en ny flik och har ingen adress att kopiera.
- En naken knapp i ett formulär skickar formuläret. Eftersom en knapp utan
typehamnar i tillståndet Auto, skickar en knapp för ”Lägg till rad” eller ”Visa lösenord” som ligger i ett formulär iväg formuläret i samma ögonblick som någon trycker på den. Att skrivatype="button"på varje knapp som inte ska skicka tar bort överraskningen. - Ikonen är hela etiketten. En soptunna, en penna eller en pil betyder något för den som ritade den. Skärmläsaren läser då upp ett filnamn, ett symbolnamn eller bara ”knapp”, om ingen har gett kontrollen ett tillgängligt namn. Ett synligt ord är bäst; där det inte får plats fyller ett tillgängligt namn som säger vad som händer luckan.
- En dold eller inaktiverad knapp behandlas som säkerhet. Att ta bort knappen från sidan stoppar bara ärliga användare. Anropet bakom den kan fortfarande skickas, och servern måste på egen hand avgöra om just det här kontot får göra just det här.
Läs mer
- WAI-ARIA 1.2: button role — rollens definition, varianterna för växling och meny, och de tillstånd och egenskaper den stöder.
- HTML Living Standard: the button element
— innehållsmodellen, typerna submit, reset och button, tillståndet Auto och
attributen
commandochcommandfor. - ARIA Authoring Practices Guide: Button Pattern — knappar kontra länkar, tangentbordsbeteende, vart fokus tar vägen efter ett tryck och regeln för etiketter på växlingsknappar.
- Understanding SC 2.5.8: Target Size (Minimum) — minimimåttet 24 gånger 24 pixlar, testet för avstånd och de övriga undantagen.
- Understanding SC 4.1.2: Name, Role, Value — varför varje kontroll behöver ett namn och en roll som programvara kan läsa, och när vanliga HTML-kontroller redan uppfyller kriteriet.