我使用网格和Flexbox布局了以下元素:

<div class="container">
  <div class="inner">
    <h2>Title</h2>
    <div class="square"></div>
  </div>
  <div class="inner">
    <h2>Title</h2>
    <div class="square"></div>
  </div>
  <div class="inner">
    <h2>Title</h2>
    <div class="square"></div>
  </div>
  <div class="inner">
    <h2>Title</h2>
    <div class="square"></div>
  </div>
</div>

我希望.inner个元素被布置在一个2乘2的网格中,.square个元素保持长宽比为1.

到目前为止,我有以下几个css:

.container {
  width: 100vw;
  height: 100vh;
  background: lightblue;
  display: grid;
  grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 20px;
}
.inner {
  background: lightpink;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.square {
  background: lightgreen;
  aspect-ratio: 1;
  flex-grow: 1;
}

如果视区的宽度大于高度(例如,横向),则可以很好地执行此操作:

Working fine in landscape

但当高度大于宽度时(例如纵向),正方形会重叠:

not working in portrait

我可以通过将.inner中的align-items: center;更改为align-items: self来修复肖像的问题,但这会 destruct 风景的布局.

有没有办法让它在两种情况下都起作用?

CodePen这里:https://codepen.io/danielgibbsnz/pen/KKbWoWL(只需将窗口调整为纵向即可看到问题).


Note:理想情况下,我希望使用aspect-ratio来实现这一点,而不是求助于填充黑客(如果可能的话).

推荐答案

看起来你需要一个.square的包装纸,上面有同样的aspect-ratio: 1;:

body {
  margin: 0;
}

.container {
  width: 100vw;
  height: 100vh;
  background: blue;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}
.inner {
  background: yellow;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.square-wrapp {
  aspect-ratio: 1;
  flex: auto;
  display: flex;
  flex-direction: column;
  justify-content: center;
  max-width: 100%;
}

.square{
  background: lightgreen;
  aspect-ratio: 1;
}
<div class="container">
  <div class="inner">
    <h2>Title</h2>
    <div class="square-wrapp">
      <div class="square"></div>
    </div>
  </div>
  <div class="inner">
    <h2>Title</h2>
    <div class="square-wrapp">
      <div class="square"></div>
    </div>
  </div>
  <div class="inner">
    <h2>Title</h2>
    <div class="square-wrapp">
      <div class="square"></div>
    </div>
  </div>
  <div class="inner">
    <h2>Title</h2>
    <div class="square-wrapp">
      <div class="square"></div>
    </div>
  </div>
</div>

Css相关问答推荐

Mat-Form-字段占用更多区域,导致其他控件远离它

如何将下拉面板放置在MAT-SELECT文本框的正下方

是否可以在元素之间对齐渐变?

不明白为什么 div 不均匀并且不填满页面

Vuetify 抽屉标签溢出/z-index

为什么我的 CSS 转换在 React 18 中不起作用

如何阻止 Mud Blazor MudTable 列扩展以适合文本

为什么每次加载新页面时我的 React 侧边栏都会抖动?

每当键盘在react native 中打开时,如何使用 KeyboardAvoidingView 删除图像?

当页面大小小于VH时,Tailwind CSS如何使页脚留在底部

BootStrap:右对齐嵌套手风琴

为什么 em 不将定义的字体大小加倍?

CSS动画恢复默认

弹簧靴.一个文件捕获 CSS 其他没有

修复导航栏隐藏页面内容

将一行文本保留为单行 - 换行或不换行

twitter-bootstrap:当鼠标悬停在 -tag 中的 btn-group 上时,如何go 掉带下划线的按​​钮文本?

如何在 javascript 中获取 HTML 元素的样式值?

CSS 悬停与 JavaScript 鼠标悬停

100% 高度减go 标题?