Icon Design Principles for Modern Interfaces
Icons are the most compressed form of visual communication in an interface: a 24-pixel square that must say "settings" instantly. This guide covers the principles behind icon sets that read clearly at small sizes, stay consistent across hundreds of glyphs, and work for everyone - including the production and accessibility details people skip.
The Short Answer
- Design on a grid (24px is the standard) with consistent keyshapes so every icon carries the same visual weight.
- Pick one style - outline or filled - and one stroke weight, and hold it across the entire set.
- Test every icon at 16px and 24px; if it is not readable there, simplify it.
- Decorative icons get
aria-hidden="true"; meaningful icons need text labels oraria-label. Never rely on an icon alone for a critical action without a label nearby. - Ship icons as inline SVG with a consistent viewBox, currentColor fills, and no fixed dimensions baked in.
1. The Grid and Keyshapes
Icon grids exist to make different shapes feel like they weigh the same. A circle and a square drawn at the same pixel size do not look the same size - the circle looks smaller. Keyshapes compensate: the circle is drawn slightly larger than the square so they appear equal.
A common setup:
- Artboard: 24 x 24px, with 2px padding on all sides (the live area is 20 x 20).
- Keyshapes: circle, square, horizontal rectangle, vertical rectangle - each sized to look optically equal.
- Stroke: 2px at 24px grid (1.5px also works; pick one).
Every icon is drawn to fill its keyshape. A "home" icon fills the square-ish area; a "play" triangle is sized to match the circle's visual weight. This discipline is what separates a set from a collection.
2. Stroke vs Fill: Pick One
Outline (stroke) icons - drawn with strokes, hollow centers. Feel lighter and more modern; the current default for most interfaces. Strokes must be consistent: same weight, same end caps (round), same joins.
Filled (solid) icons - solid shapes. Read better at very small sizes and carry more visual weight; good for selected/active states. A common pattern: outline for the default state, filled for the active state - the weight change communicates selection without color.
Two-tone - a mix, usually a filled shape with a knocked-out detail. Useful but harder to keep consistent; commit to it fully or skip it.
Never mix outline and filled icons in the same set unless the difference carries meaning (like the active-state pattern above).
3. Designing for Small Sizes
Icons live at 16-24px. At that size, detail dies:
- Simplify ruthlessly. A settings gear needs 8 teeth at 24px, not 16. Remove interior detail that turns to mush.
- Keep counters open. The holes in letters and shapes (the counter of an "e", the gap in a magnifier handle) must stay open at the smallest size or the icon reads as a blob.
- Mind the pixel grid. Align strokes to whole pixels at the target size to avoid blurry half-pixel rendering. This matters less with SVG on high-DPI screens, but it still matters on standard displays.
- Test in context. An icon that looks perfect at 200% in the design tool may fail at 16px in a toolbar. Always check at real size, in the real UI, against the real background.
4. Consistency Across a Set
A set of 200 icons designed by five people over two years stays coherent through rules:
- Same grid, same keyshapes, same stroke weight - the non-negotiables.
- Same corner radius. If one icon uses 2px rounded corners, they all do.
- Same level of detail. A hyper-detailed "printer" next to a minimal "trash" looks like two different products.
- Same metaphor logic. If "delete" is a trash can, "archive" should be a box, not an abstract arrow - metaphors should come from the same world.
- A review pass. New icons get checked against the set before shipping. Icon debt accumulates exactly like code debt.
5. Production: SVG Done Right
Ship icons as inline SVG:
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
aria-hidden="true">
<circle cx="12" cy="12" r="9"/>
<path d="M12 7v5l3 3"/>
</svg>
The rules:
- viewBox="0 0 24 24", no width/height attributes - size with CSS.
- currentColor for stroke/fill so icons inherit text color automatically.
- aria-hidden="true" on decorative icons so screen readers skip them.
- Clean paths. Expand strokes to outlines for final assets when the icon will be used at fixed sizes, or keep strokes live if the set needs weight variants.
- One icon, one file, named consistently (
icon-settings.svg), in a versioned directory.
For large sets, SVG sprites or an icon component library (one component per icon, tree-shakeable) beats hundreds of individual files.
6. Accessibility: Icons and Meaning
Icons fail accessibility in predictable ways:
- Icon-only buttons (a trash can with no text) must have an accessible name:
aria-label="Delete"on the button. - Decorative icons next to real text labels get
aria-hidden="true"- otherwise screen readers announce "image" redundantly. - Status icons (a red error icon) never carry meaning alone. Pair with text; color-blind users cannot rely on the color, and the icon alone may not convey which state.
- Contrast. Icons that convey meaning must meet the 3:1 non-text contrast ratio against their background.
7. When to Use an Icon Library vs Custom
Use a library (Lucide, Heroicons, Material Symbols, Phosphor) when: the product needs standard UI icons fast, consistency matters more than distinctiveness, and the budget is zero. These libraries are well-drawn, consistent, and free.
Draw custom when: the icons are brand-differentiating (a product whose iconography is part of its identity), the library lacks domain-specific metaphors, or existing icons misrepresent the concept. Custom sets cost real time - budget roughly 1-2 hours per icon for a professional set including review.
Hybrid is common: library for standard UI (search, close, chevron), custom for the product's signature concepts.
8. Worked Example: Drawing a Settings Icon
The principles above, applied to the most-drawn icon in UI design - the gear.
Start with the keyshape. On a 24px grid with 2px padding, the gear body should fill roughly the same visual area as the set's circle keyshape. Draw the outer ring first: a circle of about 16px diameter centered on the artboard.
Teeth: count and shape. Eight teeth at 24px; more teeth turn to noise at 16px. Each tooth is a short trapezoid, not a rectangle - slightly tapered teeth read as mechanical; square teeth read as clipart. Keep the tooth height modest: aggressive teeth make the icon feel busy.
The center hole. A 6px circle knocked out of the center. This is the counter - at 16px it must stay visibly open. If your set uses 2px strokes, the hole's stroke is 2px like everything else.
Check against the set. Place the gear next to the set's search, bell, and user icons. Does it carry the same visual weight? Gears often run heavy because of the teeth - if it dominates, reduce the outer diameter by 1px or thin the teeth. Squint: all four icons should blur to roughly the same gray blob.
The 16px test. Render at 16px. If teeth merge into the ring, reduce the tooth count to six for a dedicated small-size variant, or simplify the tooth shape. Many professional sets ship separate 16px drawings for their most detailed icons rather than scaling the 24px art.
States. If the set uses the outline/filled convention, draw the filled variant: same geometry, solid fills, with the center hole knocked out (a compound path, not a white circle on top - a white circle breaks on non-white backgrounds).
This is 1-2 hours of work for one icon including review. Multiply by a 200-icon set and the "just draw some icons" estimate starts to look like what it is: a multi-week project. Which is exactly why the library-vs-custom decision in section 7 matters.
Frequently Asked Questions
What size should UI icons be? 24px is the standard grid; 16px and 20px are common in dense UIs. Design on 24 and scale down - never design at 16 and scale up.
Should icons be outline or filled? Outline is the current default for interfaces and feels lighter. Filled reads better at tiny sizes. Either is fine; mixing them without a system is not.
How do I make icons accessible?
Decorative icons: aria-hidden="true". Icon-only buttons: aria-label describing the action. Status icons: always paired with text, never color-alone.
Can I recolor SVG icons with CSS?
Yes - if they use currentColor for stroke/fill, they inherit the CSS color of their parent. That is why baking in hex colors is a mistake.
How many icons does a product need? Start with 30-50 core UI icons. Grow deliberately with the review pass described above. An inconsistent 300-icon set is worse than a tight 50-icon one.
Continue Reading
- UI Kit Selection: From Beginner to Pro - evaluating kits with icon sets
- Building a Design System from Scratch - systematizing iconography
- WCAG 2.2: A Practical Accessibility Guide - non-text contrast rules