display:table-cell
;会使元素表现的类似一个表格中的单元格td
,利用这个特性可以实现文字的垂直居中效果。同时它也会破坏一些 CSS 属性,使用table-cell
时最好不要与float
以及position: absolute
一起使用,设置了table-cell
的元素对高度和宽度高度敏感,对margin
值无反应,可以响应padding
的设置,表现几乎类似一个 td 元素。
小结:
float:left; position:absolute;
一起使用。margin
设置无效,响应 padding
设置。下面介绍几个 table-cell
的应用:
关键在于设置了 display:cell;
后,vertical-align:middle
使文字内容垂直居中。
<style>
.outer{display: table;width: 100%;}
.table-wrap{
display: table-cell;
height: 200px;
padding: 20px;
vertical-align: middle;
text-align: center;
border: 1px solid red;
}
</style>
<div class="outer">
<div class="table-wrap">
<img src="http://jsfiddle.net/img/logo@2x.png" alt="logo" />
</div>
</div>
中间的图片会随着外层容器的大小而自动水平垂直居中,其实原理和文字水平垂直居中一模一样。
<style>
*{margin: 0;padding: 0;}
.outer{display: table;width: 90%;margin: 10px auto;
padding: 10px; border: 1px solid green;}
.table-left,.table-right{
display: table-cell;
width: 20%;
border: 1px solid red;
}
.table-center{
height: 100px;
background-color: green;
}
</style>
<div class="outer">
<div class="table-left">
<p>我是左边</p>
</div>
<div class="table-center">
我是中间
</div>
<div class="table-right">
<p>我是右边</p>
</div>
</div>
可以看到左右两边以及中间部分的文字,虽然它们在不同的容器中,且不用管当前列容器设置的 padding 是多少,它们在水平方向上是绝对对齐的。
<style>
*{margin: 0;padding: 0;}
.outer{display: table;width: 90%;margin: 10px auto;
padding: 10px; border: 1px solid green;}
.table-left{
display: table-cell;
width: 150px;
padding-top: 20px;
border: 1px solid red;
vertical-align: top;
text-align: center;
}
.table-right{
border: 1px solid yellow;
background-color: green;
margin-left: 20px;
padding: 10px;
}
</style>
<div class="outer">
<div class="table-left">
<img src="http://jsfiddle.net/img/logo@2x.png" alt="logo" />
</div>
<div class="table-right">
<span>这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字。。。。。</span>
</div>
</div>
拉伸宽度,会发现左右两侧始终保持高度一致。
<style>
*{margin: 0;padding: 0;}
.table-wrap{
display: table;
width: 80%;
margin: 20px auto;
border: 1px solid red;
padding: 20px;
}
.table-wrap li{
display: table-cell;
padding: 20px;
border: 1px solid green;
border-right: none;
text-align: center;
vertical-align: middle;
}
.table-wrap li:last-child{
border-right: 1px solid green;
}
</style>
<ul class="table-wrap">
<li>001</li>
<li>002</li>
<li>003</li>
<li>004</li>
<li>005</li>
</ul>
以前进行类似的布局我都会使用 display:inline-block;
的方式,需要在 ul 上设置 font-size: 0;
来清除每一个小块之间的间隙,还需要为每一个项写一个百分比宽度。使用 table-cell
后,不需要写百分比宽度,也不需要清除小块间的间隙。而且添加额外项时,会自动平均分配宽度。
即左侧宽度固定,右侧自动分配剩余空间:
<style>
* {
box-sizing: border-box;
}
.content {
display: table;
border: 1px solid #06c;
padding: 15px 5px;
max-width: 1000px;
margin: 10px auto;
min-width: 320px;
width: 100%;
}
.left-box{
float: left;
background-color: green;
margin-right: 10px;
padding-top:5px;
}
.right-box{
display: table-cell;
border: 1px solid red;
padding: 10px;
vertical-align: top;
}
</style>
<div class="content">
<div class="left-box">
<img src="http://jsfiddle.net/img/logo@2x.png" alt="logo" />
</div>
<div class="right-box">
<span>这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字。。。。。</span>
</div>
</div>
左侧宽度固定,右侧宽度自适应。布局原理也可以用 BFC 来解释,左侧和右侧都是 BFC 块,BFC 块是不会和 float 块发生重叠的。
使用 table-cell 有一个让人很抓狂的地方,那就是他的宽高是不能使用百分比设置的,具体的原因我一直没有找到,只能理解为这是这个属性的特性。希望有知道的老铁告知一声。下面说一说关于百分比宽高的结论:1. 高度设置百分比无效,只与内容的实际高度有关 2. 宽度设置百分比分两种情况, * 一种是父容器设置 display:table;
,这种情况下分两种情况 1. 没有其他元素 table-cell
的容器会获得它前面的元素在水平方向分配完的全部宽度。2. 在其前面有其他元素时,其宽度可以按照 display:inline-block
的元素来计算,也就是宽度会小于等于其百分比计算值的宽度的 * 在父容器未设置 table时
,width
的百分比值可以理解为内容区宽度加上 border-box
左右两边到父容器边框的距离,也就是 width
的百分比值越小,其所占据的宽度越大 如果你对这个问题比较感兴趣,可以看看这个问答。真的是匪夷所思啊。
小结:所有的
display:table-cell;
布局中,vertical-align
属性对于文字对齐都是很关键的。
Q: 有兼容性的坑么,生产环境使用的如何?
A: 对于兼容性,只是在新版的 chrome 中测试过,生产环境中还是不建议用这种小众的方案,毕竟出了问题也不好找解决方案。
Q: 相对其他对齐或者布局方式的优势是?
A: 相对其他布局方式,其实并没啥优势,而且还是属于比较小众的布局方式。但是针对一些特殊的场景,使用起来还是很方便的。比如对于列子一,使用 table-cell 的方式就要比其他布局方式简单。
紧追技术前沿,深挖专业领域
扫码关注我们吧!