Kombai Logo

Tailwind CSS Flex Grow

Flex Grow defines how a flex item can expand when there is extra space available in its container. It helps you manage how content resizes to fill remaining space in a flex parent, ensuring cleaner, more adaptive layouts.

Tailwind CSS offers grow and grow-0 utility classes to quickly enable or disable growth for specific items. In this guide, we will learn how to effectively work with the grow utilities.

ClassPropertiesExample
growflex-grow: 1;<div className="grow"></div>
grow-0flex-grow: 0;<div className="grow-0"></div>

Overview of Flex Grow

Adding the Flex Grow

Flex Grow expands an element to consume free space within the layout. In CSS, this is done by setting flex-grow: 1;. In Tailwind, you use the utility grow to grow the item in the container.

In the below example, the second item expands to fill the remaining space of the container due to the grow utility:

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Removing the Flex Grow

Controlling whether an item should not grow at all is useful when you want a defined size to remain fixed. In CSS, that corresponds to flex-grow: 0;. To replicate this in Tailwind, use the grow-0 utility. This approach ensures your elements remain at their natural or defined width, even if there is space left in the container.

In the below example, the grow-0 targets the first two items to remain at its computed width. The third item with grow then absorbs the leftover space.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

States and Responsiveness

When building sophisticated interfaces, you may want elements to grow only in certain states (like hover or focus) or at specific breakpoints. Tailwind’s state and responsive modifiers allow you to switch growth behavior on these conditions seamlessly.

Hover and Focus States

To modify growth in interactive states, Tailwind provides the hover: or focus: prefixes. Using grow or grow-0 utilities only on hover or focus, you can create dynamic transitions where items expand or stay fixed based on user interaction.

In the below example, hover on an item to grow its size to fill the remaining space of the container:

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Breakpoint Modifiers

While designing responsive layouts, you might want an element to grow only beyond certain screen sizes or remain fixed at certain breakpoints. Tailwind’s breakpoint prefixes (such as sm:, md:, lg:, and so forth) allow you to conditionally apply grow or grow-0.

In the below example, the first element grows on sm breakpoint and above:

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Custom Flex Grow

Tailwind’s default grow classes generally address most layouts you might create. However, you can also incorporate custom values using Tailwind’s configuration file or even apply one-off arbitrary values to handle unique scenarios. Adopting custom growth values can be a powerful way to refine how your UI adapts in more specialized designs.

Extending the Theme

To rotate beyond the basic 0 or 1 values for growth, Tailwind gives you the flexibility to add new flexGrow settings via your tailwind.config.js. This is especially beneficial if you consistently use certain numeric ratios across multiple elements or if you prefer more descriptive class names to standard numeric expansions.

After defining these values, you can then apply them directly in your project:

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Using Arbitrary Values

At times, you might need a quick adjustment that doesn’t exist in your theme. Rather than looking into the global tailwind.config.js, one can leverage arbitrary values in Tailwind by specifying them within square brackets.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Real World Examples

Music Player Interface

A music player where the track progress bar grows to fill the space between controls.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

A search box where input will collapse to its default width without grow, making it much smaller than intended and breaking the layout.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

File Upload Progress

A file upload interface where the filename grows on hover.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Stat Card With Icon

A stat card where the text area grows while keeping the icon fixed.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Action Card With Badge

A card that use grow to for proper alignment and spacing between the elements.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Customization Examples

Feature List

A vertical list of features that expand to reveal more content when clicked.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Image Section

A vertical section of expandable image that grow to reveal further details.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

A horizontal carousel where the active slide grows to showcase featured content.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Best Practices

Optimize for Reusability

Reusable components ensure rapid development and consistency. A well-structured reusable card, for instance, might have grow on an image section and grow-0 for textual content. If these cards appear in multiple contexts, their uniform application reduces duplicated code. By toggling certain props or states, you can easily adjust their layout expansions.

Maintaining reusability may involve abstracting unique styling into dedicated utility classes or using your tailwind.config.js. Doing so allows you to quickly update the entire codebase if the design language evolves.

Build Responsive Design

Responsive design is fundamental to modern web development, and Tailwind offers an efficient pathway through flex-based layouts. You can combine sm:grow, md:grow-0, etc., or other breakpoint modifiers to swap between flexible or fixed widths. This method ensures that, on smaller screens, items can remain fixed if necessary, but smoothly expand to fill space on tablets or desktops.

When building fully responsive layouts, test across multiple devices. Thorough testing fosters a fluid experience that aligns with a wide range of aspect ratios and form factors, from smartphones to larger laptops.

Accessibility Considerations

Enhance Readability and Navigability

Flex Grow can help structure content so that headings, paragraphs, and imagery remain visually grouped. A strategic approach to growth means key information is not squeezed into tiny columns or overshadowed by neighboring sections. When content is easier to parse, users with screen readers or cognitive impairments can follow the structure more effectively.

Properly labeling sections also aids navigability. Using accessible tags and roles, in coordination with flex-based expansions, clarifies the hierarchy to assistive technologies.

Focus on High Contrast

While flex properties deal with space distribution, it is vital to pair them with accessible color choices and sufficient contrast. When an element grows, it might occupy more real estate, making it a focal point. A high-contrast palette directs attention to the most critical content, aiding those with visual impairments or color-vision deficiencies.

Ensure that expanded elements featuring text overlays use background classes and text colors that exceed the minimal contrast ratios recommended by accessibility guidelines. Leveraging Tailwind’s built-in color utilities can help you systematically enforce these ratios. If you have custom brand colors, verify their contrast levels for both normal and larger text.

Debugging Common Issues

Iterative Testing and Maintenance

Frequent testing at the component level is vital to catching layout issues early. Whenever you add or change growth utilities, confirm that each impacted section still displays correctly across different screen sizes. Maintaining a simple checklist for layout conformance can prevent painful debugging sessions later.

Pair these iterations with version control for a stable workflow. Commit changes as soon as a layout is successfully tested. Should a regression appear, rolling back to a previous commit is more reliable than manually undoing multiple changes. This process also forms a clear history of what might have created a layout instability.

Leverage Browser DevTools

Most modern browsers provide inspection tools that quickly highlight flex item behavior. By using the Layout panel, you can verify which items are growing and how much space they consume. This direct feedback helps you spot unexpected distribution patterns or confirm that a growth utility is active.

For persistent visual gatherings or misalignments, experiment with toggling growth properties off and on in the browser. This approach, done in real-time, can guide you toward a more suitable combination of utilities. Document any necessary changes so the final code matches what you verified during live testing, ensuring consistent, harmonious layouts.