- 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