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

Re: Publishing the flexible box model

From: Andrew Fedoniouk <news@terrainformatica.com>
Date: Tue, 10 Jun 2008 00:03:00 -0700
Message-ID: <484E2724.1050407@terrainformatica.com>
To: robert@ocallahan.org
CC: fantasai <fantasai.lists@inkedblade.net>, Anne van Kesteren <annevk@opera.com>, dbaron@dbaron.org, www-style@w3.org

Robert O'Callahan wrote:
> On Tue, Jun 10, 2008 at 4:24 PM, Andrew Fedoniouk 
> <news@terrainformatica.com <mailto:news@terrainformatica.com>> wrote:
> 
>     Robert O'Callahan wrote:
> 
>         On Tue, Jun 10, 2008 at 2:23 PM, Andrew Fedoniouk
>         <news@terrainformatica.com <mailto:news@terrainformatica.com>
>         <mailto:news@terrainformatica.com
>         <mailto:news@terrainformatica.com>>> wrote:
> 
>            Robert O'Callahan wrote:
> 
>                OK but how is this going to interact with the rules here, for
>                example:
>              
>          http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width
> 
> 
>            I see no problems there either.
>            In most cases 'shrink-to-fit' is 1* exactly.
>            Practically in all cases 'auto' value can be replaced
>            by 1* value.
>            1* is a mathematically correct way of saying 'auto' :)
> 
> 
>         That doesn't answer my question. You need to extend the rules in
>         that section to describe what happens when flexunits (not just
>         "1*") appear for margins, padding or content.
> 
> 
>     For
>      flow:vertical;
>      box-sizing:content-box; ( default value )
> 
>     vertical margins, paddings, content and borders in flex units
>     share the same free space. So for style:
> 
>     div.inner { padding:1* 0; }
> 
>     This markup
>     <div style="height:YYpx; flow:vertical">
>      <div class=inner>First</div>
>      <div class=inner>Second</div>
>     </div>
> 
>     will be rendered as
> 
>     |------------
>     |
>     |First
>     |
>     |
>     |Second
>     |
>     |------------
> 
>     Rule is simple: free space is distributed among all lengths
>     in the direction in the block that establishes box with free space.
> 
> 
> What does that have to do with absolute positioning and
> http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width ?

There is nothing special with this in respect of flexes. Or I do not 
understand your question.

You calculate positions of elements including flexes.
After that you will have "would-be-position"s of absolute
elements and you replace them accordingly to their left...bottom
attributes.

Is this what you were asking?


> 
> 
>            Consider this:
> 
>            <div style="overflow:hidden; width:xx; height:yy">
>             <img align=left id=first />
>             <p flex=1>...</p>
>             <img align=left id=second />
>            </div>
> 
>            You will have *exactly* the same kind of problems.
> 
> 
>         No. The flex on the <p> is ignored because the container is not
>         a flexbox. If the container was a flexbox, then the <img>
>         elements would not float.
> 
> 
>     Exactly the same thing as with flex units. Just replace 'flexbox' by
>     'flow'.
> 
> 
> OK. So 'flow' creates something like a flexbox. One difference is that 
> all features of CSS are available inside 'flow' except for features that 
> cause trouble, like floats, which you disable when you discover they 
> cause problems. But the only features available inside flexbox are ones 
> we explicitly allow. Another difference is that you have to specify how 
> 'flow' interacts with the various display types, whereas since flexboxes 
> are their own display type that isn't an issue.

'flow' defines how *children* of some container are layed out.
Such container shall establish container box. Otherwise
flex units have no sense inside such element.

So any element with display-model:block-inside and
display:block | inline-block | table-cell | list-item
can be used as a flex container.

> 
> A few more questions about flex-units:
> 
> Does 'flow' apply to inline elements? If so, what does 'flow:vertical' 
> do on an inline element?

As I said flow is applicable only to elements that establish boxes - so 
to create bounds for flex length distribution. Inlines are clearly not 
such blocks.

> 
> How do flexunits work on inline elements that break across multiple 
> lines? e.g
> <span style="font-size:50px;">Foo</span> <span 
> style="padding-top:1*">A<br>B<br>C</span> <span 
> style="font-size:80px;">qux</span>
> Which line box(es) are used to determine the padding? Does each line of 
> the <span> actually get a different padding?

Flex units are defined only for blocks and block-alike elements. 
display: block | inline-block | table | table-cell | etc.

inline elements have no concept of dimension. In the same way
as width:100px does not work for inline elements in the same
way flex length units do not work there either.

<button style="width:1*; height:1*; margin:0">Text</button> has a 
perfect sense though. As container for inline-block elements is the
line box they are in.


> 
> How do flexunits interact with absolute positioning and auto top/left? 
> Is the hypothetical position for the content computed taking flexunit 
> margins/padding on the content into account?

Yes.

Here is a screenshot if you wish:
http://terrainformatica.com/htmlayout/images/css-menus.png

And here its style system:

/* top level menu band */
     menu
     {
       flow:horizontal;  /* top level menu is a horizontal bar */
       width:max-intrinsic;
       padding-right:1*; /* spring on the right - all items sticked
                            to the left */
     }

     menu li
     {
       display: block;    /* menu items are blocks*/
       position:relative; /* to make our popup relative to this one */
       height:1*;         /* all items in the menu bar have the same
                             height */
       padding:2px 4px;
     }

     menu li:hover
     {
       background-color:navy;
       color:white;
     }

     menu menu
     {
       flow: vertical;     /* popup menus are vertically replaced */
       min-width:100%;     /* at least it is caption wide */
       position:absolute;  /* out of normal flow */
       display:none;       /* non-visible normally */
     }

     menu > li:hover > menu
     {
       display: block; /* now it is visible */
     }

-- 
Andrew Fedoniouk.

http://terrainformatica.com
Received on Tuesday, 10 June 2008 07:03:35 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Monday, 27 April 2009 13:55:07 GMT