1. 匿名表格元素创建
CSS2.1表格模型中的元素,可能不会全部包含在除HTML之外的文档语言中。这时,那些“丢失”的元素会被模拟出来,从而使得表格模型能够正常工作。所有的表格元素将会自动在自身周围生成所需的匿名table对象,使其符合table/inline-table、table-row、table- cell的三层嵌套关系。
也就是说如下代码:
<div id="table-cell">content</div>
#table-cell {
display: table-cell;
}
等价于
<div id="table">
<div id="table-row">
<div id="table-cell">content</div>
</div>
</div>
#table {
display: table;
table-layout: auto;
}
#table-row {
display: table-row;
}
#table-cell {
display: table-cell;
}
只不过外层的table
和table-row
是由浏览器默认创建的,称为匿名元素;反之,如果有:
<div id="table">
<p>paragraph1</p>
<p>paragraph2</p>
</div>
#table {
display: table;
}
则等价于:
<div id="table">
<div id="table-row">
<div id="table-cell">
<p>paragraph1</p>
<p>paragraph2</p>
</div>
</div>
</div>
#table {
display: table;
}
#table-row {
display: table-row;
}
#table-cell {
display: table-cell;
}
这次,浏览器默认创建了table-row
和table-cell
两个匿名元素。
2. table-cell和table-row设置margin无效
对于设置为display: table-cell
或display: table-row
的元素,对其设置margin
将不会产生任何作用。
3. table-row设置width无效
table-row
作为table
和table-cell
的中间元素,对其设置width
属性将不会产生任何作用。table-row
元素的宽度由内部的table-cell
或外部的table
决定。
4. table、table-row、table-cell之间宽度相互作用关系
由于table
可以设置为table-layout: auto
或table-layout: fixed
,而两者对于table、table-row和table-cell在不同情况下的宽度取值具有不同影响,所以对它们进行分类描述:
-
table-layout: auto(默认值)
假设有如下代码:<div id="container"> <div id="table"> <div id="table-row"> <div id="table-cell">content</div> </div> </div> </div> #container { width: 1000px; } #table { display: table; table-layout: auto; } #table-row { display: table-row; } #table-cell { display: table-cell; }
在
table
不显式设置宽度的情况下,由于table
、table-row
和table-cell
具有包裹性,所以三者的宽度等于内部content
的宽度;当table-cell
设置宽度时,如:#table-cell { display: table-cell; width: 500px; }
table
和table-row
的宽度调整为table-cell
的宽度(500px),但是若设置table-cell
宽度大于table
外部容器container
的宽度(如1200px),此时table
会反过来约束table-row
和table-cell
将其宽度限制为1000px(table不显式设置宽度时,其宽度不会超过外部容器宽度)。在
table
显式设置宽度的情况下,无论内部的table-cell
是否设置宽度,宽度是否大于table
的宽度,table-row
和table-cell
的实际宽度都等于table
的宽度。但是有一种情况例外,即当table
宽度设置为小于table-cell
中文本的最小宽度时,如:#table { display: table; table-layout: auto; width: 1px; }
此时
table
、table-row
和table-cell
三者的宽度并不会缩小到1px,而是会保持table-cell
中文本的最小宽度:
- table-layout: fixed
假设代码与table-layout: auto
情况下一致,只是对table
做出修改:
在#table { display: table; table-layout: fixed; }
table
不显式设置宽度的情况下,与table-layout: auto
的情况完全一致。
在table
显式设置宽度的情况下,若table-cell
不显式设置宽度,则table
、table-row
和table-cell
三者的宽度相等,都等于table
设置宽度(包括table
宽度小于table-cell
中文本最小宽度的情况);若table-cell
显式设置宽度,当table
宽度大于table-cell
时,table
、table-row
和table-cell
三者宽度等于table
宽度;当table
宽度小于table-cell
时,table
、table-row
和table-cell
三者宽度等于table-cell
宽度。
5. 位于同一table-row下的所有table-cell高度相等
假设有如下代码:
<div class="table-cell" id="cell1">cell1</div>
<div class="table-cell" id="cell2">cell2</div>
<div class="table-cell" id="cell3">cell3</div>
<div class="table-cell" id="cell4">cell4</div>
.table-cell {
display: table-cell;
}
#cell1 {
height: 50px;
}
#cell2 {
height: 60px;
}
#cell3 {
height: 80px;
}
#cell4 {
height: 100px;
}
由于cell1
、cell2
、cell3
、cell4
会被包含在浏览器默认创建的同一table-row
下,则最终该table-row
的高度会等于所有单元格中最高元素的高度(即100px),并统一所有单元格的高度等于该高度。
6. table-layout: fixed令各table-cell宽度等分
当table
显式设置宽度,设置table-layout
为fixed
且table-cell
不设置宽度时,每行中的所有table-cell
将平分table
的宽度:
<div id="table">
<div class="table-cell">cell1</div>
<div class="table-cell">cell2</div>
<div class="table-cell">cell3</div>
<div class="table-cell">cell4</div>
</div>
#table {
display: table;
table-layout: fixed;
width: 500px;
}
.table-cell {
display: table-cell;
}
效果为:
7. vertical-align在table-cell上的作用
vertical-align一般作用在内联元素上,主要用于内联元素间在垂直方向上的对齐。不过,vertical-align同样也可以作用于table-cell
元素,目的是为了指定table-cell
中的内容在垂直方向上相对于table-cell
的对齐关系:
关于vertical-align
的更多信息,可参考:mdn vertical-align.
8. display: table-cell在布局上的应用
应用一:元素垂直居中
使用table-cell
搭配vertical-align
可以十分简单地完成元素垂直居中:
<div id="box">
<div id="content">content goes here...</div>
</div>
#box {
display: table-cell;
width: 200px;
height: 100px;
vertical-align: middle;
}
应用二:自适应两栏布局
使用table-cell
完成“左侧宽度固定,右侧宽度自适应”的两栏布局:
<div id="container">
<div id="left">content goes here...</div>
<div id="right">content goes here...</div>
</div>
#left {
float: left;
width: 150px;
}
#right {
display: table-cell;
width: 9999px;
}
#container {
overflow: auto;
}
应用三:等高布局
<div id=container>
<div id="left">content goes here...</div>
<div id="right">content goes here...</div>
</div>
#container {
display: table-row;
}
#left,
#right {
display: table-cell;
width: 100px;
}
布局效果为:
应用四:等宽布局
<div id="container">
<div class="cell">content goes here...</div>
<div class="cell">content goes here...</div>
<div class="cell">content goes here...</div>
</div>
#container {
display: table;
table-layout: fixed;
width: 450px;
}
.cell {
display: table-cell;
}
布局效果为: