Css权威指南(4th,第四版中文翻译)-14.CSS中的Table布局

刚看到table layout表单布局是不是不想接触,不过本章不是关于怎么使用table来布局的,而是来看看table自己是怎么借助CSS来布局的,因为这比它看上去的要复杂的多。

table表单跟其他布局相比是有点奇怪的,因为他会将元素大小和其他元素大小做关联。例如所有一行的cell高度都是一样的,width也是这样。


格式化Table表单

首先也是最重要的就是了解下CSS是怎么处理和渲染内部table元素的,其中一个关键点就是没有margin。
除了这个意外,排布table还有6个基本的规则,而这些规则的基石就是grid cell。也就是说table排布从某种意义上说是基于grid布局的:


image.png

而这些grid cell都是理论上创建的,也就是说这些样式是无法通过DOM获取的,他们只是用来描述表单如何渲染的。

Table排布规则:

  1. row的盒子包含了一整行的grid cell。自上而下渲染。
  2. row group 的盒子和row 盒子一样包含相同的grid cell。
  3. column box 可以包含一个或多个column的grid cell,从左往右排列。
  4. column group 的盒子和column 盒子一样包含相同的grid cell。
  5. 虽然cell可以span多行和多列,不过CSS自己没有定义如何实现,依赖浏览器来做
  6. cell盒子无法超过最底部行的返回,不会自动扩展

table 的display值

image.png

我们其实默认在html其实还涉及不到这些字段,因为已经内定了不同的标签,比如tr,td等。而对于其他的超文本语言,例如xml的话这就很有必要自定义不同的table类型:

  • table: 生成一个block的table
  • inline-table: 生成一个inline的table
  • table-row:表征table的一行,对应于tr
  • table-row-group:可以包含多行的group,对应于html的tbody
  • table-header-group:表示table头部的row group,对应于thead
  • table-footer-group:跟table-header-group类似,对应于tfoot
  • table-column:在CSS中不会渲染,对应于col
    -table-column-group:跟table-column类似,也不渲染,对应于colgroup
    -table-cell:代表了单个cell,类似于th和td

整个table组件以横向组织位置,纵向内容为辅,其中每个column的元素支持四个属性:border,background,width和visibility。

Table Layer

table的渲染从下往上由下面几层组成:


image.png

table说明

一般table在上面或是下面都要有个说明,可以通过caption-side来定位:


image.png
caption {background: #B84; margin: 1em 0; caption-side: top;} 
table {color: white; background: #840; margin: 0.5em 0;}

Table Cell Borders

css中好办了两种不同的border处理方式,核心是到底要不要合并相邻的border,通过border-collapse来设置:


image.png

首先看下separate的例子:

table {border-collapse: separate;}
td {border: 3px double black; padding: 3px;} tr:nth-child(2) td:nth-child(2) {border-color: gray;}
<table cellspacing="0"> <tr>
<td>cell one</td>
<td>cell two</td> </tr>
<tr>
<td>cell three</td> <td>cell four</td>
        </tr>
    </table>
image.png

既然中间有gap,那么一定有属性来定义gap的宽度,这个就是border-spacing:


image.png
table {border-collapse: separate; border-spacing: 5px 8px; padding: 12px; border: 2px solid black;}
td { border: 1px solid gray;}
td#squeeze {border-width: 5px;}
image.png

另外对于空的cell是否显示,可有对应的属性:


image.png

合并的cell border

合并border本身存在一系列的规则,结构示意图如下图:


下面总结了不同的使用特点:


table {border-collapse: collapse;
border: 3px outset gray;}
td {border: 1px solid gray; padding: 0.5em;} #r2c1, #r2c2 {border-style: hidden;}
#r1c1, #r1c4 {border-width: 5px;}
#r2c4 {border-style: double; border-width: 3px;} #r3c4 {border-style: dotted; border-width: 2px;} #r4c1 {border-bottom-style: hidden;}
#r4c3 {border-top: 13px solid silver;}
image.png

Table设置大小

table的宽度分为两类,固定的宽度布局,还有自动计算宽度的布局。不过不管哪种,高度都是自动计算的。
而控制这种不同的属性就是table-layout:


image.png

但从渲染来说,固定的宽度比自动计算的要快不少,因为宽度完全不依赖于table cell的内容。
来看个固定的例子:

table {table-layout: fixed; width: 400px; border-collapse: collapse;}
td {border: 1px solid;} col#c1 {width: 200px;} #r1c2 {width: 75px;} #r2c3 {width: 500px;}
<table>
<colgroup> <col id="c1"><col id="c2"><col id="c3"><col id="c4"> </colgroup> <tr>
<td id="r1c1">1-1</td> <td id="r1c2">1-2</td> <td id="r1c3">1-3</td> <td id="r1c4">1-4</td>
</tr> <tr>
<td id="r2c1">2-1</td> <td id="r2c2">2-2</td> <td id="r2c3">2-3</td> <td id="r2c4">2-4</td>
</tr> <tr>
<td id="r3c1">3-1</td> <td id="r3c2">3-2</td> <td id="r3c3">3-3</td> <td id="r3c4">3-4</td>
</tr> <tr>
<td id="r4c1">4-1</td> <td id="r4c2">4-2</td> <td id="r4c3">4-3</td> <td id="r4c4">4-4</td>
        </tr>
    </table>
image.png

然后看下自动auto计算的,这个其实特别常见,也是html默认的方式。有意思的是不需要把table的table-layout设定为auto,而只要width设为auto就会触发了。

table {table-layout: auto; width: auto; border-collapse: collapse;}
td {border: 1px solid; padding: 0;} col#c3 {width: 25%;}
#r1c2 {width: 40%;}
#r2c2 {width: 50px;}
#r2c3 {width: 35px;} #r4c1 {width: 100px;} #r4c4 {width: 1px;}
image.png

对齐

table cell的对齐可以使用vertical-align来定义:

table {table-layout: auto; width: 20em; border-collapse: separate; border-spacing: 3px;} td {border: 1px solid; background: silver;
padding: 0;}
div {border: 1px dashed gray; background: white;} #r1c1 {vertical-align: top; height: 10em;}
#r1c2 {vertical-align: middle;}
#r1c3 {vertical-align: bottom;}
image.png

还有一个baseline对齐:


对齐

小结

哪怕你以前对tale已经很熟了,但是其背后的布局机制还是很复杂的。在HTML中,CSS的table是基于行排布的,不过也兼容列的排布。table 的layout超越了html的限制,可以应用在更广阔的使用场景中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • (注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!)(注2:更多内容请查看我的目录。) ...
    love丁酥酥阅读 4,191评论 2 5
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,440评论 5 15
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,748评论 1 92
  • 双飞翼布局 (淘宝UED对圣杯布局的升级优化) 圣杯布局和双飞翼布局的实现(三栏布局),都是左右两栏固定宽度,中间...
    Junting阅读 398评论 0 1
  • 这是个非常普通的洞穴。 洞穴所在的山很普通,洞穴之前的河也很普通。 唯一不普通的,就是在洞穴附近的这个村庄。 村庄...
    泥藏风阅读 1,050评论 2 1