W3C home > Mailing lists > Public > www-style@w3.org > October 2012

Re: [css3-flexbox] stretching items, fixed spacing

From: Tab Atkins Jr. <jackalmage@gmail.com>
Date: Tue, 16 Oct 2012 11:51:58 -0700
Message-ID: <CAAWBYDAo4S4B9t52XEb_45LkYv_W8txGMQbF1mg1rWVAUbtgjQ@mail.gmail.com>
To: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Cc: WWW Style <www-style@w3.org>
On Tue, Oct 9, 2012 at 9:55 PM, Giuseppe Bilotta
<giuseppe.bilotta@gmail.com> wrote:
> taking advantage of the latest Opera preview release I've recently
> started playing with flexbox to try to achieve some effects that
> required either CSS tables or horrible media query combinations (often
> with unsatisfactory results).
>
> I'm quite amazed at how trivial it is to achieve good results with the
> flexbox specifications now, but there's a couple of points that I
> would to clarify.
>
> The layout I'm trying to control is like this: I have a
> dynamically-sized #container div, and within this I have a navigation
> ul (#rubriche) with a given amount of li (the number of entries can
> potentially change so I would like the CSS to not depend on this).
>
> The navigation should fill the top of the #container, splitting across
> multiple lines if the #container is too short, and flexbox is exactly
> what I need for this. However, I'm having troubles achieving this
> effect: I would like the items to stretch and fill all the available
> space, but I would like them to be equally spaced at a fixed distance
> from each other, both along the main and the cross axes.
>
> The ul has margin:0 and width: 100%, and its distance from the
> #container border is controlled by the .4rem padding of the
> #container. I would like items to be apart fro each other by .4rem
> too, so I tried setting #rubriche li { margin-right: .4rem}, and then
> #rubriche li:last-of-type {margin-right: 0} so that the last item
> would touch the border. This is fine unless the items wrap, of course,
> since the margin-right: 0 should go at every
> :last-of-type-for-the-line. The same holds for the cross axis, of
> course (with margin-bottom).
>
> So the question is: how do I achieve this?
>
> I suspect that a possible solution would be to use a more complex
> styling such as #rubriche { margin: -.2em; width: calc(100% +.4em) }
> and #rubriche li {margin: .2em }, but this seems unnecessarily
> complex, only works fine with certain inner/outer spacing, and it
> fails on browsers that support flexbox but not calc (e.g. this Opera
> preview). Is there something I'm missing from the flexbox
> specification that determines how to give fixed spacing to the items?

I assume by "fixed spacing" you mean a definite length, not just
"equal spacing"?  If so, there's no direct way to achieve this.

If you're okay with spacing like what space-around gives you
(half-spacing on edges, full-spacing between items), just give all of
your items margins equal to half the spacing you want.  Flex item
margins don't ever collapse, so they'll combine into a full-width
space.  (You can also get full-spacing on edges too if you want, by
using padding on the flex container.)

If you just want equal spacing, you can set justify-content to
'space-between', but that won't help with spacing between lines.

More powerful controls over the packing spaces will likely show up in
Flexbox level 2.

~TJ
Received on Tuesday, 16 October 2012 18:52:46 GMT

This archive was generated by hypermail 2.3.1 : Tuesday, 26 March 2013 17:21:01 GMT