You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS如何实现flex项每行3个且窗口调整大小时保持1:1宽高比

实现方案

修改styles.css样式即可完成需求,核心逻辑是两点:1. 精确计算每个元素宽度保证每行刚好放下3个;2. 用CSS属性实现固定1:1宽高比。两种实现方案如下:


方案1:现代浏览器方案(推荐,写法简单)

直接用CSS原生aspect-ratio属性实现固定宽高比,兼容性覆盖Chrome 88+、Firefox 89+、Safari 15.4+等主流版本:

/* 全局统一盒模型,避免边框、内边距撑开元素宽度 */
* {
  box-sizing: border-box;
}

.App {
  font-family: sans-serif;
  text-align: center;
}

.container {
  display: flex;
  justify-content: flex-start;
  border: 1px solid orange;
  flex-wrap: wrap;
  padding: 1rem;
  /* 统一控制元素间距,避免margin的合并问题 */
  gap: 0.2rem;
}

.item {
  /* 每行3个元素,共2个间隙,单个元素宽度 = (总宽度 - 2个间隙宽度)/3 */
  flex-basis: calc((100% - 0.4rem) / 3);
  /* 禁止元素被拉伸或压缩 */
  flex-grow: 0;
  flex-shrink: 0;
  border: 1px solid grey;
  /* 直接设置宽高比为1:1 */
  aspect-ratio: 1/1;
  /* 可选:内容水平垂直居中 */
  display: flex;
  align-items: center;
  justify-content: center;
}

方案2:旧浏览器兼容方案

如果需要适配不支持aspect-ratio的旧浏览器,可以用padding百分比技巧实现:

* {
  box-sizing: border-box;
}

.App {
  font-family: sans-serif;
  text-align: center;
}

.container {
  display: flex;
  justify-content: flex-start;
  border: 1px solid orange;
  flex-wrap: wrap;
  padding: 1rem;
  gap: 0.2rem;
}

.item {
  flex-basis: calc((100% - 0.4rem) / 3);
  flex-grow: 0;
  flex-shrink: 0;
  border: 1px solid grey;
  position: relative;
  height: 0;
  /* padding-top百分比基于元素自身宽度计算,100%即高度等于宽度,实现1:1 */
  padding-top: 100%;
}

/* 元素内的内容需要单独加定位,避免被padding挤到下方 */
.item * {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

内容的提问来源于stack exchange,提问作者CCCC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:12:03