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

如何实现商品卡片左到右排列且每行5个?Flex布局样式异常求助

在线商店商品卡片布局问题解决

问题描述

开发在线商店时,需要实现每行显示5个商品卡片,当前卡片呈上下堆叠排列;使用flex布局后,卡片无法保持原有样式,多次尝试仍未解决。

问题分析

从代码片段来看,核心问题如下:

  • 未启用flex容器:HTML中的.nft卡片未被包裹在定义好的.product-card-container容器内,flex布局完全未生效。
  • 样式冲突与布局冗余:定义了.product-card样式但未实际使用,.nft自带的margin:2rem占用大量空间,导致一行无法容纳5个卡片。
  • 缺少换行机制:flex容器未设置flex-wrap: wrap,空间不足时卡片会被挤压而非自动换行。

修复方案

步骤1:包裹卡片到flex容器

将所有商品卡片放入.product-card-container中,让flex布局规则作用于卡片。

步骤2:调整容器与卡片样式

  • 给容器添加flex-wrap: wrap,实现自动换行;调整gap和justify-content优化间距与对齐方式。
  • 修改.nft的宽度与margin,确保一行能放下5个卡片,同时保留原有视觉样式。

完整代码示例

CSS代码

.product-card-container {
  display: flex;
  gap: 1rem;
  padding: 1rem;
  border: 1px solid green;
  justify-content: flex-start;
  flex-wrap: wrap; /* 关键:空间不足时自动换行 */
}

.product-card {
  display: flex;
  flex-direction: column;
  justify-content: center;
  width: 200px;
  padding: 0 0.4rem;
  row-gap: 0.5rem;
  border: 1px solid black;
}

.product-card > img {
  object-fit: cover;
  width: 100%;
  height: 200px;
}

.product-info {
  flex-grow: 1
}

.nft{
  user-select:none;
  width: calc(20% - 0.8rem); /* 计算每行5个的宽度,减去gap占用 */
  margin: 0; /* 移除冗余margin,用容器gap控制间距 */
  border: 1px solid #ffffff22;
  background-color: #282c34;
  background: linear-gradient(0deg, rgba(40,44,52,1) 0%, rgba(17,0,32,.5) 100%);
  box-shadow: 0 7px 20px 5px #00000088;
  border-radius: .7rem;
  backdrop-filter: blur(7px);
  -webkit-backdrop-filter: blur(7px);
  overflow: hidden;
  transition: .5s all;
}

.nft .wrapper li{
  display: inline-block;
  vertical-align: middle;
  margin: 10px 5px;
}

.nft hr{
  width: 100%;
  border: none;
  border-bottom: 1px solid #88888855;
  margin-top: 0;
}

.nft ins{
  text-decoration: none;
}

.nft .main{
  display: flex;
  flex-direction: column;
  width: 90%;
  padding: 1rem;
  color: #c572e6;
}

.nft .main .tokenImage{
  border-radius: .5rem;
  max-width: 100%;
  height: 250px;
  object-fit: cover;
}

.nft .main .description{
  min-height: 100px;
  max-height: 100px;
  margin: .5rem 0;
  color: #a89ec9;
}

.nft .main .tokenInfo{
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.nft .main .tokenInfo .price{
  display: flex;
  align-items: center;
  color: #ee83e5;
  font-weight: 700;
}

.nft .main .tokenInfo .price ins{
  margin-left: -.3rem;
  margin-right: .5rem;
}

.nft .main .tokenInfo .duration{
  display: flex;
  align-items: center;
  color: #a89ec9;
  margin-right: .2rem;
}

.nft .main .tokenInfo .duration ins{
  margin: .5rem;
  margin-bottom: .4rem;
}

.nft .main .creator{
  display: flex;
  align-items: center;
  margin-top: .2rem;
  margin-bottom: -.3rem;
}

.nft .main .creator ins{
  color: #a89ec9;
  text-decoration: none;
}

.nft .main .creator .wrapper{
  display: flex;
  align-items: center;
  border: 1px solid #ffffff22;
  padding: .3rem;
  margin: 0;
  margin-right: .5rem;
  border-radius: 100%;
  box-shadow: inset 0 0 0 4px #000000aa;
}

.nft .main .creator .wrapper img{
  border-radius: 100%;
  border: 1px solid #ffffff22;
  width: 2rem;
  height: 2rem;
  object-fit: cover;
  margin: 0;
}

.nft::before{
  position: fixed;
  content: "";
  box-shadow: 0 0 100px 40px #ffffff08;
  top: -10%;
  left: -100%;
  transform: rotate(-45deg);
  height: 60rem;
  transition: .7s all;
}

.nft:hover{
  border: 1px solid #ffffff44;
  box-shadow: 0 7px 50px 10px #000000aa;
  transform: scale(1.015);
  filter: brightness(1.3);
}

.nft:hover::before{
  filter: brightness(.5);
  top: -100%;
  left: 200%;
}

.bg{
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.bg h1{
  font-size: 20rem;
  filter: opacity(0.5);
}

HTML代码

<div class="product-card-container">
  <div class="nft" onclick="addProd('11', products)">
    <div class='main'>
      <img class='tokenImage' src="{{ url_for('static', filename='img/XXX.jpg') }}" alt="NFT" />
      <h2>Корзинка</h2>
      <p class='description'>XXX.</p>
    </div>
  </div>
  <div class="nft" onclick="addProd('11', products)">
    <div class='main'>
      <img class='tokenImage' src="{{ url_for('static', filename='img/XXX.jpg') }}" alt="NFT" />
      <h2>Корзинка</h2>
      <p class='description'>XXX.</p>
    </div>
  </div>
  <!-- 按需添加更多商品卡片 -->
</div>

补充说明

  • 使用calc(20% - 0.8rem)计算卡片宽度,确保每行刚好容纳5个卡片(20%*5=100%,减去4个gap的总宽度分摊到每个卡片)。
  • 保留了.nft的所有视觉效果(悬停动画、渐变背景等),仅调整布局相关属性。
  • 如需响应式适配,可通过媒体查询修改卡片宽度,例如移动端设置为width: calc(50% - 0.5rem)实现每行2个卡片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:13:11