Form Design Best Practices
Nobody likes filling out forms. They're work. They're friction. Every field you add is a chance for the user to give up and leave.
But forms are necessary. You need that email. You need that payment info. The question isn't whether to have forms - it's how to make them as painless as possible.
Here's what actually works.
Reduce Fields Ruthlessly
Every field you remove increases conversion. This is one of the most-tested findings in UX research. Fewer fields equals more completions.
Ask yourself for every field: do we absolutely need this? Can we get it later? Can we infer it from something else?
Combine first and last name into a single "Full name" field unless you truly need them separate. Most don't.
Drop the phone number if you're not going to call them. Optional fields are almost always skipped anyway - why add noise?
Infer what you can. Get location from IP. Get company from email domain. Fill in city/state from zip code.
The "confirm password" field? It's been proven that a single password field with a "show password" toggle has similar error rates with less frustration. Kill the confirm field.
One Column Layout
Multi-column forms look efficient. They're not. Users lose their place, miss fields, and make more errors.
Single column, every time. Fields stack vertically, one after another. The user's eye has exactly one path to follow.
Exception: short related fields like city/state/zip can share a row. First name/last name sometimes. But only if they're clearly grouped and short.
Labels Above Fields
Labels belong above the input, not beside it. Not as a placeholder inside it.
Why not beside? It creates a visual zigzag pattern that slows reading. It also breaks on mobile where there's no room.
Why not as placeholder? Placeholders disappear when you start typing. Users forget what the field was for. They can't tell filled from empty at a glance. Accessibility is worse.
Labels above inputs. Always. It's readable, accessible, and works on every screen size.
Make Fields Look Interactable
An input field should look like an input field. That means:
- Clear boundaries (border or background that contrasts with page)
- Generous clickable area (at least 44px height for touch)
- Enough internal padding so text doesn't touch edges
- Visible focus state when selected
Minimal design trends sometimes produce inputs that look like regular text until you click them. Don't do this. Discoverability matters.
Input Types Matter
HTML gives you semantic input types. Use them.
type="email" shows email keyboard on mobile and enables basic validation.
type="tel" shows number pad for phone numbers.
type="number" with inputmode="numeric" for numeric input.
type="password" hides input and triggers password managers.
type="date" shows native date picker (though you might want a custom one for consistency).
These details seem small but they dramatically improve mobile experience.
Validation: Real-time Wins
Don't wait until submit to tell users what's wrong. Validate as they go.
But timing matters. Don't validate while they're still typing - that's annoying. Validate on blur (when they leave the field) or after a short pause.
For success: a subtle checkmark or green border. Don't be too aggressive with positive feedback.
For errors: border color change, icon, and message explaining what's wrong. "Please enter a valid email" is better than "Invalid input."
Always let users fix errors. Don't block them from other fields while something is invalid.
Error Messages That Help
Generic error messages are useless. "This field is required" tells them nothing about why or how to fix it.
Good error messages:
- Explain what went wrong: "Email addresses need an @ symbol"
- Say how to fix it: "Enter your email in the format name@example.com"
- Are human: "We couldn't find that zip code. Double-check it?"
Position error messages directly below the field. Don't dump all errors at the top of the form - users have to play matching game.
Button Copy and Placement
"Submit" is a waste of a button. Use action-specific copy that tells users what happens next.
Instead of "Submit": "Create account", "Send message", "Complete purchase", "Start free trial"
The button should confirm the value, not the action.
Placement: primary button at the bottom of the form, aligned left or full width on mobile. If there's a secondary action (cancel, back), put it to the left of the primary, less visually prominent.
Progress and Chunking
Long forms need to be broken up. Nobody wants to see 20 fields on one page.
Options:
Multi-step forms: Show one section at a time with progress indicator. "Step 1 of 3" with visual progress bar. Users complete one section, click next, see the next section.
Accordion sections: All sections visible but collapsed. Users expand one at a time. Good when users might want to jump around.
Grouped sections: Single page but with clear visual groupings and section headers. Works for medium-length forms.
Multi-step usually has the best completion rates for long forms because it feels more manageable.
Smart Defaults and Autocomplete
Pre-fill what you can. If you know their country, pre-select it. If most users choose a certain option, make it the default.
Enable browser autocomplete properly. Use the right autocomplete attributes:
autocomplete="name"for full nameautocomplete="email"for emailautocomplete="tel"for phoneautocomplete="street-address",address-line1, etc. for addressesautocomplete="cc-number"for credit card
Browser autocomplete is one of the best UX features users don't think about. Don't break it.
Mobile Considerations
Forms are harder on mobile. Smaller target areas, virtual keyboards, distraction-prone environment.
Mobile-specific tips:
Bigger touch targets. 44x44px minimum for anything tappable.
No tiny dropdowns. They're hard to use with touch. Consider button groups for small option sets.
Use the right keyboard. Email fields should trigger email keyboard. Numbers should trigger number pad.
Don't hijack zoom. Let users zoom if they need to. Font should be 16px+ to prevent auto-zoom on iOS.
Test on real devices. Simulator doesn't capture the actual pain points.
Accessibility Requirements
Forms are where accessibility often fails. Getting this right is both ethical and legal.
Must-haves:
Labels linked to inputs. Every input needs a <label for="inputId"> or be wrapped in a label element. Screen readers depend on this.
Error announcements. Errors should be announced to screen readers. Use aria-invalid="true" and aria-describedby pointing to the error message.
Focus visible. Users navigating by keyboard need to see where they are. Never remove focus outlines without adding a visible alternative.
Logical tab order. Tab through your form. Is the order sensible? Does it match visual order?
After Submission
The form isn't done when users hit submit.
Loading state: Disable the button and show a spinner or "Processing..." Users should know something is happening.
Success state: Clear confirmation that it worked. "Thanks! Check your email." Don't leave them wondering.
Error handling: If submission fails (network error, server error), tell them what happened and let them retry without losing data.
Your Form Checklist
- Every field absolutely necessary?
- Single column layout?
- Labels above inputs (not placeholders)?
- Proper input types and autocomplete?
- Real-time validation with helpful messages?
- Action-specific button copy?
- Works on mobile with right keyboards?
- Accessible (labels, errors, focus)?
- Clear feedback after submission?
Forms aren't glamorous. But they're where conversion happens or doesn't. Invest the time to get them right.