使用aspect-ratio时如何让内容适配可视页面且无滚动条?
问题描述
我页面上有一个名为grid的组件,需要满足以下约束:
- 保持1:1的宽高比(aspect-ratio)
- 尺寸尽可能大
- 完全在视口范围内,不产生滚动条
- 最好不使用JavaScript
目前已满足1、2、4,但未满足3:
- 视口为纵向(高度>宽度)时,
grid及其子元素能正常缩小维持1:1比例 - 视口为横向时,
grid会超出视口底部,出现滚动条
现有HTML代码
<div id="wholePage" class="black"> <div>top bar placeholder</div> <div id="grid"> <div class="row darkGray"> <div class="column red"></div> <div class="column yellow"></div> </div> <div class="row lightGray"> <div class="column green"></div> <div class="column blue"></div> </div> </div> </div>
现有CSS代码
#wholePage { background-color: gray; width: 100vw; height: 100vh; display: flex; flex-direction: column; } #grid { width: auto; height: auto; flex: 0 0 auto; display: flex; flex-direction: column; aspect-ratio: 1; } .row { height: 50%; width: 100%; flex: 0 1 auto; display: flex; flex-direction: row; } .column { height: 100%; width: 100%; flex: 0 1 auto; }
解决方案
问题根源在于:横向视口下,grid的宽度会撑满父容器的可用宽度(即视口宽度),但1:1的宽高比会让它的高度等于宽度,而此时父容器wholePage的可用高度是视口高度减去顶部栏高度,这个高度通常小于grid的宽度,导致组件溢出底部。
修改CSS如下,即可满足所有约束:
#wholePage { background-color: gray; width: 100vw; height: 100vh; display: flex; flex-direction: column; margin: 0; padding: 0; box-sizing: border-box; } #grid { flex: 1 1 auto; display: flex; flex-direction: column; aspect-ratio: 1; max-width: 100%; max-height: 100%; margin: auto; } .row { height: 50%; width: 100%; display: flex; flex-direction: row; } .column { height: 100%; width: 50%; }
关键修改说明
flex: 1 1 auto:让grid占据wholePage中除顶部栏外的所有可用空间,同时允许它在空间不足时自动缩小。max-width: 100%+max-height: 100%:结合aspect-ratio:1,grid会自动选取父容器可用宽高中的较小值作为基准,维持1:1比例且不溢出。margin: auto:可选,让grid在剩余空间内水平/垂直居中,优化视觉效果。.column的width:50%:修复原代码中两列重叠的问题,实现均分布局。
修改后,无论视口方向如何,grid都会保持1:1比例、最大化尺寸且完全在视口范围内,无滚动条产生。
内容的提问来源于stack exchange,提问作者Overlord Zurg
相关产品推荐
相关产品推荐

