Bootstrap 如何按列而不是按行对卡片分组

xuo3flqw  于 2022-12-07  发布在  Bootstrap
关注(0)|答案(1)|浏览(143)

我的代码如下:

<div className="row">
  {data.map(datum => <Card field={datum.field} />)}
</div>

其中,CardclassName="col-lg-3"的可变高度组件。这会使卡片行在较短的卡片下带有空白,以便下一行垂直对齐:

Aaa|Bbb|Ccc
aaa|   |ccc
   |   |ccc
Ddd|Eee|Fff
ddd|eee|   
...

我想删除空格。如何删除?上面的内容应该如下所示:

Aaa|Bbb|Ccc
aaa|Eee|ccc
Ddd|eee|ccc
...

我可以写上

div className="row">
  <div className="col-lg-3">
    {data1.map(datum => <Card field={datum.field} />) /* where data1 is the first quarter of data */}
  </div>
  {/* same for the remaining data */}

......但这看起来很糟糕。除此之外,我还想让卡片保持与data相同的顺序,从上到下排序;从这里很难做到。有更干净的解决方案吗?
CodeSandbox demo

xsuvu9jc

xsuvu9jc1#

如果你想要的只是一个数量上均匀的列分布(不考虑最终的列高度),你可以修改你的循环来实现这一点。如果你想让卡片适合一个最小高度的网格,这就变成了一个"砖石"问题,而且变得更加复杂。
首先确定每个基准面所属的列:

const getCol = (index) => {
  // add 3 to allow division by 3 and get the remainder
  // add 1 to make column number more intuitive in the markup
  return ((index + 3) % 3) + 1;
};

然后在循环中检查:

<div className="row">
    <div className='col'>
        {data.map((datum, i) => (
            <>
                {getCol(i) === 1 &&
                    <Card field={datum.field}/>
                }
            </>
        ))}
    </div>

    <div className='col'>
        {data.map((datum, i) => (
            <>
                {getCol(i) === 2 &&
                    <Card field={datum.field}/>
                }
            </>
        ))}
    </div>

    <div className='col'>
        {data.map((datum, i) => (
            <>
                {getCol(i) === 3 &&
                    <Card field={datum.field}/>
                }
            </>
        ))}
    </div>
</div>

CodeSandbox demo
当然,您可以预先分割数组,并在其各自的列中渲染各个子数组。

相关问题