W3C home > Mailing lists > Public > www-style@w3.org > May 2014

Re: [css-flexbox] Algorithm Update

From: Daniel Holbert <dholbert@mozilla.com>
Date: Wed, 07 May 2014 12:27:46 -0700
Message-ID: <536A8932.20406@mozilla.com>
To: "www-style@w3.org" <www-style@w3.org>
On 05/06/2014 06:52 PM, fantasai wrote:
> Tab and I, at dholbert's request, put both variants of the flexbox
> algorithm


>   3. If you have a preference for one algorithm or one wording over the
>      other, tell us!

I prefer the CR version (the one focused on flex factors instead of
desired free space values), for several reasons.

1) The CR version had more time for bugs to be discovered & reported, so
it's more likely to be correct.

2) In the spirit of "don't fix what's not broken", it seems undesirable
to replace the long-standing algorithm with a new formulation, unless
there were a compelling reason to do so. (And indeed, it did originally
seem like there was a compelling reason -- to get the "percentage"
behavior for flex factors when their sum is less than 1 -- but that
behavior has now been ported to work properly in the long-standing CR
version, so it's not a compelling reason anymore.)

3) The CR version is likely closer to what browsers actually have
implemented, since their implementations were coded before the "LC
version" was conceptualized. As a result, a rewritten algorithm will:
 - invalidate comments & concepts in code that reference spec-language.
 - make it harder to audit existing code & verify that it matches the spec.
 - make it (a bit) harder to identify what's precisely wrong in the case
of a disagreements between an implementation-coded-to-the-CR-algorithm &
the spec.
(If there were a compelling reason for the change, then these annoyances
would of course be overwhelmed by that compelling reason. However, I
don't see such a reason currently.)

4) The LC version feels more complex.  In particular, it requires 2
groups of variables to be normalized (flex-shrink values and
desired-free-space values), and it requires 2 additional variables to be
maintained for each flex item (a "desired free space" and a "normalized
free space").

5) I have a few issues with the concept of "desired free space" in the
LC version:

 a) It's a part-weight, part-length chimera. It's primarily a length,
based on its name and on how it's eventually used. However, it's got the
flex factor directly multiplied in, which makes it more weight-flavored
& which can put it on an absurdly different order of magnitude from any
length that *actually* is in play on the page, particularly if the
author chooses to use large flex values like "flex-grow:1000" (which
they're totally free to do). For UAs with fixed-point (integer-backed)
lengths (like Gecko and Blink and I think WebKit), this makes it very
easy for a direct implementation of the algorithm to produce values that
overflow to the maximum representable length, even when in actual fact
there are no large lengths being rendered on the page. This problem can
be worked around, e.g. by using a non-fixed-point type to store this
particular length, but it's an unfortunate annoyance (and can introduce
type-conversion error) which isn't a problem in the CR formulation of
the algorithm.

 b) Its name, "desired free space", is wrong most of the time. If you
have 100px of free space and an item with "flex: 2", then that item's
"desired free space" will be 200px; but the item doesn't *actually* want
200px, it just wants 2 "shares of free space", however large we
determine a share to be.  The "desired free space" name is only really
accurate when the flex factors sum to less than 1; and that's a case
that we've explicitly assumed to be rare (which is why we were able to
change the behavior for that case recently).

So: I have a fairly-strong preference for the CR formulation.

Received on Wednesday, 7 May 2014 19:28:15 UTC

This archive was generated by hypermail 2.4.0 : Friday, 25 March 2022 10:08:42 UTC