CSS wordwrap: Because Sometimes One Line Just Isn't Enough!
Tags: css, ux, frontend
Published: 2024-06-28 10:48:07


Controlling how text wraps with CSS can be a headache. CSS offers a number of text wrapping options to keep your content readable and responsive. So your text doesn't break the page layout or look like it lost a fight with a blender.

## Introduction

Text wrapping is vital in web design for content readability and visual appeal across different devices and screen sizes. CSS provides properties like `overflow-wrap`, `word-break`, `text-wrap` and `hyphens` that allow developers to control text behavior at the edge of its container. This post explores the practical use of these properties to manage long strings, prevent overflow, and enhance user experience. These CSS rules are essential when dealing with unbreakable URLs, optimizing text readability and maintaining responsive designs.

## Wrapping vs Truncation

For the purposes of this post I'm only going to focus on text that needs to be visible to the user, hence it needs to wrap and ignore the truncation option entirely. Although, there is some overlap in the use-cases, text truncation has a more specific use-case and is specifically for hiding content over a specific length. So I'm just going to skip over it here!

## Text wrapping style options

Let's jump straight in and take a look at some styles we can use to prevent strings form overflowing their container.

{% codepen https://codepen.io/clanceyp/pen/MWdVBEG  %}

## TLDR

Ok, I'm going to skip the boring bits and go straight to the summary. (For reference, the rather dry detail about each style follows further down the page.)

```css
/* use for headings */
.my-h1 {
  hyphens: auto;
  overflow-wrap: break-word;
  text-wrap: balance;
}
/* use for general static copy */
.my-text-container {
  hyphens: auto;
  overflow-wrap: break-word;
}
/* 
  use specifically for breaking long strings or
  on large/dynamic content containers which 
  may contain long strings
 */
.my-url-container,
.my-very-big-text-container,
.my-dynamic-text-container {
  overflow-wrap: break-word;
}
```

As with most things CSS, there is more than one way to solve the problem. But which is the best? Let's look at three use-cases. Headings where long words might overflow on small devices, static content containers which could contain long strings like URLs, and containers that could either contain a lot of content or are repeatedly updated dynamically. Let's take these three in revers order. For contains that contain a lot of content, or are dynamically updated we can use `overflow-wrap: break-word` this will keep the content within the containers' boundaries. For short or static content (see below for detail about hyphens and performance) we can add `hyphens: auto` this will improve readability, but we still keep `overflow-wrap: break-word` which will ensure that long strings still wrap if the content is in a language that the browser doesn't know how to hyphenate or the long strings aren't words. And lastly for headings (e.g. H1) we'll keep `hyphens` and `overflow-wrap` and we'll also add `text-wrap: balance` this adds visual balance to the mix, so the header wraps nicely.

## The boring bit

Let's look at the styles in more detail

### hyphens: auto;

Using `hyphens: auto` in CSS allows for automatic, language-aware hyphenation of text, which can significantly enhance the readability and aesthetic of text blocks, particularly in responsive designs and narrow layouts.

#### hyphens, on the downside

This does more than just breaking long strings that don't fit in the container. You might still get text overflowing the container, for example a very long number won't be hyphenated so will still remain on one line. `hyphens: auto` has a performance overhead due to the processing required to determine hyphenation points, especially in dynamic or large text content. To mitigate the impact of this, particularly for containers with extensive or frequently changing text, I recommend only using `hyphens: auto` on specific elements that would benefit from it, don't just randomly add it here, there and everywhere!

### overflow-wrap: break-word;

This style ensures that long words or unbreakable strings (such as URLs) break and wrap onto the next line instead of overflowing their container.

#### overflow-wrap, on the downside

Arbitrary word breaks at any point, which can lead to awkward or hard-to-read text breaks, disrupting the natural flow of reading. A small performance overhead (although less than that of hyphens).

### word-wrap: break-word;

This is an alias for `overflow-wrap: break-word`, which is the standardized property name. Use `overflow-wrap: break-word` instead.

### word-wrap: break-all;

I have nothing good to say about `word-wrap: break-all`. I can't think of any use-case for it. Only consider using this if you have a specific issue that isn't fixed by any of the other options!

#### break-all, on the downside

It breaks words excessively at any character, leading to awkward and very hard-to-read text at all widths.

## Balancing text-wrapping

The style `text-wrap: balance` does NOT break strings. This is shorthand property which controls how text inside an element is wrapped, it's not standard (yet) but has solid support in all major browser vendors. I use this on main header elements (e.g. h1) to visually balance the content and make it more aesthetically pleasing. This is part of the [css-text-4 text-wrapping proposal](https://www.w3.org/TR/css-text-4/#text-wrapping)

### text-wrap balance on the downside

I haven't seen any detailed performance metrics so I might be making too much of the potential performance impact. But nonetheless, I would only use this on specific static elements like headers. I wouldn't use this on large content blocks or anything that's repeatedly updated dynamically.


![Latin text twice, wrapping in different places to show the effect of the CSS text-wrap: balance rule](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m8a52a9lk24xjpb42mmv.png)

## Further reading

Some useful resources on text wrapping in CSS

- [Wrapping and breaking text](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_text/Wrapping_breaking_text)
- [CSS Text Wrapping: A Beginner's Guide](https://blog.hubspot.com/website/css-wrap-text)
- [CSS text-wrap](https://developer.mozilla.org/en-US/docs/Web/CSS/text-wrap)
- [CSS overflow-wrap](https://developer.mozilla.org/en-US/docs/Web/CSS/overflow-wrap)
- [css-text-4 text-wrapping proposal](https://www.w3.org/TR/css-text-4/#text-wrapping)
- [Use text-wrap: balance; to improve design and INP](https://www.erwinhofman.com/blog/use-text-wrap-balance-to-improve-inp/)