The flex-flow property is a shorthand for flex-direction and flex-wrap. It sets the flex container’s main axis and whether items can wrap onto more lines.
Use it on an element with display: flex or inline-flex. The initial value is row nowrap. It is not inherited. You can write one keyword or both, in either order.
Baseline · Widely available.
Basic flex-flow is not deprecated. The newer balance wrap keyword is limited — stick to wrap / nowrap for everyday layouts.
Accessibility.
Reverse values (row-reverse, wrap-reverse, and so on) change visual order only. Prefer reordering HTML when reading order matters.
Main axis is vertical.column stacks items downward.
Set a height. Without a definite height, column wrap has nowhere to “fill up.”
Allow wrap. When the column is full, the next item starts a new column.
Use case. Newspaper-style lists and tall menus that fill sideways.
Edge Cases & Pitfalls
If wrap does not appear, check item size and container size first.
shorthand
It resets both longhands
Any flex-flow value sets both flex-direction and flex-wrap. Omitted parts fall back to their defaults (row / nowrap).
size
Wrap needs a reason to break
Items that can shrink to fit may never wrap. Give a width, flex-basis, or flex: 0 0 … so lines can fill up.
column
Column wrap needs a height
With column wrap, set a definite height (or max-height) on the container, or wrapping into new columns will not show.
limited
balance is not widely supported
flex-flow: wrap balance is limited. Use plain wrap unless you only target the newest Chromium browsers.
a11y
Reverse still keeps DOM order
row-reverse and wrap-reverse flip the view only. Tab order and screen readers follow the HTML.
Compatibility
Browser Support
flex-flow is a browser CSS shorthand for flex containers. Node.js, Deno, and Bun do not apply it.
✓ Baseline · Widely available
flex-flow
Basic direction + wrap values are supported in modern browsers since about September 2015. The balance keyword remains limited.
98%Flex support
Google Chrome29+
Full support
Mozilla Firefox28+
Full support
Apple Safari9+
Full support
Microsoft Edge12+
Full support
Opera17+
Full support
Samsung Internet2+
Full support
Internet Explorer11
Partial support
flex-flowWidely supported
Bottom line: Safe for production with row/column and wrap/nowrap. Avoid relying on balance for cross-browser sites. It is not a runtime API.
Remember
Key Takeaways
Role: shorthand for flex-direction + flex-wrap.
Default:row nowrap — one horizontal line.
Everyday pick:row wrap for responsive cards and tags.
One value OK: omitted part uses its longhand default.
One line:flex-flow sets direction and wrap together — usually row wrap when items should break onto new lines.
Frequently Asked Questions
It is a shorthand for flex-direction and flex-wrap. It sets the flex container main axis and whether items can wrap onto multiple lines.
The initial value is row nowrap: items flow horizontally on a single line.
Yes. One direction keyword sets flex-direction and leaves wrap at nowrap. One wrap keyword sets flex-wrap and leaves direction at row.
Use it for card grids, tag lists, and toolbars where items should move to the next line when horizontal space runs out.
No. The balance keyword for flex-wrap is limited (mainly very new Chromium). Prefer wrap for cross-browser work.
Basic flex-flow is Baseline and widely available in modern browsers since about September 2015. It is a browser CSS property for flex containers, not a Node.js feature.