我有一个很棒的隐身要与你分享。我在尝试做一件非常简单的事情时发现了它——至少我认为它很简单。
舞台
具有固定高度值的父元素,其中包含任意数量的子元素。让我们以 div 为例,从 2 个孩子开始。
<div class="parent">
<div class="child"></div>
<div class="child"></div>
</div>
目标
设置子元素的高度和垂直边距以完全匹配父元素的高度,将总高度平均分配给子元素。该解决方案应该可用于任意数量的子元素。当然,可能需要某种计算。
问题
使用基于百分比的高度和边距不起作用。任何类似以下的解决方案...
.parent {
width: 5em; /* some fixed width */
height: 10em; /* some fixed height */
}
.child {
width: 100%;
margin-top: 4%;
height: 44%; /* let's render 3 gaps of 4% each (on top, middle and bottom) */
}
... 将无法按预期呈现,因为垂直边距 - 以及填充 - 解析的值基于父级的宽度,而不是您可能期望的父级的高度。这个 jsfiddle通过以下测试演示了这种行为:
测试 1
设置 margin-top 和 margin-bottom。孩子的身高设置为100% - @margin-top - @margin-bottom
案例A
父级的高度高于其宽度。由于提到的问题,浏览器在父级的底部呈现了一个间隙。
案例B
父母的高度等于它的宽度。浏览器按预期呈现,因为父级的宽度等于父级的高度并且边距被正确解析:
@parent-width = @parent-height
@base = @parent-width
案例C
父级的高度低于其宽度。由于上述问题,第二个孩子被剪掉了。
测试 2
这个测试用例演示了填充行为,就像测试 1 对边距所做的那样。
测试 3
表明孩子的身高是从父母的身高得到的。如果我们不尝试放置一些边距或填充,浏览器会按预期呈现所有情况。
测试 4
如果您想研究第二个问题的答案,此测试很有用- 见下文
问题
- 为什么垂直高度和填充基于父宽度而不是父高度?我在 w3c 规范上找不到任何东西。
- 达到预期目标的更好的可行解决方案是什么?