Vorinda
Design··13 min read

How to Choose a Website Color Scheme (with the 60-30-10 Rule)

How to choose a website color scheme using the 60-30-10 rule — pick a base, build harmony, check contrast and ship it as CSS variables.

Hasan Afzal
color theoryweb designbranding60-30-10
On this page

Most color advice stops at theory: a color wheel, some vague talk of "harmony," a mood board, and then you are on your own. This guide does the opposite. It is a repeatable, shippable process for how to choose a color scheme for a real website — from a single anchor color to a balanced, accessible palette using the 60-30-10 rule, ending in CSS variables you can paste into production. Every hex value below is verified, and every text-on-background pair is contrast-checked.

Start with one color (brand, mood, or psychology)

Every good website color scheme grows from one anchor color. Pick that first and the rest of the palette follows naturally; try to choose six colors at once and you will end up fighting yourself. There are three reliable ways to find your anchor.

Use an existing brand color

If you already have a logo, product, or packaging, your anchor is decided — you just need the exact value, not an approximation. Don't eyeball it from a screenshot; drop the asset into the Image Color Extractor to pull the precise hex, or build a full set of variants with the Brand Color Kit. A brand blue that is #2563EB should be #2563EB everywhere, not a sampled #2660E5 that drifts across pages.

Match a mood

No brand yet? Choose by feeling. Two axes do most of the work: temperature (warm reds, oranges and yellows feel energetic; cool blues, greens and violets feel calm and competent) and saturation (vivid reads as playful and loud, muted as premium and serious). A fintech dashboard and a children's app can share a hue and feel completely different on these two dials alone.

Lean on color psychology

Color carries learned associations worth respecting even if they are not laws. Blue signals trust and stability, which is why so much software leans on it (see the blue page); green reads as growth, health and money (more on green); orange and yellow feel friendly and urgent; purple creative or luxurious; black premium. For where these break down by culture, read the color psychology guide.

Build harmony around it (which scheme to use)

Once you have an anchor, you need a relationship for any colors you add — that relationship is what people mean by a color scheme. The five classic ones differ by how far apart the hues sit on the wheel.

SchemeHow it's builtFeelsBest for
MonochromaticOne hue, varied lightness/saturationClean, focusedMinimal UIs, content sites
Analogous2–3 neighboring huesCalm, cohesiveMarketing pages, nature/wellness brands
ComplementaryTwo opposite huesHigh energy, punchySports, CTAs, bold brands
Split-complementaryAnchor + two beside its oppositeBalanced contrastMost product sites
TriadicThree evenly spaced huesVibrant, playfulIllustration-heavy, kids, creative

For most websites the safest, most professional move is monochromatic or analogous for the interface, plus one complementary color held in reserve as an accent — cohesion everywhere, with a single pop of contrast where you want attention. The color schemes explained post covers the theory; to generate one from your anchor in seconds, use the Color Palette Generator: paste your hex, choose a harmony, copy the result.

Worked example: anchor #2563EB (a confident blue). A monochromatic scheme keeps the hue and changes lightness; an analogous scheme might add an indigo #4F46E5 and a cyan #0891B2; a complementary accent lands in the orange/amber range, around #F59E0B. We will build the rest of the system around that blue.

The 60-30-10 rule for balanced UI

The 60-30-10 rule is the most useful constraint in this whole process. Borrowed from interior design, it answers the question theory never does: how much of each color do you actually use? The split:

  • 60% — dominant. Fills most of the screen — on a website, almost always a near-neutral: your page background and large surfaces. It sets the tone and gives the eye somewhere to rest.
  • 30% — secondary. Supporting structure: text, cards, headers, sidebars, borders. Often a darker neutral or a desaturated version of your brand hue.
  • 10% — accent. The smallest slice and the loudest: buttons, links, active states, key highlights. This is where your brand color earns its keep.

The magic is the imbalance. A 33-33-33 split has no hierarchy — everything shouts, so nothing does. The accent reads as important because it is rare. The fastest way to ruin a palette is to use your vivid brand color for backgrounds: the moment it covers 60% of the screen it stops being special and starts being tiring.

Mapped onto a typical landing page, it looks like this:

SliceUI elementsExample value
60% dominantPage background, section backgrounds#F8FAFC
30% secondaryBody text, cards, borders, footers#0F172A text on #FFFFFF cards, #E2E8F0 borders
10% accentPrimary buttons, links, active nav#2563EB

Add neutrals and a real ramp

Here is what separates amateur palettes from professional ones: most of a real interface is neutral. Your brand color is the seasoning, not the meal. Before you obsess over the accent, build a proper neutral ramp — from near-white to near-black — for backgrounds, surfaces, borders, dividers, and text.

A flat #FFFFFF / #000000 / one gray is not enough. You want roughly nine to ten steps so you always have the right value on hand. A subtle trick: tint the neutrals slightly toward your brand hue (here, a touch of blue) so they feel intentional rather than dead gray. This cool "slate" ramp does exactly that:

StepHexTypical use
50#F8FAFCApp background
100#F1F5F9Hover/zebra rows
200#E2E8F0Borders, dividers
300#CBD5E1Disabled, subtle borders
400#94A3B8Placeholder text
500#64748BMuted icons
600#475569Secondary text
700#334155Strong secondary text
800#1E293BDark surfaces
900#0F172APrimary text, dark mode bg

With a ramp like this, "background, border, text" are no longer guesses — they are 50, 200, 900. You can build the equivalent light-to-dark ramp for any anchor with the Shade & Tint Generator and lock the whole neutral set in one pass.

Choose an accent for CTAs (and make it pop)

Your accent is the 10%, and its entire job is to make the next action obvious. Two rules keep it effective.

First, reserve it. If links, buttons, badges, and headings all use the brand color, nothing stands out. Use neutrals for everything structural and let the accent appear only on things you want clicked.

Second, maximize contrast against its surroundings, not just the legibility of its label. A blue button on a white page is fine; a blue button on a mostly-blue hero disappears. This is why a complementary accent works so well: against a cool blue interface, a warm #F59E0B button is impossible to miss. Just remember the accent needs readable text — amber takes dark text, not white:

.btn-primary {              /* blue CTA on light UI  */
  background: #2563EB;
  color: #FFFFFF;          /* 5.17:1 — passes AA     */
}

.btn-highlight {           /* amber CTA, warm pop    */
  background: #F59E0B;
  color: #0F172A;          /* 8.31:1 — dark text!    */
}

White on #F59E0B is only about 2.1:1 and fails badly — a classic mistake. Always test the actual pairing in the Color Contrast Checker before you commit.

Check accessibility before you commit

A scheme is not done until every text-on-background pair is legible. WCAG asks for 4.5:1 for normal text, 3:1 for large text (about 24px, or 18.66px bold) and for UI components like button borders, icons, and focus rings. Run your real combinations, not your hopes. Here are the pairs from the SaaS example above:

ForegroundBackgroundRatioVerdict
#0F172A#F8FAFC17.06:1Pass (AAA)
#475569#F8FAFC7.24:1Pass (AAA)
#FFFFFF#2563EB5.17:1Pass (AA)
#0F172A#F59E0B8.31:1Pass (AAA)
#FFFFFF#F59E0B2.15:1Fail

When a pair fails, the fix is almost always to adjust lightness, not hue — darken the text or fill until it passes and you keep your color identity. The deeper rules (AA vs AAA, the large-text exception, non-text contrast) live in accessible color contrast. Check every pair the moment you pick colors, not after you have built ten components on them.

Extract a scheme from an image or brand asset

When you have no starting hue, lift one from something that already works — a photo, packaging, or an illustration whose mood you love. Drop it into the Image Color Extractor to pull its dominant colors as exact hex, treat the most usable one as your anchor, then expand it into a complete, accessible system with the Brand Color Kit.

Ship it as CSS variables / design tokens

Theory is worthless until it is in code. Ship a scheme as CSS custom properties named by role, not by color. Name them --color-primary, never --color-blue — so the day the brand changes you swap one value and the whole site follows, and dark mode becomes a variable override instead of a rewrite.

:root {
  /* surfaces */
  --color-bg:           #F8FAFC;
  --color-surface:      #FFFFFF;
  --color-border:       #E2E8F0;
  /* text */
  --color-text:         #0F172A;
  --color-text-muted:   #475569;
  /* brand + action */
  --color-primary:      #2563EB;
  --color-primary-fg:   #FFFFFF;
  --color-accent:       #F59E0B;
  --color-accent-fg:    #0F172A;
}

@media (prefers-color-scheme: dark) {
  :root {
    --color-bg:         #0F172A;
    --color-surface:    #1E293B;
    --color-border:     #334155;
    --color-text:       #F8FAFC;
    --color-text-muted: #94A3B8;
    /* primary + accent stay on-brand; only neutrals flip */
  }
}

.card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  color: var(--color-text);
}

Notice that dark mode only flips the neutral ramp — the brand blue and amber are accessible against both light and dark surfaces, so they stay put. (If a brand hue feels muddy on dark, lighten it one step and keep dark text on it.) Prefer a manual toggle? Swap the media query for a [data-theme="dark"] selector on <html>. Using Tailwind? Map these same variables into your theme so bg-bg, text-text, and bg-primary resolve to your tokens — one source of truth, no hardcoded hex in markup.

5 website color schemes broken down (hex codes)

Five complete, contrast-checked starting points, each following 60-30-10: a dominant neutral, supporting structure, a reserved accent. Copy one, tweak the accent, and you have a defensible scheme in minutes.

1. Trustworthy SaaS — cool blue + slate

The default for software: calm, competent, gets out of the way.

RoleHexNote
Background (60)#F8FAFC
Surface (60)#FFFFFF
Text / borders (30)#0F172A / #E2E8F0text 17:1
Primary CTA (10)#2563EBwhite text, 5.17:1
Highlight (10)#F59E0Bdark text, 8.31:1

2. Calm & natural — green + cream

Wellness, sustainability, food, finance with a softer face.

RoleHexNote
Background (60)#FAFAF9warm off-white
Surface (60)#FFFFFF
Text / borders (30)#1C1917 / #E7E5E4text 16.7:1
Primary CTA (10)#15803Dwhite text, 5.02:1
Accent (10)#C2410Cterracotta, white text 5.18:1

3. Bold & modern — dark slate + lime

High-contrast dark UI for developer tools, crypto, gaming.

RoleHexNote
Background (60)#0F172A
Surface (60)#1E293B
Text / muted (30)#F8FAFC / #94A3B817.06:1 / 6.96:1
Borders (30)#334155
Accent CTA (10)#A3E635lime, dark text 11.84:1

4. Warm editorial — burgundy + paper

Publishing, premium content, anything that wants to feel printed.

RoleHexNote
Background (60)#FAF7F2warm paper
Surface (60)#FFFFFF
Text / muted (30)#292524 / #44403C14.19:1 / 9.61:1
Borders (30)#EAE0D5warm hairline
Primary CTA (10)#831843burgundy, white text 9.65:1
Accent (10)#B45309aged gold, white text 5.02:1

5. Minimal mono — grayscale + one violet

Portfolios and design-forward sites: nearly neutral, with a single deliberate hue.

RoleHexNote
Background (60)#FFFFFF
Surface (60)#F8FAFC
Text / muted (30)#0F172A / #47556917.9:1 / 7.58:1
Borders (30)#E2E8F0
Accent CTA (10)#7C3AEDviolet, white text 5.70:1

The process is the same for all five: one anchor, a harmony, the 60-30-10 split, a neutral ramp, a reserved accent, a contrast pass, and tokens. Run your own anchor through the Color Palette Generator and you have a scheme you can ship today.

Frequently asked questions

What is the 60-30-10 rule?

It is a balance ratio for an interface: roughly 60% of the visible surface is a dominant or neutral color, 30% is a secondary color, and 10% is an accent reserved for key actions. Giving each color a fixed amount of space is what keeps a palette from feeling chaotic.

How many colors should a website use?

In practice, one dominant neutral, one or two brand hues, and a single accent — about three to five real colors, each expanded into a light-to-dark ramp. More distinct hues than that and the interface starts to feel unfocused.

How do I pick a primary brand color?

Start from one anchor: an existing brand asset, the mood you want, or color psychology. Extract or choose a single hue you can defend, then confirm it still reads as your brand at small sizes and can carry legible white or dark text on a button.

What colors convert best for CTAs?

There is no universally best-converting color. What matters is contrast — the call-to-action should stand out from everything around it and have readable text. A warm accent on a cool interface, or any saturated color you reserve only for actions, tends to perform well.

How do I turn a color scheme into CSS?

Define each role — background, surface, border, text, primary, accent — as a CSS custom property in :root, then reference var(--color-...) throughout your styles. Add a prefers-color-scheme or data-theme block that overrides the same variables for dark mode.