48px to REM

48px = 3rem at the default 16px root font size. Change the root size below if your project uses a different base.

By Mohamed Farhan · Updated Oct 19, 2026

Root font size

48px = 3rem at a 16px root font size

48px at other root font sizes

10px root4.8rem
12px root4rem
14px root3.4286rem
16px root3rem
18px root2.6667rem
20px root2.4rem

The formula

rem stands for "root em": a size relative to the font size of the html element. To convert, divide pixels by the root font size.

Formula
rem = px / root font size
48 / 16 = 3rem
CSS
.title {
  font-size: 3rem; /* 48px */
}

Nearby conversions

PixelsREM (16px root)Tailwind
32px2remp-8
36px2.25remtext-4xl
40px2.5remp-10
44px2.75remp-11
48px3remtext-5xl
56px3.5remp-14
60px3.75remtext-6xl
64px4remp-16

Where 48px is used

48px is Tailwind's text-5xl and a common desktop hero heading size. It is also the minimum recommended touch target size in Material Design (48 by 48 density-independent pixels), which is why many mobile buttons and list rows are 48px tall. As spacing, 48px separates major sections inside a page.

48px in type and spacing scales

  • On an 8px grid, 48px is exactly 6 units.
  • On a 4px grid, 48px is 12 units.
  • In Tailwind, 48px is the default size of text-5xl, and the spacing scale covers it as step 12 (p-12, gap-12).
  • As em, 48px is 3.429em inside 14px text, 3em inside 16px text and 2.667em inside 18px text.
  • As a percentage of the default 16px font size, 48px is 300%.

Line height and spacing for 48px text

If you use 48px (3rem) for display headlines, a line-height of about 1.1 works well, which gives 52.8px between baselines. Larger type needs proportionally less line-height, because the gaps between lines are already big. At display sizes, also tighten letter-spacing slightly (around -0.01em to -0.02em) and test the headline on a narrow phone screen, where long words may need to wrap or the size may need the fluid clamp() version below.

For spacing below a block of 48px text, a margin of 0.75em to 1em (36px to 48px) keeps the rhythm consistent with the text size. Writing these values in em ties them to the font size, so they adjust automatically if the text size changes.

A fluid 48px with clamp()

Instead of a fixed 3rem, you can let the size scale smoothly between a smaller value on phones and 48px on desktops. The CSS clamp() function takes a minimum, a preferred value and a maximum. The example below grows from 38px on a 375px-wide screen to 48px on a 1280px-wide screen, and never goes outside that range. Because the minimum and maximum are in rem, the size still respects the user's font settings.

CSS
.title {
  font-size: clamp(2.375rem, 2.116rem + 1.105vw, 3rem);
}

Why rem instead of px

A rem is relative to the root font size, so 3rem stays equal to 48px only while the root is 16px. When someone raises the default font size in their browser, say to 20px, the same 3rem becomes 60px, and your layout scales with it. A hard-coded 48px stays at 48px and ignores that preference.

That matters for accessibility. Many people with low vision rely on larger default text, and the WCAG resize text guideline expects content to remain usable when text is scaled up to 200 percent. Using rem for type and spacing is the simplest way to support that without extra work.

Common conversion mistakes

  • Assuming the root is always 16px. If your CSS sets html { font-size: 62.5% }, 48px is 4.8rem, not 3rem. Check the root before converting.
  • Converting borders. Keep 1px borders and hairlines in px; converting them to tiny rem values can make them render inconsistently.
  • Rounding too aggressively. Values like 0.8125rem look odd but are exact. If you round them, round to your spacing grid rather than to one decimal place.
  • Mixing units for the same role. If font sizes are in rem but margins are in px, spacing will not scale with text.

A worked example with 48px

Here is how 48px might appear in real CSS. The hero headline uses 3rem, spacing uses rem values from the same 16px base, and the border stays in px so it remains a crisp hairline. If a visitor's default font size is 20px, the headline grows to 60px and the spacing grows with it, while the border stays 1px.

CSS
.hero-title {
  font-size: 3rem;      /* 48px */
  line-height: 1.1;
  letter-spacing: -0.01em;
  margin-bottom: 1.5rem;   /* 24px */
}

Converting in Sass, CSS variables and JavaScript

If you convert values often, let your tools do it. In Sass, a small function such as rem($px) that returns math.div($px, 16px) * 1rem turns rem(48px) into 3rem at compile time. In plain CSS, you can keep the pixel value readable with calc(48 / 16 * 1rem), which modern browsers resolve to 3rem.

In JavaScript, for example when generating inline styles or design tokens, divide by the root font size: 48 / 16 = 3. If you need the live root size (for users who changed their default), read parseFloat(getComputedStyle(document.documentElement).fontSize) instead of assuming 16.

Naming 48px as a design token

Design systems rarely use raw numbers in components. Instead, 48px would live in a token such as --font-size-display-48 for type or --space-12 for spacing, defined once as 3rem. Components then reference the token, so a later change to the scale updates every use at once.

If your team uses Figma variables or a tokens file (for example in the W3C design tokens format), store the value in px for designers and generate the rem version in the build step. That keeps both sides speaking the same language while the shipped CSS stays accessible.

How browsers resolve rem

When the browser computes a rem value, it multiplies it by the computed font size of the html element. That font size starts from the user's default (16px unless they changed it), then applies whatever your CSS sets on html. So 3rem means "3 times the root size", and it is resolved once per page, unlike em, which is recalculated at every level of nesting.

Because the root is shared, rem values are predictable across the whole document: a 3rem gap in a sidebar is exactly the same size as a 3rem gap in a modal, regardless of the text size inside each.

Sass, CSS and JavaScript
// Sass
@use "sass:math";
@function rem($px, $base: 16px) {
  @return math.div($px, $base) * 1rem;
}
.card { padding: rem(48px); } // 3rem

/* CSS */
.card { padding: calc(48 / 16 * 1rem); }

// JavaScript
const root = parseFloat(getComputedStyle(document.documentElement).fontSize);
const rem = 48 / root; // 3 at a 16px root

Sources and further reading

Skip the unit math

Inspo AI generates responsive React + Tailwind screens with a consistent rem-based type and spacing scale built in.

Generate a screen

More conversions

Questions people ask

How many rem is 48px?

48px is 3rem when the root font size is 16px, which is the default in every major browser.

How do I convert 48px to rem?

Divide the pixel value by the root font size: 48 / 16 = 3rem. If your root font size is different, divide by that number instead.

What is 48px in Tailwind?

48px is the default size of Tailwind's text-5xl class. For spacing, 48px is the 12 step (for example p-12 or gap-12).

Why use rem instead of 48px?

rem scales with the user's browser font size setting, so layouts stay accessible for people who need larger text. px stays fixed regardless of that setting.

Is 48px a good font size?

48px is a display size for large headlines. See the line-height guidance above for pairing it with spacing.

What is 48px in em?

Inside text with a 16px font size, 48px is 3em. em is relative to the element's own font size, so the value changes if the parent text size changes.

Mohamed Farhan
Mohamed Farhan•Author & CEO•LinkedIn

↘ Building Inspo AI | AI-Powered Design Research & Builder Platform | Design Engineer.