Skip to main content
← 🎨 CSS as a design systemΒ·Module B6 Β· Lesson 6
TaskBuild a hero block with min-height: 100svh (fallback to 100vh) and background gradient. .hero { min-height: 100vh; min-height: 100svh; background: linear-gradient(135deg, #3B82F6, #A855F7); color: white; display: grid; place-items: center; }. Inside h1 'Always fits the visible viewport'.

Modern viewport units: dvh, svh, lvh

75 XP6 min
Theory

The "vh" you knew was lying

.hero { height: 100vh; }

On mobile, the browser bar shrinks/expands as you scroll. 100vh represents the LARGEST possible viewport (browser bar collapsed). Initial load shows the hero with the URL bar visible, your "100vh" hero is taller than the screen, content gets cut off.

The three new units (2022+)

.hero-small { height: 100svh; }    /* SMALL viewport β€” when URL bar is visible */
.hero-large { height: 100lvh; }    /* LARGE viewport β€” when URL bar is hidden */
.hero-dynamic { height: 100dvh; }  /* DYNAMIC β€” changes as URL bar changes */
  • `svh` β€” guaranteed minimum. The hero ALWAYS fits the visible viewport, even when URL bar shows. Safest for "above the fold" content.
  • `lvh` β€” maximum. Equivalent to old vh. Use when you don't care about scrolling.
  • `dvh` β€” animated. As the browser bar collapses, 100dvh grows. Smooth resize. Use sparingly (triggers layout shifts).

For hero blocks: min-height: 100svh is the modern default. Always-visible, no clipping.

Other axis-versions

  • vw / svw / lvw / dvw β€” width versions (rarely matter; horizontal browser chrome doesn't shift).
  • vmin / vmax β€” pick the smaller / larger dimension. 50vmin on landscape = 50% of height; on portrait = 50% of width.

Quick mobile fix

If your existing site uses 100vh heroes and gets clipped on mobile:

.hero {
  min-height: 100vh;       /* old, fallback */
  min-height: 100svh;      /* new, takes precedence in supporting browsers */
}

Two-line patch.

πŸ”’

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.