Use when designing interactive elements — buttons, links, inputs, sliders, drag handles — to ensure visual appearance communicates the available action without requiring instructions or labels.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add jeffreytse/grimoire-core --skill apply-affordances --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Apply Affordances?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/jeffreytse-apply-affordances)More formats (shields.io, HTML) on the badges page.
---
name: apply-affordances
description: Use when designing interactive elements — buttons, links, inputs, sliders, drag handles — to ensure visual appearance communicates the available action without requiring instructions or labels.
source: Gibson "The Ecological Approach to Visual Perception" (1979); Norman "The Design of Everyday Things" (Basic Books, 1988/2013); NNG "Affordances and Signifiers" guideline
tags: [affordances, signifiers, interaction-design, ux, usability, visual-cues, ui-patterns]
---
# Apply Affordances
Design interactive elements so their appearance signals how they behave — without instructions, tooltips, or onboarding required.
## Why This Is Best Practice
**Adopted by:** Apple Human Interface Guidelines, Google Material Design, and Microsoft Fluent Design all codify affordance patterns (raised surfaces = pressable, underlines = clickable, cursor changes = draggable) as mandatory standards for their component libraries; IDEO's interaction design curriculum uses Norman's affordance model as the foundational framework
**Impact:** Norman (2013) identifies affordance failures — interactive elements that look decorative, or decorative elements that look interactive — as the primary cause of user errors in digital interfaces; NNG usability studies consistently find that unlabeled affordance violations (flat buttons indistinguishable from text, no hover cursor on clickable areas) account for 15–25% of task failures in unmoderated usability tests
**Why best:** Labels and instructions compensate for missing affordances but require reading; tooltips only appear on hover (unavailable on mobile); affordance-based design communicates function at a glance, in any language, without additional cognitive load — the signifier is the interface
Sources: Gibson "The Ecological Approach to Visual Perception" (Houghton Mifflin, 1979); Norman "The Design of Everyday Things" revised edition (Basic Books, 2013) Ch. 1–2; NNG "Signifiers, Not Affordances" (Norman, 2008)
## Steps
### 1. Identify the action each element affords
For each interactive element, state the affordance explicitly:
| Element | Afforded action |
|---------|----------------|
| Button | Press (triggers an action) |
| Link | Navigate (moves to a destination) |
| Input field | Enter text |
| Checkbox | Toggle on/off |
| Slider | Drag to a value |
| Drag handle | Reorder by dragging |
| Expand arrow | Reveal hidden content |
If you cannot name the afforded action in one word, the element's purpose is ambiguous to users too.
### 2. Apply the correct signifier for each affordance
A **signifier** is the visual property that communicates the affordance. Norman's distinction: the affordance is the capability; the signifier is the perceivable signal of it.
**Press (button):**
- Elevated shadow or border distinguishes from flat text
- Filled background or strong outline separates it from surrounding content
- Cursor: `pointer` on hover
- State: visibly pressed/active on click (slight scale or color shift)
**Navigate (link):**
- Underline or color contrast from body text
- Cursor: `pointer` on hover
- No underline links require color + weight contrast sufficient to distinguish from non-interactive text (WCAG 1.4.1 requires non-color distinction or 3:1 contrast ratio against surrounding text)
**Enter text (input):**
- Visible border or underline indicating a writable area
- Placeholder text inside the field (showing expected format, not repeating the label)
- Focused state with higher-contrast border
**Toggle (checkbox / switch):**
- Checkbox: square with visible boundary; filled when checked
- Toggle switch: pill shape; clearly distinct on/off positions with color + position change
- Never use ambiguous visual metaphors (a circle that could be a radio button or indicator)
**Drag (handle / reorder):**
- Grip dots, lines, or handle icon — not implied by layout alone
- Cursor: `grab` at rest; `grabbing` during drag
- Show affordance on hover, not just on activation
### 3. Check every state is perceptible
Each element must have visually distinct states:
| State | Must be perceivable |
|-------|-------------------|
| Default | The element exists and is interactive |
| Hover | Element responds to pointer |
| Focus | Keyboard focus visible (min 3:1 contrast, WCAG 2.4.11) |
| Active/pressed | Element is being activated |
| Disabled | Element is not interactive (reduced opacity + cursor: `not-allowed`) |
| Loading | Element is processing (spinner inline or disabled state) |
If two states are visually identical, users cannot tell the interface responded.
### 4. Test the blur test
Screenshot the UI and apply a Gaussian blur (5–8px). Any element that was obviously interactive before blur should remain distinguishable from non-interactive content after blur. If buttons, links, and body text look identical when blurred, signifiers are insufficient.
### 5. Test on mobile (no hover state)
Hover-only affordances (tooltip, cursor change) are invisible on touch devices. Every interactive element must be identifiable as interactive without hover:
- Buttons must look tappable without a hover shadow
- Links must be visually distinct from body text without the underline appearing on hover only
- Tap targets must be at minimum 44×44 CSS px (Apple HIG) or 48×48 dp (Google Material)
### 6. Audit for false affordances
Decorative elements that look interactive damage trust:
- Underlined decorative text → users click and nothing happens
- Card with drop shadow → users expect it to be tappable
- Icon without action → users tap and nothing happens
Remove decorative signifiers from non-interactive elements, or add the afforded action.
## Rules
- Every visible interactive element must have a signifier that communicates its action — tooltips and labels are supplements, not substitutes
- Never use color alone to signal interactivity — colorblind users and users on low-quality displays cannot distinguish color-only affordances
- All interactive states (hover, focus, active, disabled) must be visually distinct — identical states break the feedback loop
- Touch targets must be ≥44×44 CSS px — affordance breaks down when the tappable area is too small to activate reliably
- Consistent signifiers across the same component type — if one card is tappable, all cards in the same pattern should look tappable
## Common Mistakes
- **Ghost buttons (outline-only)**: low contrast, especially on colored backgrounds; users frequently miss them as interactive elements — use filled buttons for primary actions
- **Flat design without signifiers**: removing all shadows, borders, and underlines in pursuit of "clean" design leaves users guessing what's interactive; signifiers and minimalism are not opposites
- **Cursor: pointer on non-interactive elements**: using pointer cursor on div containers or decorative images trains users to expect a click that does nothing
- **Disabled state identical to default**: if disabled looks the same as enabled (just grayed text), users don't know why clicks fail; add `cursor: not-allowed` and reduced opacity
- **Affordance only revealed on hover**: critical affordances (the element is tappable) must not require hover to discover; hover should reinforce, not reveal
## When NOT to Use
- When designing for a platform with established component conventions (iOS, Android, Web) — defer to the platform's design system signifiers rather than inventing new ones; users already know what a native button looks like
- When the interactive element is part of a gesture-based or game UI where affordances are taught through onboarding — some interactions (swipe to dismiss, pinch to zoom) have no pre-existing signifier and require deliberate onboarding
Is 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!