Моя задача:
Я хочу иметь сетку с фиксированным количеством столбцов (которое позже можно настроить с помощью javascript) и гибким количеством строк равной высоты.
Количество строк определяется количеством элементов сетки, которые являются UI карточками.
Эти карточки должны заполнять всю высоту соответствующих ячеек, но ДОЛЖНЫ не увеличивает высоту строки. Итак, в основном max-height = row-height assigned by grid
Тогда внутри этих карт у нас есть три типичные части: верхний колонтитул, основной текст и нижний колонтитул. Тело ДОЛЖНО иметь возможность прокрутки, если существует больше элементов списка, чем позволяет высота строки.
Я пытался реализовать это в stackblitz
https://stackblitz.com/edit/angular-3gkmtm
Чего я не понимаю, так это:
- Почему карты "растягивают" строку, когда появляется больше элементов
- Как создать секцию тела с возможностью прокрутки без использования вручную фиксированной высоты (как в примере я использую max-height)
- Почему при наличии более 3 строк переполняется
Пожалуйста, помогите!
<article>
<section>
<h2>Fixed Gird with scrollable cards</h2>
</section>
<section>
<button (click)="onAdd()">Add</button>
<button (click)="onRemove()">Remove</button>
</section>
<section class="remaining-height">
<div class="grid-container">
<div class="grid-item" *ngFor="let card of cards">
<div class="card">
<div class="card-header">Card #{{card}}</div>
<div class="card-body card-flexible-scroll">
<div class="list-item" *ngFor="let item of list">{{item}}</div>
</div>
<div class="card-footer">
Some Footer
</div>
</div>
</div>
</div>
</section>
</article>
article{
display: flex;
flex-direction: column;
height: 100%;
}
.remaining-height{
flex:1
}
.grid-container {
display: grid;
grid-gap: 0.5rem;
height: 100%;
grid-auto-rows: auto;
grid-template-columns: repeat(5, auto);
}
.grid-item{
display: flex;
padding:24px;
}
.card{
display: flex;
flex-direction: column;
width: 100%;
height:100%;
background:#ccc;
}
.card-body{
.list-item{
padding: 6px;
background:#fcd3d3;
}
.list-item:nth-child(even){
background:#efefef;
}
}
.card-flexible-scroll{
flex:1;
overflow-y:auto;
max-height: 300px; // <= no max height
}
Angular Controller to generate cards and list items
```js
export class AppComponent {
name = "Angular";
cards = new Array(8).fill(0).map((_,idx)=>idx+1);
list = new Array(30).fill(0).map((_,idx)=>idx+1);
onAdd() {
this.cards.push(this.cards.length + 1);
}
onRemove() {
this.cards.pop();
}
}
глобальный стиль
html , body{
height: 100vh;
overflow: hidden;
}