Skip to main content
← 🎨 CSS as a design systemΒ·Module B6 Β· Lesson 4
TaskBuild three boxes with locked ratios. .box-square (aspect-ratio: 1, width: 200px, bg #fee). .box-video (aspect-ratio: 16/9, width: 100%, max-width: 320px, bg #eef). .box-portrait (aspect-ratio: 3/4, width: 150px, bg #efe).

aspect-ratio: stop the height calculations

75 XP6 min
Theory

Lock the proportions

.video { aspect-ratio: 16 / 9; width: 100%; }
.square { aspect-ratio: 1; }
.portrait { aspect-ratio: 3 / 4; }

Set EITHER width OR height; the browser computes the other. No more "padding-bottom: 56.25%" hacks.

When this saves you

  • Video / iframe embeds. YouTube needs 16:9. Twitch needs 16:9. Vimeo needs 16:9. aspect-ratio sets it once.
  • Image cards where you want consistent height regardless of source-image dimensions:
.card-image {
  aspect-ratio: 4 / 3;
  width: 100%;
  object-fit: cover;     /* crop to fit, don't squish */
}
  • Hero blocks with text overlay β€” the text always has the same proportional vertical space.

With img tags (use the attributes too)

Even when you set CSS aspect-ratio, the <img> tag should have its OWN width + height attributes for CLS prevention (A7 lesson 7). Browser uses the attributes BEFORE the image loads. CSS aspect-ratio is the canonical answer for non-image elements.

Sub-properties

aspect-ratio: auto 16 / 9 β€” "intrinsic if the element has natural dimensions, else 16:9." Useful for <img> fallback behavior.

πŸ”’

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.