Flexbox is Dead, Long Live Flexbox!

Last updated:

I've been meaning to write this post for a month. I'm bad at time management.

If you've been following my blog over the last year or so, you'll know that I'm the active editor of the CSS Flexbox spec. I picked up this spec because I thought the original spec was too close of a direct translation from XUL, and that we could do better. Specifically, I thought we could rewrite the spec to use normal box-model properties (width, height, padding, margin) and just directly make them flexible. If you look back through my archives you'll see several attempts at rewrites in this vein.

Well, the experiment has ended. The spec has returned to a form very similar to the original. I'm a little sad about this, but it's the right choice. Unfortunately, if you limit yourself to making the box-model properties flexible, several useful things are simply impossible, and several others are overly difficult.

Specifically, flex-pack: distribute can't be done without screwing around with margins on :first/last-child, like you have to do to today when using floats for similar purposes. flex-align: baseline is completely impossible. All of the flex-pack properties are impossible if the flexbox is multi-line. And don't even get me started on controlling the distribution/alignment of lines in a multi-line flexbox. The lines aren't real boxes, so you can't access them to tweak their margins, etc. unless we add extra pseudo-elements. Once you need one special property to control the alignment, it starts making more sense to handle all of the alignment in that property.

There have still been some wins. I've merged the old box-direction and box-orientation properties into a single flex-flow property. (The syntax for flex-flow looks a little scary, but it's pretty simple in practice.) I've axed the box-flex-group property, while box-ordinal-group has been renamed to the much friendlier flex-order. And most importantly, width and height are still directly flexible, rather than deferring to a separate box-flex property. Multiple authors (including the CSSWG's own chairman!) have been confused by the way box-flex works over the years. I'm very happy that stayed dead.

An additional silver lining is that Flexbox and Grid Layout now share many concepts, so learning one of them will help you understand the other. I'm extremely happy about this; the new layout models need to be as simple and easy as possible to help justify their additions, and now that these two are compatible, any future layout models have a very good reason to also be compatible. Yay! I'm going to continue to work on getting them to share concepts, and ensure that the general layout algorithm is consistent between the two so things are predictable.

The spec is pretty stable now, and I'm happy about that. I've got a few outstanding issues we're currently discussing in the group about the meaning of a few properties (in particular, if we can simplify flex-flow, and exactly how the center values work in the three alignment properties). Once we resolve those, it's simply a matter of me turning my sketch of a layout algorithm into something detailed and normative, like what I had before. Then I can release a WD, hopefully get that to CR, write tests, and continue on from there. Yay!

If you have comments on the draft, feel free to either email me personally or email www-style@w3.org with the subject starting with "[css3-flexbox]".

(a limited set of Markdown is supported)