Skip to content

[css-flexbox][css-sizing] Using tables in flexbox #948

Closed
@frivoal

Description

@frivoal

https://drafts.csswg.org/css-flexbox-1/#valdef-display-flex
https://drafts.csswg.org/css-flexbox-1/#propdef-flex
https://drafts.csswg.org/css-flexbox-1/#propdef-flex-wrap
https://drafts.csswg.org/css-sizing-3/#valdef-width-fill

If you have items in a flex-box, want them be all the same size and flex up and down as long as they don't get smaller than their min-content, and wrap the flexbox otherwise, this is generally very easy:

.flex {
  display: flex;
  flex-wrap: wrap;
}
.flex > * { flex: 1; }

However, due to the way width: auto works on tables, if one of the items is a table, it doesn't work. I believe it's expected (although I am not 100% convinced it is[1]), but if so we need a way to opt into it.

As I understand, width: fill is meant to do on anything what width: auto does on blocks, so this ought to work:

.flex {
  display: flex;
  flex-wrap: wrap;
}
.flex > * { flex: 1; }
.flex > table { width: fill; }

However, in all current browsers that implement fill (or a prefixed version of it), it does not. Firefox, Chrome and Safari all do different things, but none fully do what I expect.

Here's a little demo: http://output.jsbin.com/diziga/

  • In firefox, it takes the full width of the flex container, and wraps.
  • In Chrome, it takes the full width of the container, but only wraps if there would not have been enough room when doing min-content sizing, causing overflow if there is enough room for min-content sizing. I suppose that this is a bug.
  • In Safari it takes the full width of the flex container, but safari doesn't seem to be able to wrap when flex-basis is 0, so it overflows in all cases. I suppose that this is a bug.

Leaving bugs aside, it seems all browsers agree that width: fill should takes the full width of the flex container.

Reading the spec, it does not seem to call for the behavior that I expect, but then again the definition is somewhat convoluted, so I may be missing something.

Is this a problem with my understanding of what width:fill is supposed to do (and if yes, how is this problem supposed to be solved)?

Is the spec failing to define width: fill the way it should?

Are these just bugs in implementations?


[1] Looking at the jsbin example above, Firefox/Edge vs Blink/Webkit also have a different rendering of the table {width: auto} case, but the difference is smaller. I wonder which one is spec compliant, if any. I'm happy to submit a ref test if someone more familiar with the flex algo can clarify.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions