- From: James Elmore <James.Elmore@cox.net>
- Date: Wed, 30 May 2007 15:17:59 -0700
- To: www-style@w3.org
About three months ago, there was some discussion about adding the ability to constrain or change the sizes of groups of elements to CSS. Yesterday, I was thinking about the <table> element and reached the conclusion that this ability should be part of CSS, and possibly could be removed from tables. I apologize for the length of this post, I wrote down my thoughts and they were (possibly too) extensive. The specifications for HTML, XHTML, and CSS declare that HTML / XHTML elements should contain the data for a document and that CSS should describe the formatting of the document. Because HTML was defined before this split (data / format) was clearly understood, many HTML elements include formatting information, in some cases to the exclusion of data. In addition, some of the elements combine, or are used for, formatting along with included data. One of the most abused of these combination elements is <table>. To be clear, even though this document is discussing styling (CSS), the first use of the <table> element should be to enter arrays of data (tables / spreadsheets) into web pages. The formatting of the data arrays might be specified (by default) within the UA or other HTML display software. The HTML and XHTML specifications clearly state that one dimensional sets of data should be declared as lists (<ul>, <ol>, etc.) and two dimensional sets of data should be declared as tables (with <row>, <col>, and data: <td> or <th> elements). Lists default to vertical orientation, but can be used, after a fashion, in horizontal orientation by styling them as ‘inline-block’ elements. Single columns or rows (one dimensional data sets) can also be displayed simply with a table element which only contains a one dimensional data set; this is frequently used by web page designers. {There is no discussion of higher-order sets of data in HTML or XHTML, although this document will mention them later.} Almost immediately, web developers began using tables to align items, both vertically and horizontally. Since Tables are block elements which contain block elements, each block can be declared style=‘vertical-align: top’ (or baseline, sub, super, text-top, middle, or bottom) or style=’text-align:left’ (or center, right, or justify). Other alignments can be handled within a block element by specifying the left and right, top and bottom padding. Any block element can do this, so it is not strictly necessary to use tables to align embedded elements, but tables also are nested blocks and this makes it simpler to use the CSS cascades -- designers then only need to declare the desired alignment once, for the table (parent). {In some future version of HTML, it might be desirable to declare a data element and an array of data elements and then make higher dimensional sets of data elements as arrays of arrays, as in many programming languages. This would simplify understanding of multi-dimensional data sets and make the UA programmers’ jobs easier. The only difficulty not yet clarified by CSS would be how to display higher-order data sets. I can visualize future UAs providing rotate, slice, and other options to view complex, multidimensional data sets.} Designers soon discovered that they could also adjust the size of the individual elements (or at least the area surrounding them) using tables. (A <table width=’80%’> declaration, for example, would appear larger on larger screens or when the user enlarged the UA window, and the enclosed elements would also grow. This growth can be limited by specifying row, column, and data element sizes specifically.) Once block elements and CSS appeared, this ability was available to designers using, for example, <div> elements and no longer strictly required <table> elements. Because of designer inertia (they already learned to use <table> elements and were reluctant to change), and because because <table> elements also align and nest, many web designers still use tables to control the sizes of data elements. One more ability of tables makes them indispensable to web page designers: they can adjust the sizes of individual elements (blocks, padding, or resizing images) in relation to other elements. In a table, all the individual blocks in one row must have the same height and all the elements in a column must have the same width. The default automatic layout for tables also makes all table data elements the same size. There is no other HTML / XHTML element which can automatically resize contained elements (or their margins / padding) so the elements appear all the same size. This ability is strictly formatting and should logically be part of CSS. I would, therefore, like to propose adding to CSS the ability to make sets of elements conform to a common size. This would necessitate the ability to define sets (possibly using classes), the ability to set sizes (width and/or height) and the ability to select minima, maxima, and maybe even averages (min, max, avg) of these element sets. Once these abilities are part of CSS, <table> elements can then be used strictly to declare arrays of data, and CSS can be used to align and adjust element sizes based on other elements or screen or window sizes. Until this ability is part of CSS, the data / format split between HTML and CSS will never be clean because one necessary formatting ability is only available using tables. Once this ability is part of CSS, many designs which are either not possible, or innately complex using current HTML / XML can be created. Just a few simple examples: Making a column on each side of the window have the same size. This can be extended to columns with gaps. Currently, designers must use a table or must explicitly declare the size of the column elements. Creating a rectangular display area with different sized blocks, not necessarily all lined up. For example: style { div { width: 100%; } .row { display: inline-block; } .colA { width: 50%; } .colB { width: 30%; } .colC { width: 20%; } } <div> <div class=”row”> <div class=”colA”>Wide</div> <div class=”colB”>Med</div> <div class=”colC”>Thin</div> </div> <div class=”row”> <div class=”colC”>Thin</div> <div class=”colA”>Wide</div> <div class=”colB”>Med</div> </div> </div> This could allow designers to align horizontally and offset vertically or to align vertically and offset horizontally. I’m sure many other uses will be invented by creative designers. James Elmore 22162 Windward Way Lake Forest, CA 92630 Home (949) 830-9534 Email James.Elmore@cox.net
Received on Wednesday, 30 May 2007 22:18:18 UTC