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,
100dvhgrows. 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.50vminon 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.