Use when designing data-entry forms — to arrange fields, labels, and actions so users complete them faster and with fewer errors, independent of accessibility requirements.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add jeffreytse/grimoire-core --skill design-form-layout --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Design Form Layout?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/jeffreytse-design-form-layout)More formats (shields.io, HTML) on the badges page.
---
name: design-form-layout
description: Use when designing data-entry forms — to arrange fields, labels, and actions so users complete them faster and with fewer errors, independent of accessibility requirements.
source: "NNG \"Form Design Guidelines\" (Pernice, 2016); Wroblewski \"Web Form Design: Filling in the Blanks\" (Rosenfeld Media, 2008); Baymard Institute \"Form Usability\" research (2020, 40-guideline study)"
tags: [forms, form-design, form-layout, labels, validation, data-entry, checkout, ux-patterns]
---
# Design Form Layout
Use single-column layout, top-aligned labels, blur-triggered validation, and specific action labels to reduce form abandonment and completion time.
## Why This Is Best Practice
**Adopted by:** Google Material Design, Apple HIG, IBM Carbon, Shopify Polaris, and Atlassian Design System all specify single-column forms, top-aligned labels, and inline validation as their default form pattern; Baymard Institute's Form Usability research (2020) is the most comprehensive empirical study of form UX with 40 guidelines tested across 30+ major e-commerce sites; Luke Wroblewski's "Web Form Design" (Rosenfeld Media, 2008) is the canonical design reference used at Google, Yahoo, and across the industry
**Impact:** Baymard Institute: 26% of US adults abandon checkout primarily due to form friction; single-column forms are completed 15.4 seconds faster than multi-column forms of equivalent length (Wroblewski 2008); top-aligned labels reduce user eye-movement by 50% compared to right-aligned or left-aligned labels, and reduce completion time by 20% (Matteo Penzo eye-tracking study, LukeW 2006); inline validation reduces form errors by 22% compared to post-submit validation (Holst, Baymard 2020)
**Why best:** Multi-column forms feel efficient to designers because they show more fields per viewport — but eye-tracking shows users scan vertically, not in columns; column-jumping doubles eye movement and cognitive load; the efficiency gain in viewport usage is outweighed by the increase in completion time and error rate
Sources: Wroblewski "Web Form Design" (Rosenfeld Media, 2008); Baymard Institute "Form Field Usability" (2020); Penzo "Label Placement in Forms" (LukeW, 2006); NNG "Form Design Garage" (Pernice, 2016)
## Steps
### 1. Use single-column layout
Default to single-column forms. Place one field per row, full width:
```
❌ Multi-column:
[First name ] [Last name ]
[City ] [State ] [ZIP ]
✅ Single-column:
[First name ]
[Last name ]
[City ]
[State ]
[ZIP code ]
```
**When multi-column is acceptable:**
- Fields that are intrinsically linked and short: `[Month] [Day] [Year]` for a date
- `[City] [State/Province] [Postal code]` — these belong together conceptually and users expect this layout
- Side-by-side fields where both are ≤ 10 characters and their relationship is obvious
Outside these exceptions, default single-column.
### 2. Use top-aligned labels
Place labels above their input, not to the left or inside:
```
❌ Left-aligned (right of label):
Email address: [ ]
❌ Placeholder only (no persistent label):
[Email address ]
✅ Top-aligned:
Email address
[ ]
```
**Why top-aligned wins:**
- Eye movement is linear — top-aligned labels require one saccade from label to field vs two for left-aligned
- Labels above fields remain visible while the user is typing
- Placeholder-as-label disappears on type — users forget what the field was asking; never use placeholder text as the sole label (WCAG 2.5.3)
**Exception:** Very short inline forms (2–3 fields on a single row, e.g., email + subscribe button) can use inline labels or placeholder-as-label when the form is self-evident and fields are not sensitive.
### 3. Mark optional fields, not required ones
Invert the conventional asterisk pattern:
```
❌ Mark required with asterisk:
First name *
Last name *
Phone number *
Middle name ← user doesn't know if this is required or optional
✅ Mark optional explicitly:
First name
Last name
Phone number
Middle name (optional)
```
**Why:** When most fields are required (standard), marking required adds noise everywhere; marking optional tells users exactly which fields they can skip — the decision that matters. If more than 50% of fields are optional, consider removing the optional ones entirely; every field adds cognitive load and time.
### 4. Group related fields under section headers
For forms longer than 6 fields, group fields into named sections:
```
Contact information
───────────────────
First name
Last name
Email address
Shipping address
────────────────
Street address
City
State / Province
Postal code
Country
```
Groups reduce form paralysis — users tackle one section at a time instead of seeing a wall of fields. Use a visible divider or heading label; never group implicitly through whitespace alone.
**Multi-step forms:** For 10+ fields or multiple conceptual phases (account + shipping + payment), split into steps with a progress indicator. Multi-step forms outperform long single-page forms for completion rate when steps are conceptually distinct (Baymard 2020). Do not create steps just to appear shorter — each step must represent a coherent task.
### 5. Inline validation: on blur, not on keystroke
Trigger field validation when the user leaves the field (blur), not while they're typing:
```
Validation timing:
❌ On keystroke: user types "m" → "Invalid email" appears → hostile and premature
❌ On submit only: user fills 8 fields → submits → 3 errors appear → must scroll to find them
✅ On blur: user leaves the email field → if invalid, error appears immediately below that field
```
**Inline validation rules:**
- Error appears directly below the field that failed — never at the top of the form
- Error copy: state what failed + how to fix (see `write-microcopy`)
- On correction: re-validate on keystroke after a first error — user should see the error resolve as they type
- Success indicator (✓) is optional; only use if users frequently question whether their input is correct (e.g., password strength, coupon code validation)
### 6. Place the primary action at the bottom of the form
Primary action button placement:
```
✅ Standard layout:
[Form fields]
[Submit / primary action] [Cancel / secondary action]
Primary on left, secondary on right (web convention)
Exception: iOS — primary action on right (follows system convention)
```
**Action label:** Use a specific verb + object matching what happens when the form is submitted:
```
❌ "Submit" → no one wants to "submit"
❌ "Continue" → where? to what?
✅ "Create account"
✅ "Place order"
✅ "Save changes"
✅ "Send message"
```
**Disable primary action:** Do not disable the submit button pre-emptively. Disabling before the user has attempted to submit hides which fields are required. Only disable the button after submission begins (to prevent double-submit), then restore if the submission fails.
### 7. Handle the logical field order and tab sequence
Field order should match the mental model of what users are filling out, not the data model of the backend:
```
✅ User mental model order (checkout):
Contact → Shipping → Payment → Review
❌ Database order:
order_id, user_id, payment_method_id, shipping_address_id, created_at ...
```
Tab order must follow the visual order of the form — top to bottom, left to right within rows. Test by tabbing through the form; the focus ring must advance in reading order. Skipping fields, jumping to the wrong field, or focus disappearing entirely fails keyboard accessibility (applies to all users using keyboard, not just screen reader users).
## Rules
- Single-column layout by default — multi-column only for intrinsically linked short fields
- Top-aligned labels — never placeholder-only labels (WCAG failure + usability failure)
- Mark optional fields with "(optional)" — not required fields with asterisks, unless required fields are the minority
- Inline validation triggers on blur, not keystroke — errors appear immediately below the failing field
- Primary action label is verb + object specific to the outcome — never "Submit"
- Field order follows user mental model, not database schema
## Common Mistakes
- **Multi-column out of habit**: designers lay out First name / Last name side by side because "it looks clean" — it adds eye-movement and completion time; single-column is faster for users even when it looks longer
- **Placeholder text instead of labels**: reduces clicks in wireframe → fails in production when users forget what the field asks while they're typing; always use a visible, persistent label
- **Submit-time-only validation**: 8 fields submitted → 3 errors listed at top of form → user must hunt for which fields failed; inline validation on blur prevents this entirely
- **"Required *" asterisk without a legend**: asterisk convention is only understood by users familiar with forms — younger users and non-English-speaking users frequently do not recognize it; the "(optional)" label is universal
- **Generic action labels**: "Continue" after a checkout form — continue to what? Confirmation? Payment? The label must name the next state, not just imply forward movement
## When NOT to Use
- Single-field forms (newsletter signup with just email, search bar) — the layout principles for multi-field forms do not apply; a single field with a label above it is already the correct pattern
- Conversational form flows (chatbot-style forms, one question per screen) — these are designed to feel like interviews, not forms; the layout rules for traditional forms conflict with the conversational pattern intentionallyIs this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!