DEV Community

Cover image for How to Scale Fonts Responsively with CSS for Different Screen Sizes
sikiru
sikiru

Posted on • Updated on • Originally published at Medium

How to Scale Fonts Responsively with CSS for Different Screen Sizes

Responsive web design is critical today to provide an optimal viewing and interaction experience for users across various devices and screen sizes. A key aspect of responsive design is scaling text and fonts proportionally based on screen size to maximize readability.

In this post, we’ll explore different techniques and best practices for scaling fonts responsively in CSS across desktop, tablet, and mobile layouts.

Setting the Viewport Meta Tag

The first step in responsive web design should be including the viewport meta tag in your HTML page’s head section. This instructs the browser to use a responsive rendering:

<meta name="viewport" content="width=device-width, initial-scale=1">
Enter fullscreen mode Exit fullscreen mode

Setting the viewport width to the device width and the initial zoom level to 1 allows the page to match the screen’s dimensions and scale the content appropriately. Without this, mobile browsers may render pages at a desktop screen width then shrink it down, leading to an overly small text size.

Using CSS Media Queries

CSS media queries allow you to apply CSS styles conditionally based on device characteristics like width, resolution, and orientation. This is key for responsive font scaling.

For example, you can increase the base font size for larger screens and decrease it for smaller mobile screens:

/* Base styles */
body {
  font-size: 16px;
}

/* Larger screens */
@media (min-width: 992px) {
  body {
    font-size: 18px;
  }
} 

/* Smaller tablets and mobiles */
@media (max-width: 768px) {
  body {
    font-size: 14px;
  }
}
Enter fullscreen mode Exit fullscreen mode

Now the body text will scale from 14px up to 18px as the viewport expands.

You can also set different font sizes for landscape versus portrait orientations on mobile.

Using CSS Locks

CSS lock units like vw, vh, vmin, and vmax can help size text responsively, as they are relative units based on the viewport dimensions.

For example:

body {
  font-size: 4vw; 
}
Enter fullscreen mode Exit fullscreen mode

This sets the base font size to 4% of the viewport width. As the viewport gets larger or smaller, the text size scales proportionally.

Lock units work well for heading sizes too:

h1 { 
  font-size: 6vw;
}

h2 {
  font-size: 5vw;
}
Enter fullscreen mode Exit fullscreen mode

One downside is text can appear too large on wide screens. You can mitigate this with media queries to set maximum font sizes for wide layouts.

Using rem or em Units

The rem (root em) unit is relative to the root html font size. em is relative to the parent element’s font size.

These are useful for responsive scaling as you can size text elements proportionally by setting their rem or em values in relation to the base html font size set with media queries.

For example:

html {
  font-size: 14px; 
}

h1 {
  font-size: 3rem; /* 3 * 14px = 42px */
}

p {
  font-size: 1rem; /* 1 * 14px = 14px */  
}

@media (min-width: 768px) {
  html {
    font-size: 16px;
  }

  h1 {
    font-size: 3rem; /* 3 * 16px = 48px */
  }

  p {
    font-size: 1rem; /* 1 * 16px = 16px */
  }
}
Enter fullscreen mode Exit fullscreen mode

This allows all text elements to scale up or down based on the root html font size set via media queries.

Using JavaScript

For more dynamic control, you can use JavaScript to detect the browser width and dynamically set CSS font-size styles:

const setFontSize = () => {const width = window.innerWidth;

  if (width >= 1200) {
    document.body.style.fontSize = "18px";
  }
  else if (width >= 992) {
    document.body.style.fontSize = "16px";
  }
  else {
    document.body.style.fontSize = "14px"; 
  }};

   window.addEventListener("resize", setFontSize);
   setFontSize(); // Initial call
Enter fullscreen mode Exit fullscreen mode

This allows setting font sizes based on discrete breakpoint values for improved readability across device sizes.

You can enhance it further by debouncing resize events and using matchMedia for finer control.

Setting Minimum and Maximum Font Sizes

It’s good practice to set minimum and maximum font sizes in your CSS to maintain legibility:

body {
  font-size: 16px;
  min-font-size: 12px;
  max-font-size: 20px;
}
Enter fullscreen mode Exit fullscreen mode

The font size will scale between 12px and 20px, preventing excessively large or small text.

You can combine this with media queries to have different min/max values for different layout sizes.

Line Height and Vertical Rhythm

Line height should also scale responsively to maintain vertical rhythm. One method is using unitless line heights that are proportional to the font size.

For example:

body {
  line-height: 1.5;
}

p {
  line-height: 1.4;
}
Enter fullscreen mode Exit fullscreen mode

The line height will always relate proportionally to the different font sizes.

Alternatively, you can use viewport units:

body {
  line-height: 4vh;
}
Enter fullscreen mode Exit fullscreen mode

Testing Responsiveness

Be sure to test your font sizes on real devices in both portrait and landscape orientations. Responsive design issues may not be apparent when just resizing your browser window.

Services like BrowserStack allow previewing your site across 1000+ real mobile and desktop environments to catch responsive font scaling issues.

Conclusion

Responsive font scaling enhances legibility across screen sizes and is critical for mobile experiences. Various CSS techniques exist like media queries, viewport units, rem/em sizing, and minimum/maximum values to scale typography proportionally. Testing on real mobile devices is key to ensure your responsive fonts work beautifully everywhere.

Proper responsive font scaling provides a polished, optimized experience wherever your site is viewed. With robust CSS strategies and thorough testing, you can craft typography that dynamically adapts for any device or layout.

Top comments (1)

Collapse
 
_ndeyefatoudiop profile image
Ndeye Fatou Diop

Very nice post ! Generally I prefer rem over em because with em the font can vary a lot since it depends on the parent font size.
I found this great post that explains the difference => digitalocean.com/community/tutoria...