display: table-cell知识点总结

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;
}

只不过外层的tabletable-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-rowtable-cell两个匿名元素。

2. table-cell和table-row设置margin无效

对于设置为display: table-celldisplay: table-row的元素,对其设置margin将不会产生任何作用。

3. table-row设置width无效

table-row作为tabletable-cell的中间元素,对其设置width属性将不会产生任何作用。table-row元素的宽度由内部的table-cell或外部的table决定。

4. table、table-row、table-cell之间宽度相互作用关系

由于table可以设置为table-layout: autotable-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不显式设置宽度的情况下,由于tabletable-rowtable-cell具有包裹性,所以三者的宽度等于内部content的宽度;当table-cell设置宽度时,如:

    #table-cell {
        display: table-cell;
        width: 500px;
    }
    

    tabletable-row的宽度调整为table-cell的宽度(500px),但是若设置table-cell宽度大于table外部容器container的宽度(如1200px),此时table会反过来约束table-rowtable-cell将其宽度限制为1000px(table不显式设置宽度时,其宽度不会超过外部容器宽度)。

    table显式设置宽度的情况下,无论内部的table-cell是否设置宽度,宽度是否大于table的宽度,table-rowtable-cell的实际宽度都等于table的宽度。但是有一种情况例外,即当table宽度设置为小于table-cell中文本的最小宽度时,如:

    #table {
        display: table;
        table-layout: auto;
        width: 1px;
    }
    

    此时tabletable-rowtable-cell三者的宽度并不会缩小到1px,而是会保持table-cell中文本的最小宽度:

table-cell中文本最小宽度
  • table-layout: fixed
    假设代码与table-layout: auto情况下一致,只是对table做出修改:
    #table {
        display: table;
        table-layout: fixed;
    }  
    
    table不显式设置宽度的情况下,与table-layout: auto的情况完全一致。
    table显式设置宽度的情况下,若table-cell不显式设置宽度,则tabletable-rowtable-cell三者的宽度相等,都等于table设置宽度(包括table宽度小于table-cell中文本最小宽度的情况);若table-cell显式设置宽度,当table宽度大于table-cell时,tabletable-rowtable-cell三者宽度等于table宽度;当table宽度小于table-cell时,tabletable-rowtable-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;
}

由于cell1cell2cell3cell4会被包含在浏览器默认创建的同一table-row下,则最终该table-row的高度会等于所有单元格中最高元素的高度(即100px),并统一所有单元格的高度等于该高度。

所有table-cell高度相等

6. table-layout: fixed令各table-cell宽度等分

table显式设置宽度,设置table-layoutfixedtable-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;
}

效果为:

各table-cell平分table的宽度

7. vertical-align在table-cell上的作用

vertical-align一般作用在内联元素上,主要用于内联元素间在垂直方向上的对齐。不过,vertical-align同样也可以作用于table-cell元素,目的是为了指定table-cell中的内容在垂直方向上相对于table-cell的对齐关系:

vertical-align控制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实现垂直居中

应用二:自适应两栏布局

使用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;
}

布局效果为:

table-cell实现等高布局

应用四:等宽布局

<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;
}

布局效果为:

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,722评论 1 92
  • (注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!)(注2:更多内容请查看我的目录。) ...
    love丁酥酥阅读 4,150评论 2 5
  • H5移动端知识点总结 阅读目录 移动开发基本知识点 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇阅读 4,380评论 0 26
  • 移动开发基本知识点 一.使用rem作为单位 html { font-size: 100px; } @media(m...
    横冲直撞666阅读 3,451评论 0 6
  • 高转化率文案的写作四大姿势: 姿势1:4W1H 姿势2:颠覆认知引发好奇 姿势3:关联高势能的事物和傍大款 姿势4...
    成年小饭阅读 2,058评论 0 2