Skip to main content
🎨 CSS as a design system·Module B8 · Lesson 4
TaskBuild a typography reset using :where (zero specificity) + a content rule using :is. :where(h1, h2, h3) { margin: 0; font-weight: 600; }. .article :is(h1, h2, h3) { color: #3B82F6; }.

:is() and :where() — selector list helpers

75 XP6 min
Theory

Two functions that simplify selector lists

/* Without — verbose */
.article h1, .article h2, .article h3 { color: #1a1a1a; }

/* With :is() — concise */
.article :is(h1, h2, h3) { color: #1a1a1a; }

:is() vs :where()

Both take a list of selectors. The difference is specificity:

  • `:is(selector-list)` — specificity = HIGHEST of the inner selectors.
  • `:where(selector-list)` — specificity = ALWAYS ZERO. Easy to override.
:is(h1, .title) { color: red; }     /* if .title matches, specificity is (0,1,0) */
:where(h1, .title) { color: red; }  /* specificity stays (0,0,0) — easy to override */

When to use which

  • `:is` — when you want NORMAL specificity (most cases).
  • `:where` — for RESETS and BASE styles you want easy to override.
:where(h1, h2, h3, h4, h5, h6) {
  margin: 0;
  font-weight: 600;
  line-height: 1.2;
}

This RESET rule has zero specificity. Any later rule (no matter how generic) overrides it.

Nesting savings

.feature :is(.left, .center, .right) :is(h2, h3) { ... }

Expands to 6 selectors. Without :is, you'd write all 6 by hand.

🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 10 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.