- From: Daniel Holbert <dholbert@mozilla.com>
- Date: Fri, 01 Jun 2012 15:38:36 -0700
- To: www-style <www-style@w3.org>
Hi www-style, Preface: right now, the spec says: { # If the value is ‘auto’ on a flex item, the computed value # of flex-basis is the computed value of the element's main # size property. Otherwise, ‘auto’ computes to itself. [1] } I have two (related) concerns about "flex-basis:auto" computing to the main size property's computed value. MAIN CONCERN: It's weird to have a particular value ("auto" in this case) mean two completely different things as a specified value vs. as a computed value. (to elaborate slightly: 'auto' as specified val means "use main-size-property computed value as my computed value", per spec-quote above. In contrast, 'auto' as computed val (e.g. taken from the main size property) tells the flexbox algorithm to use our max-content size as our hypothetical size.[2] These are two completely different meanings.) SUB-CONCERN: It's weird that "flex-basis:inherit" can end up inheriting a computed value of "auto", which then deceptively makes us _ignore_ our main-size property. (while a _specified_ value of "auto" would make us _use_ our main-size property) To illustrate these concerns, here's an example: <div id="grandparent" style="display: flex"> <div id="parent" style="display:flex; flex-basis:auto; width:auto"> <div id="elem" style="flex-basis: inherit; width: 50px"></div> </div> </div> So -- what is the computed value of "flex-basis" on the innermost element ('elem') here? And does the "width: 50px" have any effect on the rendering? IIUC, the answers are "auto" and "no". (We inherit #parent's computed value, which is the computed value of #parent's own 'width' property, which happens to be "auto". So #elem gets a computed value of "auto". And then the flexbox algorithm tells us to treat a flex basis of "auto" as max-content. So, we never use the 50px.) The most bizarre part for me is this: if we took the computed value of the "flex-basis" property on #elem, and set that as the specified value for that property (via the style attribute), we'd end up with a _completely different & unrelated_ computed value. This is totally counterintuitive. POSSIBLE WAYS TO ADDRESS THIS: One possible solution would be to replace flex-basis:auto with a special keyword, e.g. "use-main-size-property". I think this has been proposed before & rejected, so I won't consider it further. Another solution would be to make "flex-basis:auto" simply compute to "auto" (as it does in the 'width' & 'height' properties[1]), and then specify that its _used_ value (in the flexbox layout algorithm) should look up the corresponding size property's computed value. I believe this is what the spec used to say, and I'm not entirely sure why we switched away from it. I'd really prefer that latter solution (make "flex-basis:auto" compute to "auto") over the current specced behavior, FWIW. That makes style-computation / inheritance *much* saner & more straightforward. Thoughts? ~Daniel [1] http://dev.w3.org/csswg/css3-flexbox/#flex-basis-property [2] http://dev.w3.org/csswg/css3-flexbox/#line-sizing
Received on Friday, 1 June 2012 22:39:06 UTC