- From: Nicholas Shanks <contact@nickshanks.com>
- Date: Thu, 27 Jul 2006 20:04:28 +0000
- To: www-style@w3.org
- Message-Id: <9A8B4B69-E496-484C-B713-DBA458E67619@nickshanks.com>
This comes from a friend of mine who doesn't have the self-confidence
to post it himself, so shall remain nameless, but I thought it was a
good idea. Basically it's a way of divvying up a page and relocating
bits of the document presentationally. I leave it with you to discuss.
During private discussion with acquaintances I devised a means of
handling basic page layout intended for a forthcoming CSS release. To
my surprise I was told that CSS3 already has such a means (the
Advanced Layout Module) but I was rather disappointed to find that it
was overextended (using it for more than it should be) and tedious
and fragile -- you have to attach everything into its own cryptically-
named cell and keep adding more cells to the design.
So I am presenting here a rough guide to my own, pragmatic
approach, to see what you think.
The basic idea starts off similarly to CSS3 with a layout of the
page, for example:
@page-structure {
header h { columns imagecol, sitenavcol };
columns navleft, maincol { rows intro, bodycell };
footer; }
Each top-most element in this list is a row of the page, a block
box equivalent to a <div>. Each keyword is followed by a comma-
separated list of named cells. If a cell name is followed by braces,
the braces contain instructions to subdivide the cell into more rows
or colums. Like a frameset, cells can only be divided either
vertically or horizontally, but a cause may be found to generate grids.
The keywords involved here are:
* row -- name a row cell that spans the width of the container
* columns -- name a list of columns
* rows -- name a list of rows
* header -- a synonym for row but defines it also to be the header row
* footer -- a synonym for row but defines it also to be the footer row
Then, content becomes assigned to cells:
div#header { locate: intro }
div#firstsummary { locate: intro }
div#globalnav { locate: navleft }
Where multiple block elements are assigned to the same cell,
assignment is done in order of being read from the CSS or HTML.
#header will be placed into the intro cell first, followed by
#firstsummary. This can be overriden such as:
div#header { locate: intro; locate-params: top }
will push #header to the top if intro already contains content.
Content can also be forced to the bottom. Where top or bottom are
repeated, again, order of reading determines who wins, with most
recent content favoured.
Each cell will be a block box which will either be referenced by an
ID selector (#) or perhaps a new selector, such as '^' (although I
think we're running out of useful chars ;) Styles applied to a cell
cascade into enclosed cells just as if they were normal block boxes,
allowing for a row or column of cells to be styled together.
In order to maximise flexiblity, it will be crucial that structure
can be applied in multiple places. For example, /global/styles.css
may contain:
@page-structure { rows headercell, main { columns pagenav,
contentcell }, footercell }; };
The page itself may decide that inside contentcell, it desires two
columns:
#contentcell { structure: columns leftcol, maincol }
(would nesting braces work in the above? I don't understand all the
rules enough, I just understand what would make my life substantially
easier in terms of doing basic, useful two-dimensional layout for
semantic content)
Now, pages like <http://telcontar.net/MacApps/HTTPWerkzeug/> could
be addressed more easily. Supposing the best semantic order for the
pure HTML was:
* Title
* Intro
* Changes
* Screenshots
* Download
* Version history
* Credits
Then the page might contain this CSS to achieve the current layout:
#screenshots { locate: leftcol }
#versionhist { locate: leftcol }
#download { locate: leftcol }
#title { locate: maincol }
#intro { locate: maincol }
#changes { locate: maincol }
#credits { locate: maincol }
The above could live in a section CSS for /MacApps/ for all pages
to share, along with the line that defines the split of the main cell
into leftcol and maincol.
This way, the system is a lot less fragile as new cells do not need
to be created for every last item, and bizarre grids of symbols are
not needed. Further, cells are not restricted to meaningless single
character names. I am not sure why I came up with special header and
footer rows, but in revision, I find them to be rather useless, and a
waste of identifiers; "row header", where header is defined with
header-like properties (such as position: fixed), would make more sense.
The approach of CSS seems typically intended to solve as much as
possible with as elements as small and fundametal as possible but
this seems to give rise to unnecessary complication. I intend for my
design to only handle core page layout and not for unrelated issues
such as getting forms to look decent.
Generation of grids for the likes of photo albums always felt
utterly bogus to me as you're forcing a potentially unsuitable page
size on the viewport. I much prefer flowing arrangements where the
cells are all row and column independent and flow as inline boxes.
This works perfectly in theory but in practice fails for two reasons.
Firstly, a lack of implementation of inline-block.
Secondly, a lack of ability for page elements to share common
derived characteristics. For example, "within this <div>, make every
inner <div> /* i.e. cell */ be the height of the tallest one". If one
cell needs its caption to flow to two lines, all cells will have
their height increase to match so that all the cells will be uniform.
With tables this only works on a per-row basis but I do not believe
CSS yet supports this across a whole free-flow grid of inline-block
boxes.
I try my best to only ever use flowing arrangements for grids now
as I am all too aware that careless use of tables (even CSS tables
when the intention is to define the appearance only) gives you
horizontal scrollbars and these are as ugly as sin. (I have at least
two pages where this is a problem but in both cases the overruling
issue is the lack of inline-block for the moment).
For lining up forms and definition lists I would suggest using CSS
tables as they are effectively tabular. Generating huge Advanced
Layout Module cell grids is horrible as you'd have to keep updating
the cell list every time you altered the form or definition list and
hope you never need more than 26 cells (a-z). I imagine there are
going to be more natural ways to achieve this but I fear they'd be
too specialised entirely.
Attachments
- application/pkcs7-signature attachment: smime.p7s
Received on Friday, 28 July 2006 09:28:57 UTC