html - 为什么 CSS 百分比 (%) 高度应用于 flex 元素的孙子?
问题描述
我正在尝试检查 CSS 100% height 属性是如何工作的。但有一点我无法理解。
为什么 100% 高度在.flex-grand-child
(Chrome) 上完美运行?.flex-child
有高度属性吗?那为什么它甚至可以工作???
这是JSFiddle
html, body {
height: 100%;
}
.container {
display: flex;
flex-direction: column;
height: 100%;
}
.flex-parent {
flex: 1 0 auto;
display: flex;
}
.flex-child {
width: 300px;
}
.flex-grand-child {
height: 100%;
background-color: green;
}
<div class="container">
<div class="flex-parent">
<div class="flex-child">
<div class='flex-grand-child'></div>
</div>
</div>
</div>
解决方案
这是一种特殊情况,由于 flexbox 的拉伸效果,浏览器可以处理高度的百分比值。的flex-child
默认对齐方式等于拉伸,这相当于让height:100%
也flex-parent
用 填充其父高度flex-grow:1
。height:100%
最后,浏览器能够正确解析flex-grand-child
如果 flex 项目有
align-self: stretch
,则对其内容重做布局,将此使用的大小视为其确定的交叉大小,以便可以解决百分比大小的子项。参考
如果禁用拉伸对齐,它将中断:
html,
body {
height: 100%;
}
.container {
display: flex;
flex-direction: column;
height: 100%;
}
.flex-parent {
flex: 1 0 auto;
display: flex;
}
.flex-child {
width: 300px;
min-height: 200px;
align-self: flex-start; /*this will break it*/
border: 1px solid;
}
.flex-grand-child {
height: 100%;
background-color: green;
}
<div class="container">
<div class="flex-parent">
<div class="flex-child">
<div class='flex-grand-child'></div>
</div>
</div>
</div>
简单来说:在有拉伸效果的时候,浏览器会先根据自己的父级定义父级的高度(内容在这里不起作用),然后浏览器会做出height:100%
之前计算的高度的内容。如果不拉伸,浏览器需要考虑内容来定义父级的高度,这里我们将陷入经典的百分比高度问题。
获得更多无需在父元素上定义显式高度即可解决百分比的相关问题:为什么我的 Grid 元素的高度计算不正确?
以下是处理此问题的规范的相关部分:https ://www.w3.org/TR/css-sizing-3/#percentage-sizing
这有点复杂,但它与 CSS2 规范不同,如果未指定父高度,百分比将始终失败:
如果包含块的高度没有明确指定(即,它取决于内容高度),并且该元素不是绝对定位的,则该值计算为'auto'。
推荐阅读
- ibm-cloud - 如何将日志数据发送到 IBM Cloud 上的 Log Analysis 服务
- javascript - electron.js 打印功能,具有页面大小、dpi、布局、主进程的边距设置
- css - 如何使用 CSS 更改 Angular-UI Bootstrap Datepicker 弹出窗口的样式?
- r - 迭代器的迭代器?
- c# - .NET 二进制序列化程序是否对程序集信息进行编码?
- sql-server - SQL SERVER 中的确切月份差异
- angular - 如何将.env文件中的变量传递给angular6 environment.ts文件
- ios - Swift 4 - 将类结构的 JSON 响应嵌套到 TableViewCell 中
- javascript - 如何监听删除特定字符的javascript
- python - 计算单元格为列表的熊猫数据框的平均值