Developers build forms everywhere.
They appear during account creation, checkout, job applications, customer support requests, healthcare enquiries, onboarding processes and dozens of other digital interactions. Technically, a form may seem straightforward: collect some values, validate them and send the data somewhere.
From the user's perspective, however, a form is rarely just a collection of inputs.
Every question requires someone to interpret what is being asked, work out what information they should provide and decide whether they feel comfortable providing it. When a form requests personal or sensitive information, those decisions become even more important.
That is why examples such as preliminary information by Fostering Change provide an interesting starting point for developers. An intake form may contain perfectly ordinary HTML controls, but the context surrounding those controls changes how we should think about interface design.
Good forms do more than successfully submit data. They make the process of supplying that data clear, predictable and manageable.
Low-Friction Doesn't Always Mean Fewer Fields
One of the easiest assumptions to make about form UX is that shorter automatically means better.
Sometimes it does.
Nobody wants to provide their postal address, birthday and favourite breakfast cereal simply to subscribe to a newsletter. Removing unnecessary questions is one of the quickest ways to simplify an interface.
But field count isn't the only source of friction.
Imagine two forms.
The first has six fields presented in no obvious order, vague labels, unclear mandatory requirements and validation errors that only appear after submission.
The second has ten fields organised into clear sections, descriptive labels, obvious required fields and sensible explanations where additional context is needed.
Despite being longer, the second form may feel considerably easier to complete.
Friction is better understood as the amount of effort a user needs to understand and complete a task. That includes visual effort, cognitive effort and interaction effort.
Before removing fields purely to shorten a form, developers should therefore ask:
- Does each field have a clear purpose?
- Are related questions grouped together?
- Does the sequence make sense?
- Does the user know which fields are required?
- Is the language easy to understand?
- Is the next step obvious?
- Are errors easy to identify and correct?
A form that answers those questions well may feel straightforward even when it needs to collect a reasonable amount of information.
Every Question Creates a Small Cognitive Task
Whenever users encounter a form field, several things happen.
They first need to understand the question. They then need to recall or decide upon the answer, determine the expected format, enter the information and confirm that they have answered correctly.
One field isn't demanding. Twenty unrelated fields presented simultaneously may be.
This is where progressive disclosure becomes useful.
Rather than exposing every possible question or setting at once, developers may reveal information as it becomes relevant. DEV Community has a useful explanation of progressive disclosure and reducing cognitive overload, including staged, conditional and contextual disclosure patterns.
For a longer intake process, that could mean dividing a form into logical stages:
- Basic details
- Background information
- Preferences
- Additional context
- Review and submit
Importantly, this doesn't necessarily mean every form needs a multi-page wizard.
Sometimes simple headings, fieldsets and spacing are enough to establish a clear hierarchy.
The objective isn't to hide information for the sake of it. It is to present the right amount of information at the right time.
Let Earlier Answers Determine What Comes Next
Conditional fields are another useful way to reduce unnecessary interaction.
Consider a basic question:
Have you used this service before?
If the answer is "No", several follow-up questions about the user's previous experience may be irrelevant.
Instead of displaying those fields anyway, the application might render them only when the user selects "Yes".
In JavaScript, the logic itself might be simple:
if (hasPreviousExperience) {
showFollowUpQuestions();
}
The more difficult part is designing the surrounding experience.
When fields appear dynamically:
- The new content should appear somewhere predictable.
- Keyboard focus shouldn't suddenly jump unexpectedly.
- Screen readers should be able to understand relevant changes.
- Previously entered information shouldn't disappear accidentally.
- Hiding fields should also be considered when processing submitted data.
Conditional rendering can make complex forms feel much shorter, but only when the behaviour remains understandable.
Sensitive Information Changes the Design Problem
A product search filter and a personal intake questionnaire may both use checkboxes, radio buttons and text inputs.
That doesn't mean they should be designed identically.
When an interface requests information about someone's circumstances, preferences, health, finances or personal experiences, users may reasonably want to know why particular questions are being asked and what happens to their answers.
This changes the questions developers and designers should ask during implementation.
For every potentially sensitive field, consider:
Is this information genuinely required?
Data shouldn't be collected simply because it might become useful later.
Does the user understand why it is being requested?
A short explanation may make an unfamiliar question much easier to interpret.
Does this field genuinely need to be mandatory?
Some information may be helpful without being essential.
Should there be another response option?
For certain questions, choices such as "Other", "Not sure" or "Prefer not to say" may provide necessary flexibility.
Is privacy information visible at the point where it matters?
Important information shouldn't be buried where users are unlikely to encounter it.
These considerations become particularly relevant when examining preliminary information because a counselling intake process involves more personal context than an ordinary account registration form.
A Real-World Example of an Intake Form
Real websites are useful because they reveal design problems that stripped-down coding examples often don't.
One example is the preliminary questionnaire users encounter when they Sign up for Fostering Change. The form requests contact details alongside broader background information and preferences before submission.
From a development perspective, the interesting part isn't the organisation itself. It is the interface challenge.
How do you present multiple categories of questions without making the form feel like one enormous wall of inputs?
Possible approaches include:
- Dividing related questions into clearly labelled sections
- Using radio buttons and checkboxes when the available answers are known
- Providing additional text fields only when "Other" is selected
- Clearly distinguishing mandatory and optional information
- Keeping privacy or confidentiality information visible
- Showing progress when the process spans multiple screens
- Preserving previously entered answers if validation fails
This is where preliminary information becomes a useful UX case study. The technical components are familiar, but the user's context raises the stakes for clarity.
Labels Should Remain Visible
Placeholder-only forms often look clean in screenshots.
They are much less convincing once someone starts using them.
Consider:
As soon as the user types, the placeholder disappears.
Now compare that with:
Email address
<input
type="email"
id="email"
name="email"
autocomplete="email"
The second approach keeps the purpose of the field visible and creates a programmatic relationship between the label and input.
For a deeper explanation, DEV's guide to accessible form labels covers visible labels, required fields and grouping related controls.
Grouped choices deserve particular attention.
Instead of presenting several radio buttons without context, semantic HTML gives us
and :Preferred contact method
Phone
That extra structure doesn't require a JavaScript framework or accessibility library. It comes directly from HTML.
Sometimes the most useful accessibility improvements are simply a matter of using the browser's existing semantics properly.
Error Messages Need to Explain the Solution
Few things make a form feel more frustrating than:
Something went wrong.
What went wrong?
Where did it happen?
What should the user do about it?
Effective validation should provide enough information to answer those questions.
Compare:
Invalid input
with:
Enter your email address in the format name@example.com.
The second message gives the user something actionable.
Timing matters too.
Displaying an error after every keystroke may create unnecessary noise. Waiting until the entire form has been submitted may force the user to hunt through a long page to find several unrelated problems.
The right strategy depends on the field and context.
DEV's React Forms Deep Dive on UX, accessibility and performance explores different validation states and approaches to accessible error handling.
Whatever framework you use, useful principles include:
- Place field-specific errors close to the relevant input.
- Explain how the user may correct the problem.
- Don't erase valid information after another field fails.
- Preserve form state where practical.
- Use semantic and ARIA attributes appropriately when communicating validation states.
- Consider an error summary for particularly long forms.
The goal is not merely to identify incorrect data. It is to help users successfully fix it.
Accessibility Should Start With the Markup
Accessibility becomes much harder when it is treated as a final QA task.
A more reliable approach is to build accessibility into the component structure from the beginning.
That usually means starting with native elements such as:
- </li> <li><fieldset></li> <li><legend></li> <li><button></li> </ul> <p>Native elements already contain behaviours that developers otherwise need to recreate.</p> <p>For example, a real <button> works with keyboard interaction without developers manually attaching key handlers. A correctly associated <label> gives an input an understandable accessible name. A <fieldset> provides useful context for related controls.</p> <p>ARIA remains valuable when native semantics don't provide enough information, but it works best as an enhancement rather than a replacement for meaningful HTML.</p> <h2> <a name="visual-hierarchy-matters-too" href="#visual-hierarchy-matters-too" class="anchor"> </a> Visual Hierarchy Matters Too </h2> <p>Semantic markup isn't the entire experience.<br> A technically accessible form may still be exhausting if every question is squeezed into a dense block with tiny text and little spacing.</p> <p>Useful visual considerations include:</p> <ul> <li>Readable font sizes</li> <li>Comfortable spacing between inputs</li> <li>Clear section headings</li> <li>Strong contrast</li> <li>Obvious focus indicators</li> <li>Generous checkbox and radio-button targets</li> <li>Distinct primary and secondary actions</li> <li>Adequate space for error messages</li> <li>Consistent field widths and alignment</li> </ul> <p>Whitespace is particularly useful in longer intake forms.</p> <p>It tells users that one group of questions has ended and another is beginning. That visual separation may reduce the feeling that someone is facing one enormous task.</p> <h2> <a name="mobile-deserves-more-than-a-responsive-width" href="#mobile-deserves-more-than-a-responsive-width" class="anchor"> </a> Mobile Deserves More Than a Responsive Width </h2> <p>A form fitting inside a 375-pixel viewport does not necessarily mean it offers a good mobile experience.</p> <p>Developers should complete the actual form on a phone.</p> <p>That quickly reveals issues that desktop testing may miss:</p> <ul> <li>Does an email field trigger the appropriate keyboard?</li> <li>Are radio buttons easy to tap?</li> <li>Does the keyboard cover validation messages?</li> <li>Are dropdowns practical with one hand?</li> <li>Do sticky headers obscure focused fields?</li> <li>Does moving between steps require excessive scrolling?</li> <li>Does browser autocomplete work correctly?</li> <li>Is entered information preserved when the user switches apps and returns?</li> </ul> <p>Using the correct input type and autocomplete attributes may make routine information significantly easier to enter.</p> <p>For example:<br> <input<br> type="tel"<br> name="phone"<br> autocomplete="tel"</p> <blockquote> </blockquote> <p>Small implementation choices compound across a long form.</p> <h2> <a name="dont-forget-what-happens-after-submission" href="#dont-forget-what-happens-after-submission" class="anchor"> </a> Don't Forget What Happens After Submission </h2> <p>Form UX doesn't end when someone presses the button.</p> <p>The user still needs to know whether the action worked.</p> <p>A useful successful-submission state should answer questions such as:</p> <ul> <li>Was my information received?</li> <li>What happens next?</li> <li>Do I need to do anything else?</li> <li>Should I expect an email or other response?</li> </ul> <p>Similarly, if the request fails because of a network or server problem, the interface should avoid leaving users wondering whether their data was submitted.</p> <p>For sensitive or lengthy forms, uncertainty at the final step may be especially frustrating because the user has already invested considerable effort.</p> <p>The confirmation experience deserves the same attention as the form itself.</p> <h2> <a name="a-practical-developer-checklist" href="#a-practical-developer-checklist" class="anchor"> </a> A Practical Developer Checklist </h2> <p>Before releasing a longer intake form, work through it from the user's perspective.</p> <p>Ask:</p> <ul> <li>Is every field actually necessary?</li> <li>Are related questions grouped logically?</li> <li>Is the sequence predictable?</li> <li>Are sensitive questions given enough context?</li> <li>Are required and optional fields clearly distinguished?</li> <li>Do all inputs have meaningful labels?</li> <li>Are radio-button and checkbox groups properly identified?</li> <li>Is keyboard navigation logical?</li> <li>Are focus states visible?</li> <li>Do validation messages explain how to fix the problem?</li> <li>Is existing information preserved after an error?</li> <li>Could conditional disclosure remove irrelevant questions?</li> <li>Does the form remain usable on a small mobile screen?</li> <li>Is important privacy information easy to locate?</li> <li>Does the confirmation state explain what happens next?</li> </ul> <p>You don't necessarily need an elaborate design system to solve these problems.</p> <p>Often, a combination of sensible HTML, thoughtful information architecture, restrained JavaScript and deliberate UX writing produces the best result.</p> <h2> <a name="better-forms-respect-the-users-attention" href="#better-forms-respect-the-users-attention" class="anchor"> </a> Better Forms Respect the User's Attention </h2> <p>A web form is an interface between a database requirement and a human being.</p> <p>Developers naturally spend time thinking about schemas, validation rules, component state, API requests and error responses. Those things matter.</p> <p>But the user doesn't experience the schema.<br> They experience a sequence of questions.</p> <p>Looking at examples such as preliminary information reminds us that the context surrounding those questions matters just as much as the underlying implementation. When information is personal or the process is unfamiliar, clear structure, appropriate disclosure, accessible markup and useful feedback become especially valuable.</p> <p>A low-friction form isn't necessarily the shortest form.</p> <p>It is the form where users understand what is being asked, why it matters, what they need to do next and whether their action succeeded.</p> <p>That is ultimately what good interface development should achieve.</p>

Top comments (0)