Pe această pagină39
- TL;DR
- Când să folosiți radiourile (Arborele de decizie)
- Anatomia unui grup de radio adecvat
- Copiați-lipiți linia de bază semantică (fără CSS de lux încă)
- CSS minim pentru utilizare (aspect nativ, ținte mari, focalizare clară)
- Validare blândă, accesibilă (folosește mai întâi browserul)
- Custom-Styled “Card” Radios (without breaking accessibility)
- Copy-paste HTML
- CSS minim, robust
- Note de comportament (de ce funcționează acest model)
- Opțional: validare blândă (nativ mai întâi)
- Strategii de validare care nu enervează
- Principii
- Linia de referință (numai nativă)
- Erori inline prietenoase (îmbunătățire progresivă)
- if (!hasSelection()) {
- radio în grup.
- funcția showSummary() {
- Server-side & network fallbacks
- Integrare Formspree (Îmbunătățire progresivă)
- HTML nativ (funcționează întotdeauna)
- Îmbunătățirea JS (UX plăcută, urmărire mai bună)
- Controlul spam-ului fără a afecta conversiile
- Linii de subiect care reflectă alegerea radio (curăță inbox)
- Capcane comune de evitat
- Internaționalizare și incluziune
- Limbă, etichete și ton
- Etichete lungi și opțiuni cu mai multe linii
- Suport de la dreapta la stânga (RTL)
- Accesibilitate dincolo de ARIA
- Listă de verificare a testării (Print-Friendly)
- Performanță și întreținere
- Analiză și experimentare
- Anti-modele (Nu le faceți)
- Lista de verificare finală
- Resurse
- Specificații și modele de creație
- Ghiduri de referință
- Testare și scule
Butoanele radio par simple. Un clic, o alegere. Cu toate acestea, ele sunt, de asemenea, una dintre cele mai ușoare modalități de a compromite UX și accesibilitatea. Ascundeți intrarea nativă, omitețiset de câmpurișilegenda, sau validați prea agresiv și veți trimite un formular care derutează utilizatorii de tastatură, frustrează cititorii de ecran și distruge conversiile.
Acest ghid vă arată cum să faceți radiouri chiar în 2025: rapid de ales, ușor de scanat, complet accesibil și măsurabil. Vom începe cu o linie de bază curată, semantică, apoi vom pune un strat pe CSS modern, astfel încât radiourile să poată arăta ca carduri sau comenzi segmentate fără a rupe tastatura sau comportamentul cititorului de ecran.
Veți vedea modele practice de validare care nu sâcâie, machete receptive care mențin obiectivele mari pe mobil și fragmente de producție pe care le puteți insera în orice stivă. Vom acoperi, de asemenea, analize, idei A/B și o configurație Formspree, astfel încât să puteți captura rezultate imediat.
Pentru cine este: designeri, dezvoltatori front-end și marketeri cărora le pasă de ambeleaccesibilitateșiconversie. Nu sunt necesare cadre grele, doar HTML solid, CSS concentrat și o mică îmbunătățire progresivă.
Până la sfârșit, vei ști:
- Când radiourile bat selectările, casetele de selectare sau comutarile
- Cum să construiți un grup radio accesibil (
fieldset,legendă, etichetare, focalizare) - Cum să stilați radiourile personalizate „carte” fără a ascunde intrarea
- Cum se validează cu API-ul HTML Constraint (și mesajul bine)
- Cum să conectați radiourile la Formspree și să măsurați selecțiile
TL;DR
- Utilizațiradiouripentru exactunulalegere într-un set bine definit (ideal2–6 opțiuni) care ar trebui să fievizibil deodată.
- Închideți întotdeauna radiourile în
+, dă-lela felnume, și faceți fiecare opțiune unpe care se poate face clic. - Nu ascunde intrările cu
afișare:niciuna; păstrează-lefocalizat(de exemplu,opacitate:0; poziție:absolut; inserare:0) deciTab/Săgeți/Spațiulucru. - Faceți ținte mari: cel puțin44×44px, cu uninel de focalizareasta se vede clar.
- Validați cuHTML Constraint API(
obligatoriu,reportValidity()), apoi îmbunătățiți mesajele, nu invers. - Dacă aveți multe opțiuni sau nu sunt familiare, adăugațitext de ajutorsub fiecare etichetă și luați în considerarecăutare sau grupareîn schimb.
- Pe mobil, stivuiți îno coloană; pe ecrane late,2–3 coloaneprin grila CSS.
- Masura: pistaimpresii, selecție și trimitereși testul A/Bordinul opțiuniișicopie.
- Pentru Formspree, păstrațiPOST nativca o rezervă; adaugăaducedoar ca îmbunătățire progresivă.
Când să folosiți radiourile (Arborele de decizie)
Î1. Utilizatorul alege exact o opțiune?
- Nu →Utilizațicasete de selectare(0–mulți) sau uncomuta(binar) sau regândiți sarcina.
- Da →Treceți la Q2.
Q2. Opțiunile trebuie să fie vizibile dintr-o privire?
- Da →Utilizațiradiouri(cel mai bun pentru scanare și alegere rapidă).
- Nu (spațiul este îngust / multe opțiuni)→ Luați în considerare unselectați(scapă jos). Dacă alegerile sunt critice și beneficiază de comparație, preferați radiourile și reproiectați aspectul.
Q3. Câte opțiuni?
- 2–6→ Radiourile sunt ideale.
- 7–10→ Radiourile pot funcționa în continuare cu grupare sau uncu două coloanegrila; în caz contrar, utilizați o listă de selectare sau de căutare.
- >10→ Folosiți unselectează cu căutaresau unpascare restrânge setul mai întâi.
Î4. Opțiunile sunt state care se exclud reciproc?
- Da →Radiouri.
- Nu / combinațiile au sens →Casete de selectare.
Î5. Alegerea va declanșa diferite întrebări ulterioare?
- Da →Radiourile sunt încă în regulă. Afișează urmăririlecondiționat, dar păstrați câmpuri ascunsedin ordinea tabulatoruluiși fluxul SR până la dezvăluire.
- Nu →Grup radio simplu.
Î6. Familiar vs. descriptiv?
- Etichete cunoscute(de exemplu, „Mic / Mediu / Mare”) → etichetele scurte sunt suficiente.
- Necunoscut sau cu mize mari(de exemplu, „SEO tehnic vs. SEO pentru conținut”) → adăugațimicrocopie(descriere pe un rând) sub fiecare etichetă.
Î7. Mai întâi pe mobil?
- Da (întotdeauna)→ Utilizațistivă pe o singură coloanăcu spațiere generoasă și text de 16–18 px. Promovațicele mai aleseopțiune spre vârf.
Exemple practice
- Formularul dvs.: „Care serviciu?” → Radiourile bat o selectie, deoarece utilizatorii ar trebui să compare opțiunile una lângă alta. Păstrați 3 carduri (Link Building, SEO, Web Dev) cu subtext scurt.
- Viteza de expediere: 3–4 viteze care se exclud reciproc → Radiouri (cu delte de preț în subtext).
- Frecvența buletinului informativ: Zilnic/Săptămânal/Lunar → Radiouri.
- Interese (pot alege mai multe)→ Nu radiouri; utilizați casetele de selectare.
Anatomia unui grup de radio adecvat
Copiați-lipiți linia de bază semantică (fără CSS de lux încă)
De ce contează fiecare parte
+dă grupului un nume pentru cititoarele de ecran și setează context pentru toată lumea.- Același
numeface ca intrările să se excludă reciproc. - Se poate face clic
în jurul fiecărei intrărivă oferă o zonă mare de atingere/clic (44px+). necesarla primul radiopermite browserului să valideze grupul în mod nativ.- Text de ajutor(
service-hint) șitext de eroare(service-error) sunt separate, astfel încât să puteți afișa/ascunde erorile fără a muta lucrurile. - Nu sunt necesare roluri ARIA.Radiourile native expun deja semantica corectă.
CSS minim pentru utilizare (aspect nativ, ținte mari, focalizare clară)
/* Aspect și spațiere */
.etichetă câmp {
display: flex;
alinierea elementelor: centru;
decalaj: .6rem;
captuseala: .65rem .8rem; /* atingere mare țintă */
chenar-raza: .6rem;
cursor: pointer;
}
/* Focalizare de la tastatură: evidențiați întreaga etichetă când intrarea este focalizată */
.etichetă câmp:are(input:focus-visible) {
contur: 3px solid #3b82f6;
contur-offset: 2px;
}
/* Starea selectată (opțional, punctul nativ apare în continuare) */
.etichetă câmp:are(input:verificat) {
fundal: #f1f5ff;
}
/* Text de eroare */
.error { culoare: #b91c1c; margin-top: .5rem; dimensiunea fontului: .9rem; }
Sfat:
:are()vă oferă acel „inel de focalizare pe întreaga carte” fără a ascunde intrarea reală. Dacă un browser mai vechi nu îl acceptă, utilizatorii primesc în continuare inelul de focalizare nativ pe radioul însuși.
Validare blândă, accesibilă (folosește mai întâi browserul)
Lăsați browserul să gestioneze partea „trebuie să alegeți una”, apoi afișați eroarea dvs. în linie, dacă este necesar.
const form = document.getElementById('quote-form');
const group = document.getElementById('service-group');
const error = document.getEementById('service-error');
form.addEventListener('submit', (e) => {
// Declanșează interfața de utilizare nativă de validare (funcționează deoarece primul radio are `required`)
if (!form.reportValidity()) {
// Opțional: afișează și o eroare inline prietenoasă
error.hidden = false;
group.setAttribute);' ||'''true-invalid);' ||' e.preventDefault();
.{||.
Comportament la care ar trebui să vă așteptați (și să testați):
Tastatură:
Tabă o dată pentru a intra în grup; folosi
Tastele săgeată
a se muta;
Spațiu
- selectează.Cititoare de ecran:Legenda este citită ca etichetă de grup; fiecare opțiune este anunțată cu starea „selectat/neselectat”.Atinge:Atingerea etichetei comută radioul (mulțumită împachetării etichetei).Radiouri „Carte” cu stil personalizat (fără a întrerupe accesibilitatea)
- Copiați-lipiți HTML The legend is read as the group label; each option is announced with “selected/not selected” state.
- Touch: Tapping the label toggles the radio (thanks to label wrapping).
Custom-Styled “Card” Radios (without breaking accessibility)
Copy-paste HTML
CSS minim, robust
:rădăcină{
--brand:#0b5cff; --ring: rgba(11,92,255,.35);
--border:#e5e7eb; --bg:#fff; --muted:#6b7280;
--raza:14px;
}
/* Grilă */
.card-grup{
display:grilă; decalaj: 16px;
grid-template-coloane: repetare(3, minmax(0,1fr));
}
@media (max-width:900px){ .card-group{ grid-template-columns:1fr 1fr; } }
@media (max-width:640px){ .card-group{ grid-template-columns:1fr; } }
/* Eticheta cardului */
.card{
poziție:relativă;
display:grilă; loc-articole:centru; text-align:center;
decalaj: 6px; umplutură: 18px;
chenar:1px solid var(--border); bordura-raza:var(--raza);
background:var(--bg);
cursor:pointer; user-select:none;
tranziție: casetă-umbră .15s, chenar-culoare .15s, transform .02s;
}
.card:hover{ box-shadow:0 8px 20px rgba(0,0,0,.06); }
/* Păstrați intrarea nativă focalizată: no display:none */
.intrare card{
poziție: absolut; inserare:0; opacitate:0;
}
/* Inel de focalizare de la tastatură pe întregul card */
.card:are(input:focus-visible){
box-shadow:0 0 0 3px var(--ring);
culoare-chenar: var(--brand);
}
/* Starea selectată */
.card:are(input:verificat){
culoare-chenar: var(--brand);
box-shadow:0 0 0 3px var(--ring);
}
/* Conținut */
.card-title{ font-weight:700; culoare:#111; }
.card-sub{ font-size:14px; culoare:var(--muted); }
/* Text de eroare */
.error{ color:#b91c1c; margin-top:.5rem; dimensiunea fontului:.9rem; }
Note de comportament (de ce funcționează acest model)
- Nu
afișare:niciunape intrare → utilizatorii de la tastatură pot introduce Tab;Tastele săgeatămută selecția;Spațiuselectează. - Întregul card se poate face clic deoarece intrarea este în interiorul
etichetă. :are()lasă-ne să stilămfocusșiverificatstate pe cardul părinte fără hack-uri ARIA.- Grila receptivă dă1–3 coloaneautomat; țintele tactile rămân mari.
Opțional: validare blândă (nativ mai întâi)
const form = document.getElementById('plan');
const err = document.getElementById('plan-error');
form.addEventListener('submit', (e) => {
if (!form.reportValidity()) { // folosește `required` pe primul radio
err.hidden = false;
e.preventDefault();
} else {
err.hidden = true;
}
});
Strategii de validare care nu enervează
O validare excelentă este invizibilă până când este nevoie. Iată o abordare specifică radio, care este rapidă, accesibilă și liniștitoare pentru utilizatori.
Principii
- Nativ mai întâi.Lăsați HTML să gestioneze „trebuie selectat unul”.
- Amânați erorile.Nu striga la utilizatori înainte de a încerca să continue.
- Indicați problema.Anunțați erori, mișcați focalizarea inteligent și păstrați copierea scurtă.
- Clar la schimbare.De îndată ce se face o alegere validă, eliminați eroarea.
Linia de referință (numai nativă)
Numai HTML poate aplica regula cunecesarla un radio din grup.
Acest lucru vă oferă deja: săgeți de la tastatură, spațiu pentru selectare și validare la nivel de browser.
Erori inline prietenoase (îmbunătățire progresivă)
Opriți fereastra pop-up a browserului și gestionați mesajele în linie, astfel încât să se potrivească cu designul dvs.
HTML (adăugați o regiune de eroare)
CSS (stil simplu)
.error { color:#b91c1c; margin-top:.5rem; dimensiunea fontului:.9rem; }
JS (amână erorile, anunță corect)
const form = document.getElementById('quote');
const group = document.getElementById('svc');
const err = document.getElementById('svc-err');
const radios = form.querySelectorAll('input[name="service"]');
let attempted = fals; // afișează erori numai după ce utilizatorul încearcă să continue
funcția areSelection() {
returnează [...radio].unele(r => r.verificat);
}
function showError(msg='Vă rugăm să alegeți o opțiune.') {
err.textContent = msg;
err.hidden = fals;
group.setAttribute('aria-invalid', 'true');
// Adăugați eroare la descrisby, astfel încât SR-urile să o anunțe în continuare
group.setAttribute('aria-describedby', 'svc-hint svc-err');
}
funcția clearError() {
err.hidden = adevărat;
group.removeAttribute('aria-invalid');
group.setAttribute('aria-describedby', 'svc-hint');
}
form.addEventListener('submit', (e) => {
încercat = adevărat;
if (!hasSelection()) {
e.preventDefault();
showError();
// Aduceți grupul în vedere și puneți accentul pe primul radio
radios[0].focus(();
group.scrollInto View:} ||r', behavior: block. } else {
. clearError();
// Nu sâcâi devreme; clar odată ce aleg ceva
radios.forEach(r => {
r.addEventListener('schimbare', () => {
dacă (încercarea) clearError();
});
});
De ce funcționează acest lucru
Fără bule de indicații pentru browser; utilizatorii văd erori
în linie
lângă grup.
- Cititoarele de ecran audlegenda, apoi
- eroare, datorită luiaria-descris de.Erorile apar doar
dupăo încercare de trimitere (sau la întoarcerea la remediere). - Validare blândă pe pas (formulare cu mai mulți pași)Dacă porți cu un buton „Următorul”, validați doar acel pas.document.getElementById('nextBtn').addEventListener('click', () => {
if (!hasSelection()) {
showError();
} else {
clearError();
// avansa la pasul urmator...
}
});
Mesaje personalizate cu API-ul Constraint (opțional)
Dacă preferați să păstrați modelul de valabilitate al browserului, setați un mesaj personalizat pe
primul
radio în grup.
const firstRadio = radios[0];form.addEventListener('submit', (e) => {if (!hasSelection()) {
firstRadio.setCustomValidity('Vă rugăm să alegeți o opțiune.');
// Declanșează interfața de utilizare nativă; sau apelați form.reportValidity()
e.preventDefault(); els(); els(); firstRadio.setCustomValidity('');
.
Folosiți-l atunci când doriți „bula” nativă plus propriul text, altfel rămâneți la metoda inline de mai sus pentru o interfață de utilizare coerentă.
Rezumat erori (pentru formularele lungi)
Dacă formularul este lung, adăugați un
rezumat de sus
care se leagă de zona cu probleme.
funcția showSummary() {
const sum = document.getElementById('eroare-rezumat');sum.hidden = fals;sum.querySelector('a').focus(); // SR-urile anunță alerta
}
Soluții de rezervă pe partea de server și rețea
Validarea la nivelul clientului îmbunătățește UX, dar
întotdeauna
validați și pe server (sau prin serviciul dvs. de trimitere). Dacă trimiterea eșuează, returnați pagina cu:
sum.hidden = false;
sum.querySelector('a').focus(); // SRs announce the alert
}
Server-side & network fallbacks
Client-side validation improves UX, but always validate on the server (or by your submission service) too. If submission fails, return the page with:
- Anteriorulselecția a persistatși
- Celaceeași eroare în linielângă grup.
Integrare Formspree (Îmbunătățire progresivă)
Faceți radiourile să funcționeze chiar dacă JavaScript eșuează, apoi îmbunătățiți pentru o mulțumire mai fluidă și o analiză mai bună.
HTML nativ (funcționează întotdeauna)
Ce vă oferă asta:
- Funcționează cu JS dezactivat (bun pentru SEO, fiabilitate).
- Browserul tratează „trebuie selectat unul” (
necesarpe primul radio).
- Formspree primește
serviciu,nume,e-mailși_subiect.
Îmbunătățirea JS (UX plăcută, urmărire mai bună)
Interceptați trimiterea, validarea, trimiterea cuaduceși afișați un mesaj de mulțumire (sau redirecționare).
Note
- Set
Accept: application/jsondeci Formspree returnează JSON și puteți decide corect succesul/eșecul.
- Utilizați
form.reportValidity()astfel încât browserul impune selecția radio și formatul de e-mail înainte de a trimite.
- Păstrați nativul
acțiune/metodadeci formularul funcționează în continuare fără JS.
Controlul spam-ului fără a afecta conversiile
- Honeypot(inclus mai sus) prinde mulți roboți fără frecare.
- Timpul: adăugați un
ascuns început_lacând se încarcă pagina; ignora trimiterile mai repede de, să zicem, 2 secunde.
- Semnale de conținut: dacă vedeți valori nedorite repetate, filtrați-le în regulile Formspree sau în post-procesare.
// în submit handler înainte de a trimite:
const început = Number(fd.get('started_at'));
if (Date.now() - început < 2000) return; // arată ca un bot
Linii de subiect care reflectă alegerea radio (curăță inbox)
Poți croi_subiectde la radioul selectat:
const service = fd.get('serviciu'); // de exemplu, „seo”
fd.set('_subject', `New ${service} lead from Contact form`);
Capcane comune de evitat
- Ascunderea radiourilor cu
afișare:niciuna.Utilizațiopacitate:0; poziție: absolut; inserare:0în interiorul etichetei, astfel încât tastaturile să funcționeze în continuare.
- Uitarea
set de câmpuri/legenda.Cititoarele de ecran se bazează pe ele pentru context.
- Supravalidare devreme.Afișați erorile după trimitere/Următorul, apoi ștergeți imediat ce utilizatorul remediază grupul.
- Nu captează contextul.Adăugați
page_url,referitor, și câmpurile UTM, vă veți mulțumi mai târziu.
Internaționalizare și incluziune
Limbă, etichete și ton
- Utilizați
lang(și comutați paginile per-locale): …
- Păstrați etichetele scurte șidescriptiv, evitați jargonul specific culturii.
- Preferneutruformularea („Alege un plan”) peste ipoteze („Care este bugetul tău?”).
- Localizeazăerorișitext de ajutorcu un dicționar simplu tastat de
document.documentElement.lang.
const i18n = {
ro: { alege: 'Vă rugăm să alegeți o opțiune.' },
es: { alege: 'Elige una opțiune, por favor.' },
ar: { alege: 'يُرجى اختيار خيار واحد.' }
};
const t = (k) => (i18n[document.documentElement.lang] || i18n.en)[k];
errorEl.textContent = t('alege');
Etichete lungi și opțiuni cu mai multe linii
- Lăsați eticheteleînfășurare; nu trunchiați niciodată cuvintele cruciale.
- Păstrați zona de accesare mare chiar și atunci când textul se împachetează: utilizați umplutură peetichetă, nu doar intrarea.
.card { inline-size: 100%; umplutură: 16px; }
.card .card-title { font-weight: 700; înălțimea liniei: 1,25; }
.card .card-sub { font-size: 14px; înălțimea liniei: 1,4; }
Suport de la dreapta la stânga (RTL)
Utilizați CSSproprietăți logiceși:dir()deci nu aveți nevoie de stiluri separate.
/* Spațiere care se întoarce automat în RTL */
.card { padding-inline: 16px; padding-block: 16px; }
/* Inel de focalizare care respectă direcția */
.card:are(input:focus-visible) {
contur: 3px solid var(--ring);
contur-offset: 2px;
}
/* Opțional: ajustări specifice direcției */
:dir(rtl) .card-group { directie: rtl; }
Accesibilitate dincolo de ARIA
- Asigurațicontrast ≥ 4,5:1pentru etichete și stări de focalizare.
- Atingeți ținte ≥44×44 px(completare mai degrabă decât dimensiunea fontului).
- Nu comunicați starea numai după culoare; folosichenare, pictograme sau text.
Listă de verificare a testării (Print-Friendly)
- Semantică: Radiourile sunt înăuntru
set de câmpuricu unvizibil legenda.
- Tastatura: Tab intră în grup;săgețimişcare;Spațiuselectează.
- Cititoare de ecran: Legendă anunțată; fiecare opțiune spune selectat/neselectat.
- Focus: Inel vizibil pecartea intreaga(și pe intrarea nativă).
- Zona lovită: Se poate face clic pe întreaga etichetă; functioneaza pe mobil.
- Validare: Fără erori până la trimitere/Următorul; erorile clare la schimbare.
- Copie: Opțiunile sunt scurte; textul de ajutor clarifică diferențele.
- Aspect: 1 coloană pe telefoane; 2–3 pe desktop; fără tăiere de preaplin.
- i18n: Erori/etichete localizate; textul lung se împachetează cu grație; RTL OK.
- Analytics: Evenimente pentru impresie, selectare, trimitere.
- Performanță: Fără biblioteci grele de UI; CSS minim; nici o schimbare de layout.
Performanță și întreținere
- Favoareintrări native+ CSS ușor; evitați înlocuirea radiourilor cu div-uri.
- Păstrați modul CSS (proprietăți personalizate pentru culori, rază, inel).
- Evita
afișare:niciunape intrări; folosiopacitate:0; poziție: absolut; inserare:0astfel încât accesibilitatea rămâne intactă.
- Amână JS non-critice; mențineți îmbunătățirile sub ~2–5 KB atunci când este posibil.
- Utilizațiinterogări container(dacă sunt disponibile) în loc de puncte de întrerupere media complexe pentru formularele încorporate.
@container (lățime minimă: 680 px) {
.card-group { grid-template-columns: 1fr 1fr 1fr; }
}
Analiză și experimentare
Intenția pistei și punctele de frecare:
// Trage când grupul radio devine vizibil
gtag?.('event','form_step_view', { pas: 1, formular: 'contact' });
// Foc la selecție
document.querySelectorAll('input[name="service"]').forEach(r => {
r.addEventListener('change', () => {
gtag?.('event','radio_select', { group: 'service', value: r.value });
});
});
// Declanșează la trimiterea cu succes
gtag?.('event','generate_lead', { form: 'contact', service: form.service.value });
Test A/B:
- Ordinul opțiunii(cel mai ales primul)
- Copie CTA(„Obțineți propunerea mea gratuită” vs „Obțineți cotația mea”)
- Text de ajutorprezență
Anti-modele (Nu le faceți)
- Ascunderea intrărilor cu
afișare:niciuna(rupe tastatura și SR-urile).
- Lipsă
set de câmpuri/legendă.
- Zone mici afectate (doar punctul mic pe care se poate face clic).
- Stare de selecție numai pentru culoare; focalizare invizibilă.
- Validareaînainte deutilizatorul încearcă să continue.
- Împachetarea a 10-20 de opțiuni în radiouri; utilizați în schimb o selecție care poate fi căutată.
Lista de verificare finală
set de câmpuri+legendaprezent
- Același
nume, unicvaloares
- Etichetele împachetează intrări; întreg cardul pe care se poate face clic
- Inelul de focalizare clar vizibil
necesarla primul radio; erori blânde în linie
- 1–3 coloane receptive, ținte cu atingere mare
- șiruri localizate; RTL sigur prin proprietăți logice
- Analytics la vizualizare/selectare/trimitere
- Validarea pe partea serverului reflectă regulile client
Resurse
Specificații și modele de creație
- Standard HTML –
: semantică nativă, grupare dupănume, forma comportamentului.
- Practici de autor WAI-ARIA 1.2 – Grup de radio: comportamentul așteptat de la tastatură (Tab în grup,Săgeatăpentru a muta,Spațiupentru a selecta), modele de etichetare.
- WCAG 2.2esențiale pentru radiouri:
- 2.1.1Tastatura(totul operabil prin tastatură)
- 2.4.7Focus Vizibil(focalizare clar vizibilă)
- 2.5.5Dimensiunea țintă(≥44×44px recomandat)
- 1.4.3Contrast (minim)
Ghiduri de referință
- MDN: Intrare radio,
etichetă,set de câmpuri/legenda, validare formular (Constraint Validation API).
- Sistem de proiectare GOV.UK – Radiouri: îndrumări excelente, testate în luptă, cu privire la formulare și erori.
- Componente incluzive (Heydon Pickering): modele practice și critici.
Consultați blogul nostru recent peCum să căutați oportunități de postare pentru invitați pe Ahrefs (Ghid pas cu pas)
Testare și scule
- axe DevTools(extensia browser) – verificări automate a11y.
- Informații despre accesibilitate– teste ghidate rapide.
- Farul– semnale de performanță + accesibilitate.
- Verificator de contrast WebAIM– verificați contrastul culorilor.
- Cititoare de ecranpentru a verifica comportamentul real:
- NVDA(Windows),FĂCILE(Windows),VoiceOver(macOS/iOS),TalkBack(Android).
- Trecere manuală de la tastatură: Tab în grup → Săgețile se mișcă → Selectează spațiu → inelul de focalizare rămâne evident.
Consultați-nerevizuire a Noțiunilor de Marketing
Întrebări frecvente (Scurt și Practic)
1) Câte opțiuni sunt prea multe pentru radio? Țintește2–6. Dacă aveți 7–10, grupați sau utilizați o grilă cu două coloane. Peste ~10, treceți la unselectați (cu căutare)sau reproiectează pentru a restrânge mai întâi opțiunile.
2) Ar trebui să preselectez o opțiune? Doar dacă există unimplicit majoritar clarși nu va influența datele. Preselecția accelerează finalizarea, dar poate reduce alegerea deliberată. Dacă nu sunteți sigur,nu preselectați.
3) Radiouri vs selectare vs casete de selectare, ce aleg? Radiouri: alegere unică, opțiunile ar trebui să fievizibilunul lângă altul.
Selectați: o singură alegere când spațiul este îngust sau opțiunile sunt multe.
Casete de selectare:0–mulțialegeri (nu se exclud reciproc).
4) Pot modela aparatele radio ca „carduri” fără a întrerupe accesibilitatea? Da. Păstrațiintrare nativă focalizată(nu folosițidisplay:none). Pune intrareaîn interiorul, setați-l laopacitate:0; poziție: absolut; inserare:0;și stilați eticheta. Utilizați:are(intrare:focus-vizibil)și:are(input:verificat)pentru a conduce focalizarea/stările selectate.
5) Care este cel mai bun mod de a valida un grup radio? Utilizați mai întâi HTML: puneținecesarla primul radioși sunăform.reportValidity()(sau lăsați browserul să se ocupe de trimitere). Pentru o interfață de utilizare mai plăcută, afișați un scurteroare inlinelângă grupdupăprima încercare șiclar asupra schimbării.
6) Am nevoie de roluri ARIA carol="radiogrup"? Nu pentru radiouri native. Un bunset de câmpuri+legendaoferă deja cititorilor de ecran contextul potrivit. Adăugați ARIA numai dacă construiți uncomplet personalizatwidget (evitați dacă este posibil).
7) Cum gestionez câmpurile de urmărire condiționată (afișează intrări diferite în funcție de alegere)? Afișează/ascunde urmăririledupăo selecție. Când este ascuns, de asemeneadezactivațiacele controale, astfel încât să nu fie în ordinea filei și să nu fie trimise. Când sunt dezvăluite, mișcați focalizarea în mod sensibil și asigurați-vă că etichetele rămân clare.
8) Ce ar trebui să testez înainte de expediere? Fluxul de la tastatură, focalizarea vizibilă, anunțurile cititorului de ecran (legendă citită, starea selectată exprimată), zonele de acces mobil, calendarul de validare (fără sâcâială timpurie) și valorile selectatepersistăeroare pe partea serverului.
