display:table-cell 落日映苍穹つ 2021-10-30 01:06 292阅读 0赞 ### 一、display:table-cell属性简述 ### `display:table-cell`属性指让标签元素以表格单元格的形式呈现,类似于`td`标签。目前IE8+以及其他现代浏览器都是支持此属性的,但是IE6/7只能对你说sorry了,这一事实也是大大制约了`display:table-cell`属性在实际项目中的应用(写于2016年8月24日:时代在变,当下,是时候登上舞台了)。 我们都知道,单元格有一些比较特别的属性,例如元素的垂直居中对齐,关联伸缩等,所以`display:table-cell`还是有不少潜在的使用价值的,虽说IE6/7不支持此属性,但是幸运的是,IE6/7一些乱糟糟的属性与渲染,我们可以其他方法实现同样或是类似的效果。 与其他一些display属性类似,`table-cell`同样会被其他一些CSS属性破坏,例如`float`, `position:absolute`,所以,在使用`display:table-cell`与`float:left`或是`position:absolute`属性尽量不用同用。设置了`display:table-cell`的元素对宽度高度敏感,对`margin`值无反应,响应`padding`属性,基本上就是活脱脱的一个td标签元素了。 ### 二、display:table-cell与大小不固定元素的垂直居中 ### 使用`display:table-cell`让大小不固定元素垂直居中已经是很老的方法了,关于此应用,我已经在“[大小不固定的图片、多行文字的水平垂直居中][Link 1]”这篇文章中有过介绍。 ![以前图片垂直居中之截图 张鑫旭-鑫空间-鑫生活][_-_-] 方便阅读,这里再次展示下代码: /*这里的大小是根据高宽上限128像素图片设置的*/ div{display:table-cell; width:1em; height:1em; border:1px solid #beceeb; font-size:144px; text-align:center; vertical-align:middle;} div img{vertical-align:middle;} 结果如下图: ![table-cell和文字大小实现的图片垂直居中显示][table-cell] 这里有个demo地址,里面有`display:table-cell`实现大小不固定图片垂直居中的效果展示,您可以狠狠地点击[这里][Link 2]。 ### 二、display:table-cell与两栏自适应布局 ### 就在前不久,看facebook好友动态列表页面前端代码的时候才发现原来`display:table-cell`可以用在两栏的自适应布局上。 ![facebook的table-cell自适应方法 张鑫旭-鑫空间-鑫生活][facebook_table-cell_ _-_-] 虽然IE6/7不认识`display:table-cell`,但是亏了其一向自以为是的渲染与解析,我们可以很幸运的使用其他属性实现几乎一致的效果。 ![display:table-cell下的两栏自适应效果截图 张鑫旭-鑫空间-鑫生活][display_table-cell_ _-_-] 您可以狠狠地点击这里:[display:table-cell下两栏自适应布局demo][display_table-cell_demo] **代码展示:** 本例中,左侧为头像,右侧内容自适应。其中头像部分使用了`float`属性,左浮动,IE8+以及Firefox、Chrome、Opera等现代浏览器右侧使用了`display:table-cell`属性,结果就自适应了,很简单的代码,很神奇的效果。 ![display:table-cell自适应布局代码展示 张鑫旭-鑫空间-鑫生活][display_table-cell_ _-_- 1] OK,对于不认识`display:table-cell`属性的IE6/7呢?哦呵呵,很简单,使用`display:inline-block`属性代替`display:table-cell`就完全ok的啦! 原因在于:IE6/7下block属性的元素对inline-block属性是有反应,但是却不是纯洁的反应,而是怪蜀黍看到粉嫩小萝莉的一点邪念,就是让元素有个怪异的haslayout属性。//zxx:大家似乎都喜欢用haslayout解析一些老IE下的一些怪异现象,但我自己打心底里是不认同这个概念。 如果IE6/7是很标准的纯洁的解释`inline-block`属性的话,是无法实现自适应的,右侧的文字描述内容会跑到头像的下面,哦呵呵~~有点负负得正,以毒攻毒的意味。代码如下: display:table-cell; *display:inline-block; 就万事大吉,收工回家了。 在本例demo中,右侧内容足够多,所以宽度完整的撑开了,如果内容有限,则宽度就是内容的宽度,此时想要让某个元素(例如关闭按钮)右侧定位就会有问题,解决方法就是定义一个非常宽的宽度,就像上面facebook截图中的CSS属性一样,所以,考虑到各种情况,更健壮耐用的CSS代码应如下: display:table-cell; *display:inline-block; width:2000px; *width:auto; 或者使用: display:table-cell; width:2000px; *width:auto; *zoom:1; 这种两栏的自适应布局,不仅不要分别丈量与计算两列的宽度,连“[页面重构鑫三无准则 之无宽度准则][Link 3]”中absolute自适应布局的头像宽度都不需要亮了,可以说是更加懒惰,更加直接的好方法。 ### 三、display:table-cell下的等高布局 ### table表格中的单元格最大的特点之一就是同一行列表元素都等高。所以,很多时候,我们需要等高布局的时候,就可以借助`display:table-cell`属性。说到`table-cell`的布局,不得不说一下“匿名表格元素创建规则”: > CSS2.1表格模型中的元素,可能不会全部包含在除HTML之外的文档语言中。这时,那些“丢失”的元素会被模拟出来,从而使得表格模型能够正常工作。所有的表格元素将会自动在自身周围生成所需的匿名table对象,使其符合table/inline-table、table-row、table- cell的三层嵌套关系。 举个例子吧,如果我们为元素使用“display:table-cell;”属性,而不将其父容器设置为“display:table-row;”属性,浏览器会默认创建出一个表格行,就好像文档中真的存在一个被声明的表格行一样。如果您还不是很理解,可见参见支付宝UED的“[基于display:table的CSS布局][display_table_CSS]”一文。//zxx:支付宝今年的招牌广告做得很赞的~~ 实现等高布局,毫无疑问,`display:table-cell`是首选,这就好比鼹鼠,生下来就是为了打洞用的。考虑到匿名创建表格元素的问题,所有`table-cell`元素外一定要留有一个用来包裹的标签。于是,我们有类似下面的CSS代码: .list_row{display:table-row;} .list_cell{display:table-cell; width:30%; padding:1.6%; background-color:#f5f5f5;} /*中间一个元素背景淡蓝,有别于两边的淡灰色*/ .list_center{background-color:#f0f3f9;} 结果在现代浏览器下(如下Firefox3.6下截图): ![table-cell下的等高布局 张鑫旭-鑫空间-鑫生活][table-cell_ _-_-] 您可以狠狠地点击这里:[table-cell等高布局demo][table-cell_demo] 对于不支持display:table-cell属性的IE6/7浏览器,又当如何解决呢? 我们可以使用“补差等高法”,就是一个一个很大的`margin-bottom`负值配上一个同样大小的`padding-bottom`值,本例中为了实例需要,`margin-bottom`值就百来像素。显然,由于两者原理不同,难免需要用到hack,所以demo完整CSS代码如下: .list_row{display:table-row; overflow:hidden;} .list_cell{display:table-cell; width:30%; margin-bottom:-100px; padding:1.6%; *padding-bottom:110px; background-color:#f5f5f5; *float:left;} .list_center{background-color:#f0f3f9;} 认识`display:table-cell`属性的元素对`margin`属性不敏感,所以上面`margin-bottom`属性前没有加\*号。HTML结构代码如下: <div class="list_row"> <div class="list_cell">你一定也有过这种感觉的。...罗兰《寂寞的感觉》</div> <div class="list_cell list_center">作为一个被基阿异捅过...水,四积阴功五读书。</div> <div class="list_cell">奔波了一...永远幸福快乐!</div> </div> //zxx:“补差等高法”虽然有效,也有兼容性,但是会带来一些潜在的问题,不宜多用。 ### 四、display:table-cell下的列表布局 ### 这里的列表布局专指横向repeat的布局,就像下图所示的: ![列表布局示意 张鑫旭-鑫空间-鑫生活][_-_- 1] 一般这类布局都是使用浮动的。但是浮动布局的不足在于:一是需要清除浮动造成影响;二是不支持不定高列表的浮动。替代浮动布局的方法是有的,如果深究细节以及一些思想,方法还不少。其中有一个方法就是使用`display:table-cell`。 当然,说句心里话,将`display:table-cell`属性用在列表元素布局上,有点类似于张飞绣衣服,大马拉小车,优势并没有多大发挥,但是,毕竟也算浮动布局的一个备用替换方案。我的下一篇文章将会详细讲解浮动布局的替换方案,其中`table-cell`方法可以说是里面最不好的一个方法,本着过渡和热身的目的,这里只简单讲过。 首先是效果: 您可以狠狠地点击这里:[display:table-cell下的列表布局][display_table-cell] 可以看到即使模块高度不一致,也不会产生浮动布局可能产生的错位。 由于table-cell需要每行包裹一个独立的标签,所以,在后台repeat输出的时候,需要两次循环,而是列数是限死的(与浮动布局一样)。对于简单的列表,使用display:table-cell是很难看到什么优势的,但是,如果列表复杂,数据多,内容细,display:table-cell可能会像大S订婚的传闻那样让人震惊。 好,点到为止,就说这些。我的下一篇文章还会讲到此属性的布局的。 **更新于2016年8月24日** `display:table-cell`下的列表布局最适用的场景是:列表个数不固定,但是,无论列表几个,都平分容器空间。什么意思呢?就是如果4个列表,希望每个宽度25%,3个就33.3333%,2个列表希望每个宽度50%。此时,没有比`display:table-cell`更合适的技术了。 父级设置`display:table`同时宽度为容器宽度,或者直接`width:100%`,此时,`display:table-cell`子元素就会自动等分。 ![Image 1][] ### 五、结语 ### 对于`display:table-cell`,我自己其实用的并不多,毕竟其特殊之处就在于垂直居中,等高,水平级联,匿名创建等特性,其他种种属性可以使用其他更好的`display`属性代替的。但是话说回来,不太使用display:table-cell属性的真正的原因可能是对该属性的了解的还不够深入,可能该属性本身是存在很多非常实用的应用,但是自己由于掌握不够而不知道。所以,要是哪位同行知道`display:table-cell`其他一些不错的应用的话,欢迎大力补充,不甚感谢! 最后,时间仓促,资质有限,文中要是有表述不准确的地方还望见谅,欢迎严厉地指正。 转载请注明来自[张鑫旭-鑫空间-鑫生活][-_-]\[[http://www.zhangxinxu.com][-_-]\] 转载地址:[http://www.zhangxinxu.com/wordpress/?p=1187][http_www.zhangxinxu.com_wordpress_p_1187] [Link 1]: http://www.zhangxinxu.com/wordpress/?p=61 [_-_-]: /images/20211029/274a01cfbd4444eeb4e3bba3d170b58b.png [table-cell]: /images/20211029/0451ea2c8a0f4824ae5d3abea80476f0.png [Link 2]: http://www.zhangxinxu.com/study/200908/img-text-vertical-align.html [facebook_table-cell_ _-_-]: /images/20211029/b1e9cfa9390245f6bfdeac262b3e220d.png [display_table-cell_ _-_-]: /images/20211029/181fe6cf0dc64502b3fdece623afa825.png [display_table-cell_demo]: http://www.zhangxinxu.com/study/201010/table-cell-two-column-flow-layout.html [display_table-cell_ _-_- 1]: /images/20211029/788741299e8743728b132d4c09dbcdf6.png [Link 3]: http://www.zhangxinxu.com/wordpress/?p=1152 [display_table_CSS]: http://ued.alipay.com/wd/2008/10/29/%E5%9F%BA%E4%BA%8Edisplaytable%E7%9A%84css%E5%B8%83%E5%B1%80/ [table-cell_ _-_-]: /images/20211029/4a011fcf6b214d34bcc648c7a1a131c2.png [table-cell_demo]: http://www.zhangxinxu.com/study/201010/table-cell-equal-height-layout.html [_-_- 1]: /images/20211029/533dd2c309e547a4a03fa17bb8c906df.png [display_table-cell]: http://www.zhangxinxu.com/study/201010/table-cell-list-flow-layout.html [Image 1]: [-_-]: http://www.zhangxinxu.com/ [http_www.zhangxinxu.com_wordpress_p_1187]: http://www.zhangxinxu.com/wordpress/?p=1187
还没有评论,来说两句吧...