1

我想用卡片制作一个类似于电子商务的网站,我正在使用 Angular 和 MdBootstrap UI Kit。

假设我有 18 张牌,我想要 4 行 4 张牌,最后一行应该有 2 张牌。我的卡片数据来自 json 格式的后端。

但我得到了这个输出。

使用当前代码

我想要的是这个。

想要达到这个

我目前拥有的代码

html:-

<div class="container">
  <div class="row" *ngFor='let row of grid'>
    <div class="col" *ngFor='let c of row'>
      <div style="margin: 10px">
        <mdb-card>
          <!--Card image-->
          <mdb-card-img src="https://mdbootstrap.com/img/Photos/Lightbox/Thumbnail/img%20(97).jpg" alt="Card image cap"></mdb-card-img>
          <!--Card content-->
          <mdb-card-body>

            <!--Title-->
            <mdb-card-title>
              <h4>{{c}}</h4>
            </mdb-card-title>

            <!--Text-->
            <mdb-card-text> Some quick example text to build on the card title and make up the bulk of the card's
              content.
            </mdb-card-text>

            <a href="#" mdbBtn color="primary" mdbWavesEffect>Button</a>
          </mdb-card-body>
        </mdb-card>
      </div>
    </div>
  </div>
</div>

ts:-

export class HomeComponent implements OnInit {
  cards: number;
  grid: number[][];
  constructor() {}

  ngOnInit() {
    this.cards = 18;
    this.gridgenerator();
  }

  gridgenerator(): number[][] {
    let last = this.cards % 4;
    let rows =
      this.cards % 4 === 0
        ? new Array(Math.floor(this.cards / 4))
        : new Array(Math.floor(this.cards / 4 + 1));
    this.grid = new Array(rows);
    for (let r = 0; r < rows.length; r++) {
      if (r === rows.length - 1) {
        this.grid[r] = new Array(last);
      } else {
        this.grid[r] = new Array(4);
      }
    }
    console.log(this.grid);

    return this.grid;
  }
}
4

2 回答 2

1

为了让您的代码正常工作,您需要定义每张卡片的宽度,而不仅仅是边距。

定义 no width 允许 adiv根据它在块级别占用整个可用空间,这就是最后两张卡发生的情况。只要有机会,它就会扩大,因为它的孩子需要空间。

使用display: flex;flex-wrap: wrap;以及卡的确定宽度将为您提供所需的结果。您可能需要设置justify-content以满足您的要求。

现在,鉴于您的屏幕尺寸与卡片大小的比率可能会有所不同,因此很难使用 flex 将四张(或 n)张卡片连续保留,但您可以在所有卡片上设置一个具有计算宽度的父级,以确保存在一次只能有4个孩子。

我在这里做了一个小提琴供你检查。尝试扩展结果窗口并重新运行以查看我在说什么)。

在这里查看以供参考。

于 2019-06-17T09:00:55.363 回答
0

这是一个工作角度示例,仅使用 flex 属性。

宿主元素是一个弹性容器,并具有以下 css 属性:

:host {
  display: flex;
  flex-wrap: wrap;
}

而 mdb-card 是具有以下属性的弹性项目:

mdb-card {
  margin: 10px;
  flex-basis: calc(25% - 2 * 10px); // 25% minus left and right margins.
}

不需要 .row 和 .col 元素。

于 2019-06-17T10:12:24.730 回答