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

如何通过媒体查询实现列表每行显示多个JSON数据项

解决React列表项自适应每行数量的布局问题

嘿,我看到你在搭建运动员列表网站时遇到了布局困扰:明明调整了.Athletes的宽度,却还是只能每行显示一个列表项。其实问题很简单——你的列表项容器和列表项都是默认的块级元素,块级元素会自动独占一行,不管你设置多少宽度都没用。下面给你几个实用的解决方案,轻松实现每行1-4个项的自适应布局:

方案一:Flexbox布局(最推荐,灵活易维护)

Flexbox是现代布局的首选,它能轻松实现自动换行和自适应宽度。你只需要给列表的父容器添加Flex属性,再调整列表项的弹性参数即可:

1. 修改列表组件,给父容器加类名

export function AthleteList({athletes}) {
  let athl = athletes.map((athlete, i) => {
    return <Athlete key={athlete.ID} {...athlete}/>;
  });
  // 给父容器添加类名,方便设置Flex布局
  return <div className="athlete-list">{athl}</div>
}

2. 调整CSS样式,添加Flex布局和媒体查询

/* 父容器设置Flex布局,允许换行 */
.athlete-list {
  display: flex;
  flex-wrap: wrap;
  gap: 20px; /* 列表项之间的间距,比margin更整洁 */
  padding: 0 10px; /* 避免边缘项贴紧屏幕 */
}

/* 列表项设置弹性属性,实现自适应 */
.Athletes{
  flex: 1 1 22%; /* 基础宽度22%,允许放大/缩小,刚好适配4个一行 */
  min-width: 250px; /* 最小宽度,屏幕窄到这个值时自动换行成1个一行 */
  height: auto; /* 建议用auto,让高度随内容自适应,比固定15%更合理 */
  background-color: grey;
  border-style: groove;
  padding: 10px; /* 加内边距,内容不会贴边 */
  /* 保留你需要的对齐样式 */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  margin-bottom: 0; /* 用gap代替margin-bottom,避免重复间距 */
}

/* 媒体查询精细控制不同屏幕的每行数量 */
@media (max-width: 1024px) {
  .Athletes {
    flex: 1 1 30%; /* 中等屏幕每行3个 */
  }
}

@media (max-width: 768px) {
  .Athletes {
    flex: 1 1 45%; /* 平板屏幕每行2个 */
  }
}

@media (max-width: 480px) {
  .Athletes {
    flex: 1 1 100%; /* 手机屏幕每行1个 */
  }
}

方案二:CSS Grid布局(简洁高效)

如果你更喜欢网格布局,Grid也是个不错的选择,代码更简洁:

调整父容器CSS即可

.athlete-list {
  display: grid;
  /* 自动填充列,每列最小250px,最大占满剩余空间 */
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 20px;
  padding: 0 10px;
}

/* 列表项样式可以简化,不需要设置宽度 */
.Athletes{
  height: auto;
  background-color: grey;
  border-style: groove;
  padding: 10px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

/* 可选:大屏幕强制4列 */
@media (min-width: 1200px) {
  .athlete-list {
    grid-template-columns: repeat(4, 1fr);
  }
}

为什么之前的方法没用?

原来的.Athletes是块级元素(默认display: block),每个块级元素都会自动独占一行,哪怕你设置了width:15%也不会和其他块级元素并排。只有把它们改成inline-block,或者用Flex/Grid这样的布局系统来管理排列,才能实现多行显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:15:20