Start with the decision customers actually make
A set of circles or squares is not a complete question. Imagine a Hong Kong service enquiry asking which contact route a customer prefers. If the heading merely says ‘Contact’, a person may wonder whether they are choosing where a quotation will be sent, how a consultant will follow up, or which channel will be used for all future notices. Write the group prompt as a full decision: ‘How may we contact you about this enquiry?’ Then label the choices ‘Email about this enquiry’ and ‘Phone call about this enquiry’. The short group prompt gives context; each label still makes sense when heard alone. This matters because W3C notes that some screen readers announce a legend once, some repeat it, and some may not announce it reliably. A label should not depend on the surrounding layout for its meaning.
Decide whether the question allows one answer or several before choosing a control. Radio buttons suit one answer from a visible set; checkboxes suit independent yes-or-no decisions or a set where several answers are permitted. A delivery preference that must resolve to one method should not use independent checkboxes unless the business can genuinely process more than one method. Conversely, a customer selecting all suitable appointment days should not be forced into one radio choice. Explain any minimum or maximum in words near the group. Do not assume customers know that a circle means one choice and a square means many, especially on a custom-styled mobile page. The data model, validation rule and displayed instruction must agree.
Make the relationship available beyond the screen
For ordinary HTML, place related radio buttons inside a fieldset with a concise legend that states the question. Give each input its own label and a unique identifier, while radio options in the same answer set share a name. W3C’s grouping tutorial demonstrates this pattern. A visual heading beside ungrouped controls does not automatically become their programmatic group name. The same issue appears when a form repeats labels such as ‘Name’ or ‘Address’ for shipping and billing: separate fieldsets can identify which set is being completed. Keep the legend short enough that repeated announcements remain tolerable. Resist nesting several fieldsets simply to mirror a complicated design grid; that can turn a simple choice into a confusing chain of announcements.
The group should remain understandable when styling fails or the page is enlarged. Preserve a visible prompt, clear spacing between groups and a perceptible selected state. Avoid making color alone carry the answer. Custom tiles can be attractive, but replacing native inputs with clickable containers creates keyboard and state work that native controls already handle. W3C’s keyboard guidance explains that authors must supply keyboard support for custom ARIA widgets; ARIA names do not make a div behave like a radio button. If design needs a card appearance, keep a real labeled input in the interaction and test the whole card’s focus and click behavior. The choice must stay usable without a pointer.
Put instructions and conditions where the decision happens
If a choice affects price, timing or service eligibility, describe that consequence before submission. ‘Phone’ might mean a call during Hong Kong office hours; ‘Email’ might be asynchronous. Those are business rules, not properties of the control, so the article cannot promise a particular response time. The form should give the actual applicable condition beside the option and link to fuller terms where needed. If the choice will reveal more fields, such as a preferred callback window, make the appearance predictable and ensure the newly displayed fields join the normal keyboard sequence. Do not silently replace one option with another after a customer has chosen it. Tell the person what changed and why.
Optional marketing consent deserves a separate decision from the contact method needed to answer an enquiry. A customer can request a quotation by email without agreeing to promotional mail. If those decisions are combined into one ambiguous checkbox, the resulting record cannot demonstrate what the customer intended. Write separate prompts, with each option limited to its actual purpose, and check the stored values after a test submission. A required operational choice should be identified as required; optional consent should remain optional. Do not preselect a consequential choice merely to make the form look complete. The important test is whether a person can understand the decision and whether the system records the same decision.
Work through a booking enquiry
Take a fictional repair company that can offer either an on-site visit or a remote diagnosis for the first assessment. It initially renders two large cards headed ‘Visit’ and ‘Remote’, but no question. A keyboard user tabs to each card without hearing whether these are delivery options, prices or technician skills. The redesign adds a visible legend, ‘How would you like the first assessment to take place?’ Both choices are labeled in full. The business also states that an on-site appointment depends on its actual coverage area and that the next screen will ask for an address if that option is selected. The team tests both branches against its real booking rules rather than publishing an invented coverage promise.
In this example, the team submits three cases: no selection, remote selected and visit selected. For the missing required choice, the error names the question and leaves the existing form entries intact. Remote must not request a visit address. Visit must request the address only when needed and must not erase it if the customer briefly changes choices and returns, unless there is a stated privacy reason to clear it. After each submission, inspect the stored booking type and confirmation text. If the confirmation says ‘remote’ while the database says ‘visit’, the interface is still unsafe however polished its radio buttons look. This test covers the customer’s decision, the server rule and the resulting record together.
Test the actual interaction and record
Run a short acceptance session with the English and Traditional Chinese versions independently. Read every group prompt and option without looking at its neighboring text. Tab into the form, move through native radio options with the arrow keys, and Tab out; test checkboxes with Space. Repeat with a screen reader and confirm that the question, each option, selected state and any required instruction are understandable. W3C’s keyboard guidance describes these expected patterns, while the grouping tutorial explains the semantic relationship. Do not call an automated accessibility scan a complete test. It can flag missing labels, but it will not decide whether ‘Standard’ tells a customer enough about a delivery consequence.
Finally, compare the rendered answer with the submitted value, confirmation and staff view. Check what happens when a choice becomes unavailable between opening the form and submitting it. The server should reject an invalid choice with an explanation and an actionable next step, rather than silently substituting a different service. Keep a small review record: the exact question, permitted options, whether one or many may be chosen, any condition that changes the outcome, and the expected stored value. Test a saved draft too: if an old option has been removed, show the customer that the decision needs to be made again before submission. Never transform an old stored code into a new choice without checking that its meaning is still the same. This becomes a practical specification when the form is translated, redesigned or integrated with a booking system. The page is ready when people can make the intended choice and the business receives that same choice.
A final translation check should compare the business meaning of the answers, not just the control labels. In one edition, “contact by phone” might imply an immediate call while the other says only that staff may call later. Ask a bilingual reviewer to read the actual submission confirmation and staff record alongside each edition’s question. If a permitted option is unavailable in one language, resolve the service rule before launch; a hidden translation branch must not produce a different contract. This small comparison also catches options whose ordering changes while stored codes remain fixed, a particularly easy mistake when forms are rebuilt from separate language files.
Before you proceed
- Can each choice be understood together with its question and selection rule?
- Do keyboard and screen-reader checks work in both languages?
- Does the stored answer match the visible selection and confirmation?


