- From: Giovanni Campagna <scampa.giovanni@gmail.com>
- Date: Tue, 20 Oct 2009 15:15:54 +0200
- To: news@terrainformatica.com
- Cc: "Tab Atkins Jr." <jackalmage@gmail.com>, Www-style <www-style@w3.org>
2009/10/20 Andrew Fedoniouk <news@terrainformatica.com>:
> Tab Atkins Jr. wrote:
>>
>> On Mon, Oct 19, 2009 at 11:43 AM, Andrew Fedoniouk
>> <news@terrainformatica.com> wrote:
>>>
>>> CSS tables cannot reproduce <table> layout.
>>> colspan/rowspan and their flex behavior.
>>
>> There's been talk about adding rowspan/colspan. It's very likely
>> that'll show up in either Tables level 3 or 4.
>>
>> What part of the flex behavior isn't present in the Tables module?
>>
>>> width=100% in tables is very far from width:100% in CSS.
>>
>> Afaik, width=100% on a <table> is just sizing the border-box. In
>> other words, <table>s just have an automatic box-sizing:border-box
>> applied by the UA.
>
> width="100%" on table is close to the following:
>
> table
> {
> width:100%;
> box-sizing: border-box;
> overflow: none; /* hypothetical "newer overflow" or this: */
> min-width: min-intrinsic;
> }
Agreed on the first two, the others are only if "table-layout:auto",
and therefore it's specified by CSS2 17.5.2.2
> But width/height="XX%" for table cells is completely different thing.
>
> Set of cells having width="XX%" in percents in case of
> sum of percents is equal or greater than 100% is turning into
> the flex computation.
Same as CSS Automatic Table Layout (introduced by HTML4, included in
CSS2, replaced by CSS21, made normative by css3-tables-algorithm).
> So this:
>
> <TD width="30%">1</TD>
> <TD width="70%">2</TD>
> <TD width="50%">3</TD>
>
> will be precisely this (using HTML 4.0 relative units [1]):
>
> <TD width="3*">1</TD>
> <TD width="7*">2</TD>
> <TD width="5*">3</TD>
>
> or this if to use flexes:
>
> <TD style="width:3*">1</TD>
> <TD style="width:7*">2</TD>
> <TD style="width:5*">3</TD>
>
Not really.
Tried with
<!doctype HTML>
<style>div, table, td { border:1px solid black;
border-collapse:collapse; }</style>
<div style="display: table;width:100%">
<div style="display: table-cell; width: 30%;">1</div>
<div style="display: table-cell; width: 70%;">2</div>
<div style="display: table-cell; width: 50%;">3</div>
</div>
<table width="100%">
<tbody><tr><td width="30%">1</td>
<td width="70%">2</td>
<td width="50%">3</td>
</tr></tbody></table>
(style added for clarity)
in FF3.5, Opera 10, Konqueror 4.3 and Arora 0.10 and:
1) The two tables look identical (except 1px of default padding in <td>)
2) The first two cells get as much space as possible.
To achieve your layout you need to go
<div style="display:table">
<div style="display:table-cell;width:20%;">1</div>
<div style="display:table-cell;width:46%;">2</div>
<div style="display:table-cell;width:33%">3</div>
</div>
(tested again, this works)
>>
>>> (and <table>s have explicit flex units already like
>>> <td width="1*">, btw) So vast majority of cases where we use
>>> flow:"template" now are simply not reproducible by display:table
>>> and even by <table>s.
>>
>> Can you explain this flex behavior further?
>>
>
> On this page:
> http://www.terrainformatica.com/htmlayout/fspu.whtm
> There is a table in "Example:" section just after
> "Imagine that four blocks below declared in CSS as:"
>
> It is declared as:
>
> <TABLE width="100%">
> <TR>
> <TD width="100">width:100px<br>
> <IMG height="1" src="spacer.gif" width="100">
> <!-- the ugly "strut" needed to force the cell to have
> needed size--></TD>
> <TD width="30%">width:30%%</TD>
> <TD width="70%">width:70%%</TD>
> <TD width="150">width:150px<br>
> <IMG height="1" src="spacer.gif" width="150"></TD>
> </TR>
> </TABLE>
>
> If you resize UA's window you can note that this table is flexible,
> two cells in the middle behave exactly as this (flow/flexes):
>
> <div style="flow:horizontal">
> <div style="width:100px">width:100px</div>
> <div style="width:3*">width:30%%</div>
> <div style="width:7*">width:70%%</div>
> <div style="width:150px;">width:150px</div>
> </div>
>
> This is not reproducible in CSS by any means.
> Not even with display:table/row/cell.
Go for
<div style="display:table">
<div style="display:table-cell;min-width:100px">A</div>
<div style="display:table-cell;width:30%">B</div>
<div style="display:table-cell;width:70%">C</div>
<div style="display:table-cell;min-width:150px">D</div>
</div>
This works in all browser I tested.
> As I said without flex units display:table is a dead born
> feature.
I'm not saying "death to flex units", just for most cases table is enough.
> Flex layout of tables and overflow:none; (imaginable) in cells
> is the main motivation why tables are used for page layouts
> on the web.
That was my point: table have been working perfectly, why do we need
to change this?
> Any advices to do not use tables for layout purposes
> without any means to replace them in CSS are cynical at least.
>
> [1] HTML 4.01 Relative Length Units defined here:
> http://www.w3.org/TR/1999/REC-html401-19991224/types.html#type-length
> (note they were defined in HTML in previous century)
And implemented in the previous century, it seems. Tested in modern
browser, they're just ignored.
>
>> ~TJ
>>
>
> --
> Andrew Fedoniouk.
>
> http://terrainformatica.com
>
Giovanni
Received on Tuesday, 20 October 2009 13:16:28 UTC