W3C home > Mailing lists > Public > www-style@w3.org > June 2010

[css3-flexbox] use cases (RE: Flexbox Draft, with pictures!)

From: Alex Mogilevsky <alexmog@microsoft.com>
Date: Fri, 4 Jun 2010 02:03:40 +0000
To: Tab Atkins Jr. <jackalmage@gmail.com>
CC: www-style list <www-style@w3.org>
Message-ID: <5258A1A783764C478A36E2BC4A9C497E17CFA14B@tk5ex14mbxc106.redmond.corp.microsoft.com>

> -----Original Message-----
> From: Tab Atkins Jr. [mailto:jackalmage@gmail.com]
> Sent: Tuesday, June 01, 2010 6:22 PM
> To: Alex Mogilevsky
> Cc: www-style list
> Subject: Re: Flexbox Draft, with pictures!
> 
> On Tue, Jun 1, 2010 at 5:52 PM, Alex Mogilevsky <alexmog@microsoft.com>
> wrote:
> > 2, 3: It is not impossible actually. Consider this:
> >
> >        hbox > * { display:table-cell; vertical-align:middle; }
> >
> > Using a table is not pretty but it gets the job done. We wouldn't need a
> table if 'vertical-align' applied to any block. Why not do that first?
> 
> That only works if you're willing to accept the effects of using a table on the
> pack-direction.  

Actually no, what I mean by this is that each flex item is a table-cell, individually wrapped into an anonymous table, and then vertical-align applies to content. This depends on how table fixup works inside a flex-box, which is currently undefined.

I am not serious though that people should use tables to make this case work. I am very serious though that vertical-align should work everywhere.

> > - the speculative code in "proposed" means "align children of flexbox item
> on baseline" but it would be wrong to expect that baseline to relate to
> baseline of its siblings.
> 
> Why would it be wrong?

Generally a property set on an element doesn't affect layout of content of its sibling. It does happen to table cells (with vertical-align), but it would be a cleaner model if sibling interaction would be controlled by parent.

> 
> 
> > 8,9: agree (although not sure how important it is though)
> 
> I assure you that effects in this line are used on the internet, and that I want
> to be able to do them.  ^_^

I would like an example from a real page on the internet.

> > 10: relative is probably better in second column anyway, but if you want to
> use FL you want to also decrease bottom margin by 5px to avoid layout
> change:
> >
> >        hbox > :hover { margin: calc(5px + 1fl) 0 calc(-5px + 1fl); }
> 
> That's not necessary.  When you change the margins, the amount of space
> given to the flexes will change as well.  It'll move without affecting layout
> elsewhere.  (Doing as you suggest would have the effect of moving it by
> 10px, actually.)

You are right, it is unnecessary. It is enough to mess with one margin. But your example only moves it by 2.5px.

> > 11: I don't get the use case. How is it different from simply centering?
> 
> It's not significantly different, this case just came to mind as something that
> should be exercised.  It also points out a minor additional ability of my
> proposal.

The challenge still doesn't make sense, sorry. I understand what each code sample does, and clearly the last one can't be matched by current spec, but the 'challenge' fails to explain what exactly the author wanted.

> > 12, 13, 14, 15: second column code won't work if there is flex and max-
> width on children:
> >
> >        <div style="display:box; width:200px; box-pack:end">
> >        <div style="max-width:150px; box-flex:1">
> >        </div>
> >        </div>
> >
> > Will produce a right-aligned 150px-wide child. But
> >
> >        <div style="display:box; width:200px; padding-left:1fl">
> >        <div style="max-width:150px; box-flex:1">
> >        </div>
> >        </div>
> >
> > Will get you a right-aligned 100px-wide child.
> >
> > This will be different of course only if max-width keeps limiting effect of
> flex. If we consider max-width only before flex (as has been proposed) both
> solutions will have same effect.
> 
> Actually, the second case will produce a right-aligned 0px wide child.
>  Parent flex is computed in the first distribution round, but child flex is done
> in the second distribution round.  You need to pair that with a min-width to
> prevent the child from being squished to nothing.

My second example will  produce 0 width because your proposal doesn't have 'box-flex' in it. My mistake.
	s/ box-flex:1/width:1fl/
With that, does it illustrate the difference?

> > 15: I like box-pack version much, much better. Also this doesn't work with
> max-width, unless there is a way to assign flex-group to a margin.
> 
> Actually, the second suggestion in my draft can omit the "hbox > * { width:fit-
> content; }" rule if I change things so that 'auto' width and height act like 'fit-
> content' all the time.  So then it would just be a comparison of "hbox { box-
> pack: justify; }" versus "hbox {
> flex-spacing: 1fl; }".  I'd call that pretty even.  (The latter has the benefit that
> it interacts with the flexes of the children too.)

The title of the last column says " Proposed Flexbox draft ". It should not contain examples that won't work with this proposal, it is just too confusing. You can add another column for other speculative syntax.

> Can you elaborate on what you mean by "this doesn't work with max-
> width"?

This example (claimed equivalent of "box-pack:justify")

        <style>
            hbox > * { margin-left: 1fl; } 
            hbox > :first-child { margin-left: 0; }
        </style>
        <div style="display:box; width:120px; ">
            <div style="max-width:50px; width:1fl"></div>
            <div style="max-width:50px; width:1fl"></div>
        </div>

... will  produce two 40px divs with a 40px space. "box-pack:justify" would have made it two 50px divs with 20px space. 

> > 17: this exact case should also work with generated content, but if you
> happen to want anything more complicated (like 1/3 margin somewhere)
> current spec won't do it.
> 
> Hmm, could you illustrate how it would work with generated content?

You are right, generated content won't do it because generated content is inside the element it applies to

> > 18: also
> >
> >        hbox > .end-packed:before { box-flex: 1fl; }
> 
> You sure that works?  Remember that .end-packed::before is a child of .end-
> packed, not hbox, and so shouldn't participate in hbox's flex distribution.

Right, it doesn't.

> > 20: very interesting case. Both versions should work (assuming min-
> width:fit-content works). Space distribution algorithm may be tricky when
> there is more space than content width but less than needed to make them
> all equal.
> 
> Could you elaborate on what you mean by that last sentence?  An example,
> perhaps, with a pointer to what you think might be tricky?
> (I know that mine would work - the free space allocation algorithm is
> completely precise in this case - they just won't all be equal until there's
> enough space for them to be.)
> 
> 
> > 21: generated content would do it too
> 
> I don't think I quite see this one.  Could you illustrate?

Again, I was wrong considering inserting generated content as a sibling of flex item. Explicit spacer elements would be required in current draft to achieve this. Or a new kind of generated content that's outside of the parent.

> > 22: I think the "challenge" describes what "current" is doing. "proposed"
> also flexes margins but it is not called for.
> 
> I explicitly ask to shrink margins if there's not enough space - "but shrink their
> spacing and keep their widths at intrinsic if they would overflow".

I didn't read the challenge carefully enough. Actually your version in left column will have 20px spacing. And "min-width:fit-content" can be added there too, as it has no dependency on either draft.

> 

 (I want to keep the link to the use case page here as a reference: http://www.xanthir.com/etc/flex-use-cases.html )
Received on Friday, 4 June 2010 02:04:19 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:20:28 GMT