~/
CSS Units
Quiz
...

CSS Units

beginner · updated Tue Sep 08 2026Contribute

Master CSS measurement units including px, em, rem, %, vw, and vh to create responsive and scalable layouts for modern web development.

CSS Units

Units define sizes in CSS. Choosing the right unit affects responsiveness and accessibility.

Absolute Units

Fixed sizes that don’t change:

/* Pixels */
width: 100px;
font-size: 16px;

/* Points (print) */
font-size: 12pt;

/* Inches */
width: 5in;

/* Centimeters */
width: 10cm;

/* Millimeters */
width: 100mm;

Best for: Borders, small adjustments, print styles

Relative Units

Units relative to other values:

em

Relative to parent element’s font size:

/* Parent: 16px */
.parent {
  font-size: 16px;
}

.child {
  font-size: 1.5em;    /* 24px (16 × 1.5) */
  width: 10em;         /* 160px (16 × 10) */
  padding: 1em;        /* 16px (16 × 1) */
}

Problem: Compounds in nested elements.

rem

Relative to root element’s font size:

/* Root: 16px */
html {
  font-size: 16px;
}

h1 {
  font-size: 2rem;     /* 32px (16 × 2) */
}

p {
  font-size: 1rem;     /* 16px (16 × 1) */
}

.child {
  font-size: 1.5rem;   /* 24px (16 × 1.5) — doesn't compound */
}

Best for: Font sizes, consistent sizing

Percentage

Relative to parent element:

.parent {
  width: 500px;
}

.child {
  width: 50%;          /* 250px (500 × 0.5) */
  font-size: 120%;     /* 19.2px (16 × 1.2) */
}

Viewport Units

Relative to the viewport (browser window):

/* vw: viewport width */
.full-width {
  width: 100vw;        /* Full viewport width */
}

/* vh: viewport height */
.full-height {
  height: 100vh;       /* Full viewport height */
}

/* vmin: smaller of vw/vh */
.small-square {
  width: 50vmin;
  height: 50vmin;
}

/* vmax: larger of vw/vh */
.large-square {
  width: 50vmax;
  height: 50vmax;
}

Sized Units

Relative to font size:

/* ch: width of "0" character */
.narrow-column {
  width: 40ch;
}

/* ex: height of "x" character */
.tall-text {
  line-height: 2ex;
}

/* cap-height: height of capital letters */
.capital-text {
  font-size: 1cap;
}

Complete Example

/* Root font size for rem */
html {
  font-size: 16px;
}

/* Responsive typography */
h1 {
  font-size: clamp(1.5rem, 4vw, 3rem);
}

h2 {
  font-size: clamp(1.25rem, 3vw, 2rem);
}

p {
  font-size: 1rem;
  line-height: 1.6;
}

/* Container with max-width */
.container {
  width: min(100%, 1200px);
  margin: 0 auto;
  padding: 0 clamp(1rem, 3vw, 2rem);
}

/* Card with responsive sizing */
.card {
  width: min(100%, 300px);
  padding: clamp(1rem, 2vw, 2rem);
  margin: 1rem;
}

/* Hero section */
.hero {
  width: 100vw;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Sidebar */
.sidebar {
  width: clamp(200px, 25vw, 300px);
}

/* Content area */
.content {
  flex: 1;
  min-width: 0; /* Prevent overflow */
}

CSS Functions with Units

clamp()

Minimum, preferred, maximum:

font-size: clamp(1rem, 2.5vw, 2rem);
/* Minimum: 1rem, Preferred: 2.5vw, Maximum: 2rem */

width: clamp(300px, 50%, 600px);

min() and max()

width: min(100%, 500px);    /* Smaller of the two */
width: max(300px, 50%);     /* Larger of the two */

calc()

Mathematical calculations:

width: calc(100% - 40px);
height: calc(100vh - 80px);
font-size: calc(1rem + 2vw);

Unit Comparison

Unit Relative To Best For
px Nothing (absolute) Borders, small sizes
em Parent font size Padding, margin
rem Root font size Font sizes
% Parent element Width, layout
vw Viewport width Full-width elements
vh Viewport height Full-height sections
ch Character width Line length
clamp() — Responsive sizing

Complete Example: Responsive Layout

:root {
  --spacing-xs: 0.25rem;
  --spacing-sm: 0.5rem;
  --spacing-md: 1rem;
  --spacing-lg: 2rem;
  --spacing-xl: 4rem;
}

body {
  font-size: 1rem;
  line-height: 1.6;
}

.container {
  width: min(100% - 2rem, 1200px);
  margin-inline: auto;
  padding-block: var(--spacing-lg);
}

.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
  gap: var(--spacing-md);
}

.card {
  padding: var(--spacing-md);
  border: 1px solid #ddd;
  border-radius: 0.5rem;
}

/* Responsive typography */
h1 {
  font-size: clamp(1.75rem, 5vw, 3rem);
  margin-bottom: var(--spacing-md);
}

p {
  font-size: clamp(0.9rem, 2vw, 1rem);
  max-width: 65ch; /* Optimal reading width */
}

/* Hero section */
.hero {
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: var(--spacing-xl) var(--spacing-md);
}

Best Practices

  1. Use rem for font sizes — Scales with user preferences
  2. Use em for padding/margin — Scales with font size
  3. Use % for widths — Responsive to parent
  4. Use vw/vh for full-screen — Viewport-relative
  5. Use clamp() — Modern responsive sizing

Common Mistakes

  1. Using px for everything — Doesn’t scale
  2. Using em for everything — Compounds in nesting
  3. Ignoring user preferences — Always use relative units
  4. Not testing on mobile — Viewport units behave differently
  5. Overusing viewport units — Can cause scrolling issues