- From: Bert Bos <bert@w3.org>
- Date: Thu, 29 Apr 2010 19:39:55 +0200
- To: "www-style@w3.org" <www-style@w3.org>
On Thursday 29 April 2010 01:04:33 Adam Del Vecchio wrote: > I'd like to propose an auto fitting value that could be used with the > height and width propertys. > > What this would do would have an object in the DOM fill all remaining > space. If it is used with a child of the body element, it would fill > the remaining screen space. > > Possibly something like: > > Height: fit; or width: fit; ? The problem with this is that it leaves the renderer to guess which available space you mean. (Or, more precisely, it's the writers of the CSS specification who will have to guess what is meant in every situation.) There are no doubt simple cases, such as a fixed-size parent with two children of the same type, but there are plenty of difficult cases. E.g., if there is a float somewhere in the available space, do you want your element to take the available space *next to* the float or *below* it? The approach taken by CSS so far (tables) and by the extensions we're working on (flexbox and templates) is to first make it explicit which elements vie for a given space. Once you know which elements are in the same row (or column), you can distribute the space over just those elements. Next, to distribute the space properly, we probably need more than a keyword 'fit' that says whether an element is flexible or not. We probably need: a. Which elements to grow first and which next b. If several grow at the same time, how much each gets You could then say, e.g., that, in a row A B C, element A has its intrinsic size and never grows, B has at least its intrinsic size but can grow to 20em, and C takes the space that is left once B is maximized. Expressing (a) and (b) as new values on 'width' and 'height' probably leads to a difficult syntax, so the proposal in the flexbox module uses two separate properties: 'box-flex-group' (for a) and 'box-flex' (for b). It may be that (b) is overkill and (a) is sufficient in practice. We'll have to see. > > Example, if an element directly opened after the body tag has an ID > of #wrap and the stylesheet says wrap should have height: fit; then > #wrap would fill the screen. If after #wrap is closed, and another > element is opened with a heigt of lets say 100px, this element is > pushed to the bottom, and the first element (located at the top) is > given a height of browser window minus 100px. In flexbox syntax, this would be something like: BODY {min-height: 100%; display: vbox} #wrap {box-flex: 1} /* all others are 0 by default */ <BODY> <DIV ID=wrap>...</DIV> <DIV>... this happens to be 100px high... </DIV> </BODY> (The white space between the DIVs is automatically ignored.) Not in this example, but in the general case you may need to decrease some margins between elements as well, because margins in a vbox don't collapse. The WG is studying if the same 'box-flex' and 'box-flex-group' properties can also apply to tables and templates. Flexbox might be just a special case of a table (viz., a table with only one row or column). That could look very similar: BODY {height: 100%; display: table} DIV {display: table-row} #wrap {box-flex: 1} > > Example 2, if an element has a height of 500px, and a child element > has a height of 150px, and a sibling of that child has a height of > fit, that element's height is 350px. Bert -- Bert Bos ( W 3 C ) http://www.w3.org/ http://www.w3.org/people/bos W3C/ERCIM bert@w3.org 2004 Rt des Lucioles / BP 93 +33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Thursday, 29 April 2010 17:39:39 UTC