- From: Jeffrey Yasskin <jyasskin@hotmail.com>
- Date: Fri, 26 Oct 2001 14:02:41 -0500
- To: <www-style@w3.org>
Oops. I missed one. (surprise, surprise.) Use Case 7: A 3-row layout: <style> #top {align: top; min-height: 100px; height: 15%; width: remaining; border: 1px solid green} #body {align: center; width: remaining; height: remaining;} #bottom {align: bottom; min-height: 100px; height: 15%; width: remaining; border: 1px solid green} </style> <body> <div id="top"> This column fills the top of the page. It is 15% of the window or 100px tall, whichever is greater. </div> <div id="body"> This column fills the center of the page. It expands vertically to fill any space left between the top and bottom rows. </div> <div id="bottom"> This column fills the bottom of the page. It is 15% of the window or 100px tall, whichever is greater. </div> </body> Note: This one cannot be done with floats. In the CSS positioning scheme, the code should be just as simple as Use Case 3 Jeffrey Yasskin > -----Original Message----- > From: www-style-request@w3.org > [mailto:www-style-request@w3.org] On Behalf Of Jeffrey Yasskin > Sent: Friday, October 26, 2001 1:03 AM > To: www-style@w3.org > Subject: To fix box-model positioning > > > I don't have a certain proposal for a new property anymore, > but I'm going to lay out some use-cases so that the more > intelligent/experienced people on this group can figure out > the *right* way to do this. > > Requirement: The CSS box model should be more powerful than > the HTML table model, should require less code than the HTML > table model, and its code should be more readable than the > HTML table model when laying out web pages. > > My (arguable) opinion on a result of this requirement: Using > "margin:auto" to center things horizontally is not as > readable as the mechanism should be. The "float" property is > better, but I don't think it's powerful enough, and, again, > it could be named better. "Float" was originally intended for > images that text should wrap around. Let's keep it that way. > > The following Use Cases are written in pseudo-CSS. The > <style> tag contains a stylesheet, and the <body> tag > contains an HTML document. I'm > (incorrectly) using <body> as the root of the document to > shorten my stylesheets. The Use Cases are only concerned with > block layout, not the text inside the blocks. > > Use Case 1: > > Centering Boxes: > > <style> > body {height: 100%; width: 100%; background-color:blue;} > #center (block-align: center; background-color: white; height: 300px; > width: 300px;} > </style> > <body> > <div id="center"> > This div is centered in the viewport. It's always 300px > by 300px, with a variable blue border, and a white background. > </div> > </body> > > Note: The CSS to achieve this effect should be very simple, > as the desired effect is very simple. > > > Use Case 2: > > Arbitrary positioning: > > <style> > body {height: 100%; width: 100%; background-color:blue;} > #topleft (block-align: 10% 10%; background-color: white; height: 20%; > width: 20%;} > #topright (block-align: 90% 10%; background-color: white; height: 20%; > width: 20%;} > #bottomleft (block-align: 10% 90%; background-color: white; > height: 20%; > width: 20%;} > #bottomright (block-align: 90% 90%; background-color: white; > height: 20%; width: 20%;} #centered {block-align: center > center; background-color: white; width: 50%; </style> <body> > <div id="topleft"> > This div is positioned in the top left of the screen. It > is 20% of the width of the document and 20% of the height. > The body's blue background is visible on all sides. > </div> > <div id="topright"> > This div is positioned in the top right of the screen. It > is 20% of the width of the document and 20% of the height. > The body's blue background is visible on all sides. > </div> > <div id="bottomleft"> > This div is positioned in the bottom left of the screen. > It is 20% of the width of the document and 20% of the height. > The body's blue background is visible on all sides. > </div> > <div id="bottomright"> > This div is positioned in the bottom right of the screen. > It is 20% of the width of the document and 20% of the height. > The body's blue background is visible on all sides. > </div> > <div id="centered"> > This div is in the center of the document. It is 50% of > the width of the screen and its content determines its > height. If there's enough content, the document could be > longer than one screen, so fixed positioning won't work. > Absolute might work for the corner boxes, but if we add a > min-width to them, I think it breaks too. > </div> > </body> > > Note: I don't know why someone would do this, but it should > be possible. > > > Use Case 3: > > A 3-column layout: > > <style> > #left {align:left top; min-width: 100px; width: 15%; height: > remaining; border: 1px solid green} > #body {align:center center; width: remaining; height: remaining;} > #right {align:right bottom; min-width: 100px; width: 15%; > height: remaining; border: 1px solid green} </style> <body> > <div id="left"> > This column fills the left side of the page. It is 15% of > the window or 100px wide, whichever is greater. > </div> > <div id="body"> > This column fills the center of the page. It expands > horizontally to fill any space left between the left and > right columns. > </div> > <div id="right> > This column fills the right side of the page. It is 15% > of the window or 100px wide, whichever is greater. > </div> > </body> > > Note: This one can be done with floats. > > > Use Case 4: > > Pseudo-frames: > > <style> > body {width: 100%; height: 100%;} > #top {left: 0; top:0; min-height: 100px; height: 15%; width: > remaining; > border: 1px solid red} > #left {left: 0; bottom: 0; min-width: 100px; width: 15%; > height: remaining; border: 1px solid green} #right {right: 0; > top: 0; min-width: 100px; width: 15%; height: remaining; > border: 1px solid blue} #bottom {right: 0; bottom:0; > min-height: 100px; height: 15%; width: remaining; border: 1px > solid purple} #content {align: center; width: remaining; > height: remaining; border: 1px solid black} div {overflow: > scroll;} </style> <body> > <div id="top"> > This div touches the top-left corner, extends downward > 100px or 15% of the window, whichever is greater, and extends > rightward until it touches the #right div. > </div> > <div id="left"> > This div touches the bottom-left corner, extends > rightward 100px or 15% of the window, whichever is greater, > and extends upward until it touches the #top div. > </div> > <div id="right"> > This div touches the top-right corner, extends leftward > 100px or 15% of the window, whichever is greater, and extends > downward until it touches the #bottom div. > </div> > <div id="bottom"> > This div touches the bottom-right corner, extends upward > 100px or 15% of the window, whichever is greater, and extends > leftward until it touches the #left div. > </div> > <div id="content"> > This div fills the center of the screen and touches all > four side-divs. Every div's content will scroll if it > overflows, mimicking frames. I'm pretty sure this effect with > pixel lengths cannot be achieved with the current box model. > </div> > </body> > > > Wishlist, wouldn't-it-be-cool-if stuff: > > Use Case 5: > > Making Square Boxes: > > <style> > body {height: 100%; width: 100%; background-color:blue;} > #center (block-align: center center; background-color: white; > height: 50%; width: square;} </style> <body> > <div id="center"> > This div is centered in the viewport. Its height is 50% > of the window height, and its width is equal. It has a > variable blue border and a white background. > </div> > </body> > > > Use Case 6: > > This one would be very useful for pop-up menus by eliminating > lots of JavaScript code: > > <style> > #body {block-align: center; width: remaining; height: > remaining;} #menubar {block-align: left top; width: 15%; > border: 1px solid green;} .menuitem {width: 100%;} .popupmenu > {position: relative-to; element-ref: id(attr(submenuof)); > vertical-align: top; > horizontal-align: right-side; display:none; border: 1px > solid red;} </style> <body> > <div id="menubar"> > <div class="menuitem" id="item1"> > Item 1. As wide as the menu. > </div> > <div class="menuitem" id="item2"> > Item 2 > </div> > <div class="menuitem" id="item3"> > Item 3 > </div> > </div> > <div id="body> > Fills the right side of the document; all space except > what the menu takes up. > </div> > <div class="popupmenu" submenuof="item1"> > This box, if its display were set to block by JavaScript > code, would appear with its top left corner concurrent with > the top right corner of Menu Item 1. It would not affect > document flow. "left" and "top" could be used to displace it > from there. > </div> > <div class="popupmenu" submenuof="item2"> > This box, if its display were set to block by JavaScript > code, would appear with its top left corner concurrent with > the top right corner of Menu Item 2. It would not affect > document flow. > </div> > <div class="popupmenu" submenuof="item3"> > This box, if its display were set to block by JavaScript > code, would appear with its top left corner concurrent with > the top right corner of Menu Item 3. It would not affect > document flow. > </div> > </body> > > > My and Vadim's block-align property might help with some of > this, but it's definitely not enough by itself. > > Jeffrey Yasskin > >
Received on Friday, 26 October 2001 15:01:37 UTC