Author photoMichal Dohnal
July 15th 2024

Preventing Text Overflow in Flex Layouts with Unknown Width

Overview

When working with flex layouts, you might encounter text content that overflows its container, especially when the container width is unknown or varies based on dynamic content. A commonly used technique—sometimes referred to as a hack—can help mitigate these overflow issues:

1.flex-item { 2 flex-grow: 1; /* Allow the container to take available space */ 3 min-width: 0; /* Prevent the container from expanding beyond its allowed width */ 4}

Setting flex-grow allows items to expand to fill unused space, while min-width: 0 ensures the container won’t grow so large that it forces other flex items (or the viewport) to resize in unexpected ways.

Why min-width: 0?

Browsers often assign a minimum width to flex items that is larger than zero, even if you don't explicitly set one. This can force items to take more space than you intend, leading to unpredictable text overflow or line breaks. By explicitly defining min-width: 0, you allow the flex item to shrink within the available space in a more predictable manner.

Examples

Example 1: A Simple Flex Layout with Overflowing Text

1<!DOCTYPE html> 2<html> 3 <head> 4 <style> 5 .container { 6 display: flex; 7 width: 300px; 8 border: 1px solid #ccc; 9 } 10 .flex-item { 11 flex-grow: 1; 12 min-width: 0; 13 background: #f3f3f3; 14 padding: 8px; 15 margin: 4px; 16 white-space: nowrap; 17 overflow: hidden; 18 text-overflow: ellipsis; 19 } 20 </style> 21 </head> 22 <body> 23 <div class="container"> 24 <div class="flex-item">This is a very long text that might otherwise overflow beyond the box boundaries!</div> 25 <div class="flex-item">Another item</div> 26 </div> 27 </body> 28</html>

In the code above:

  • The .container is set to a fixed width of 300px to demonstrate the overflow behavior.
  • Each .flex-item uses flex-grow and min-width: 0 to keep the text from overflowing.
  • white-space: nowrap; overflow: hidden; text-overflow: ellipsis; ensures that overflowing text is replaced with an ellipsis.

Example 2: Dynamic Width with Responsive Flex Layout

1<!DOCTYPE html> 2<html> 3 <head> 4 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 5 <style> 6 .container { 7 display: flex; 8 max-width: 600px; 9 margin: 0 auto; 10 border: 1px solid #ddd; 11 } 12 .flex-item { 13 flex-grow: 1; 14 min-width: 0; 15 padding: 16px; 16 border-right: 1px solid #ddd; 17 overflow: hidden; 18 text-overflow: ellipsis; 19 white-space: nowrap; 20 } 21 .flex-item:last-child { 22 border-right: none; 23 } 24 </style> 25 </head> 26 <body> 27 <h1>Responsive Flex Layout</h1> 28 <div class="container"> 29 <div class="flex-item">Item 1: Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div> 30 <div class="flex-item">Item 2: Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae.</div> 31 <div class="flex-item">Item 3: Praesent tincidunt purus id convallis viverra.</div> 32 </div> 33 </body> 34</html>

Here, the width of the container is capped at 600px, but the design remains responsive. Each .flex-item can shrink or grow to accommodate changing viewport sizes, without overflowing text.

Conclusion

Using flex-grow: 1; and min-width: 0; is a straightforward, proven approach to manage text overflow in flex layouts with dynamic or unknown widths. While some developers refer to it as a hack, it's a well-established best practice for ensuring your design remains flexible and text remains legible without unintended overflow.