如何解决min-height在flex布局中的失效问题
「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
问题复现
首先来看一段简单的网页代码,使用min-height
控制A区域的最小高度为父节点的50%。
1 | ... |
其相关样式表代码如下:
1 | <style> |
期待效果图如下图,希望通过min-height
使得A至少占满50%的空间。
然而,实际效果图却是下图这样:
为什么A区域的min-height
没有如我们所愿呢?
查找问题
我们试图通过查看min-height
的定义来定位问题。
在CSS官方文档中,我们查找到min-height
的定义与解释,其中提到,当其取值为百分比时,其高度是根据父节点(准确的说是包含块)的高度计算的,如果没有明确指定包含块的高度,并且该元素不是绝对定位的,其高度将取决于内容高度。
原文如下:
<percentage>
Specifies a percentage for determining the used value. The percentage is calculated with respect to the height of the generated box’s containing block. If the height of the containing block is not specified explicitly (i.e., it depends on content height), and this element is not absolutely positioned, the percentage value is treated as 0 (for min-height) or none (for max-height).
换句话说,当父节点的height
未设置,而min-height
为百分比取值时,其没有可依赖计算的基础值,因此无法计算其高度。此时按照CSS规范,元素的高度将由内部元素来决定。当 min-height
大于 max-height
或 height
时,元素的高度会设置为 min-height
的值。
解决问题
1. 给父节点设置height
我们给父节点parent
设置height:1px
即可。关于height
与min-height
、max-height
的优先级,我们文章最后再说。
1 | .parent { |
2. 给父节点外再加一层,并设置最外层display:flex
这一点我不知道原因,只是在查找过程中发现,这样也可以解决问题,所以列在此处,请读者指点。
一个可参考的文章:Normalizing Cross-browser Flexbox Bugs
如果发现节点的宽度也受到影响,增加width
相关设置调整即可。
1 | .body { |
3. 设置为绝对布局:absolute
这一点是根据定义来的,当元素为绝对定位时,百分比的设置min-height
也可以生效。(若影响了width
,添加相关属性)
虽然这种方式可以解决min-height
的问题,但是引入绝对布局,无疑会将页面变复杂。不可取!
1 | .parent { |
优先级
height
与min-height
, max-height
的优先级可以通过简单的代码来测试,结果表明:当height
<min-height
或者 max-height
< min-height
时,其高度的实际取值为min-height
。