从理论上讲,vertical-align
应该在带有display:table-cell
. 如果你添加一个包装器,它总是有效的display:table
。但是当它没有包装器时,有时它会起作用,有时垂直对齐会被完全忽略,这似乎是随机的。您能否解释一下table-cell
支持垂直对齐的要求是什么。
1 回答
这有点投机,但在没有任何例子的情况下,我将在黑暗中试一试。也许你的意思是这样的:
<!DOCTYPE html>
<title>Test case</title>
<style>
.wrapper { height: 80px; width:100%; }
.percentage .wrapper { border: 1px solid red; }
.fixed .wrapper { border: 1px solid blue; }
.height-cells-test { margin-bottom: 20px; }
.as-block { display: block; }
.as-table { display: table; }
.cell { display:table-cell; vertical-align:middle; }
.percentage .cell { height: 100%; }
.fixed .cell { height: 80px; }
</style>
<div class="percentage height-cells-test">
<div class="wrapper as-block">
<div class="cell">
test percentage height of cell in block
</div>
</div>
<div class="wrapper as-table">
<div class="cell">
test percentage height of cell in table
</div>
</div>
</div>
<div class="fixed height-cells-test">
<div class="wrapper as-block">
<div class="cell">
test fixed height of cell in block
</div>
</div>
<div class="wrapper as-table">
<div class="cell">
test fixed height of cell in table
</div>
</div>
</div>
如果您在jsfiddle中查看这一点,您会看到四个.wrapper
块中的那个,第二个、第三个和第四个块的文本垂直居中,第一个块中的文本显示在顶部。
这种情况是在display:block
容器中使用单元格的百分比高度时。
要了解为什么会发生这种情况,请参阅CSS 2.1 规范中的这段文字:
HTML 以外的文档语言可能不包含 CSS 2.1 表格模型中的所有元素。在这些情况下,必须假设“缺失”元素才能使表模型正常工作。任何表格元素都会在其自身周围自动生成必要的匿名表格对象,由至少三个嵌套对象组成,分别对应一个 'table'/'inline-table' 元素、一个 'table-row' 元素和一个 'table-cell' 元素. 缺少元素会生成匿名对象...
这有点误导,因为它首先谈论将 CSS 与 HTML 以外的语言一起使用,但它的意思是使用 css 表格样式而不使用<table>, <tr>, <td>
etc。所以它在这里也适用于display:table-cell
正在使用的地方。
该规范继续提供有关如何创建这些匿名对象的详细规则(此处未复制)。结果是在块包装器内的表格单元的情况下,在表格单元周围生成了一个匿名表格和一个匿名表格行。
我们可以忽略匿名表行,因为这不会影响这里的情况。
匿名表很重要。这个对象有它自己的高度,作为一个表格只是它的内容需要的高度。当 table-cell 被告知为 100% 高度时,这意味着匿名表的 100% 高度,而不是 100% 的高度.wrapper
。
所以表格很小,放在 的左上角,.wrapper
表格单元位于其中。垂直对齐仍在发生,但在一个不比文本大的框内,因此文本无处可去。
当.wrapper
块的样式为 时display:table
,不需要匿名表对象,也不会生成一个。所以表格单元格与 ' 一样高,.wrapper
并且vertical-align:middle
可以在整个空间中生效。