自动填充和调整给定容器中的卡片

Auto fill and adjust cards in given container

我有很多 Angular 垫卡,即不确定数量的带有不同尺寸图像的卡片。

我正在尝试实现的是根据容器自动填充和调整此类卡片,例如 this

现在上面的例子使用了 4 列并且可以使用网格。

现在,我该如何用卡片实现它?我尝试使用 flex 但不知何故无法正确实现它。这是我毫无价值的尝试。

<div class="mat-card-container" style="
display: flex;
justify-content: center;    /* Add this */
flex-wrap: wrap;

">
<div class="mat-card-holder" style="
margin:0.6em;
width:220px;
" *ngFor="let art of arts.records">
    <mat-card class="art-card" >
      <mat-card-header>
        <mat-card-title>{{ art.TITLE }}</mat-card-title>
        <mat-card-subtitle>{{ art.AUTHOR }}</mat-card-subtitle>
      </mat-card-header>
      <img mat-card-image src="http://localhost/piwigo/{{ art.URL }}" alt="Photo of a Shiba Inu">
      <mat-card-content>
          {{art.TECHNIQUE}} / {{art.SCHOOL}} / {{art.FORM}} / {{art.TYPE}} / {{art.LOCATION}}
      </mat-card-content>
    </mat-card>
</div>
</div>

这给了我这么多,但仍有很多空白需要弥补。

这只是将它们按列排列,如何在容器中动态填充和调整它们?假设如果容器大小发生变化,卡片应该重新排列而不改变它们自己的 css 即尺寸。我的代码正确吗?我该如何填补两者之间的空白?

据我所知,您要实现的这种布局样式无法通过 css 本身实现。

在 javascript helper library, this is easily implemented. As you are using Angular, this is 的一些帮助下,Angular 对先前库的包装器将允许进行这样的设计。

从我的 phone 回复并且无法真正重现您的确切 ui,但在此处逐字复制他们的示例实现,

App.module.ts

import { MasonryModule } from '@thisissoon/angular-masonry';

const masonryProviders = [
  { provide: Masonry, useFactory: () => window['Masonry'] },
];

@NgModule({
  imports: [MasonryModule.forRoot(masonryProviders)],
})
export class AppModule {}

angular.json

"scripts": [
  "../node_modules/masonry-layout/dist/masonry.pkgd.js"
],

app.component.ts

export class AppComponent implements AfterViewInit, OnDestroy {
  @ViewChild('grid') public grid: ElementRef;

  public masonryInstance: MasonryInstance;

  public cards = cards;

  constructor(@Inject(Masonry) public masonry) {}

  ngAfterViewInit() {
    const options: MasonryOptions = {
      itemSelector: '.card',
      columnWidth: '.card',
      gutter: 20,
      fitWidth: true,
    };
    this.masonryInstance = new this.masonry(this.grid.nativeElement, options);
  }

  layout() {
    this.masonryInstance.layout();
  }

  ngOnDestroy() {
    this.masonryInstance.destroy();
  }
}

app.component.css

:host {
  display: block;
  margin-top: 1rem;
}

.grid {
  margin: 0 auto;
}

.card {
  display: inline-block;
  margin-bottom: 1rem;
  width: 18rem;
}

app.component.html

<div class="grid" #grid>
  <div class="card" *ngFor="let card of cards">
    <div class="card-body">
      <h5 class="card-title">{{ card.title }}</h5>
      <p class="card-text">{{ card.text }}</p>
      <a href="#" class="btn btn-primary">Go somewhere</a>
    </div>
  </div>
</div>