1 звезда на GitHub = 1 новый компонент.

Поставить звезду
Макеты и Сетки layoutmasonrycolumns

Masonry Layout

Сетка в стиле Masonry для размещения карточек разной высоты без разрывов.

Живое превью

Masonry Layout

Использование

Скопируйте и вставьте этот код на вашу страницу Astro:

astro
---
import { MasonryLayout } from 'astro-component-kit';
---

<MasonryGrid>Content</MasonryGrid>
--- import { MasonryLayout } from 'astro-component-kit'; --- <MasonryGrid>Content</MasonryGrid>

Ручная установка

Если вы не используете пакет npm, создайте файл и вставьте следующий код: src/components/lib/MasonryLayout.astro:

astro
---
/**
 * MasonryGrid — A CSS-based masonry layout for items of varying heights.
 */
interface Props {
  columns?: number;
  gap?: string;
  className?: string;
}

const { columns = 3, gap = '1.5rem', className = '' } = Astro.props;
---

<div class={`masonry ${className}`} style={`--cols: ${columns}; --gap: ${gap};`}>
  <slot>
    <div class="masonry-demo-item" style="height: 120px;">Item 1 (Small)</div>
    <div class="masonry-demo-item" style="height: 200px;">Item 2 (Tall)</div>
    <div class="masonry-demo-item" style="height: 160px;">Item 3 (Medium)</div>
    <div class="masonry-demo-item" style="height: 140px;">Item 4 (Medium)</div>
    <div class="masonry-demo-item" style="height: 180px;">Item 5 (Tall)</div>
    <div class="masonry-demo-item" style="height: 110px;">Item 6 (Small)</div>
  </slot>
</div>

<style>
  .masonry {
    columns: var(--cols, 3) 220px;
    column-gap: var(--gap, 1.5rem);
    width: 100%;
  }
  .masonry :global(> *) {
    break-inside: avoid;
    margin-bottom: var(--gap, 1.5rem);
    display: block;
  }
  .masonry-demo-item {
    background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
    border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
    border-radius: var(--r-md, 12px);
    display: flex;
    align-items: center;
    justify-content: center;
    color: #94a3b8;
    font-weight: 600;
  }
</style>
--- /** * MasonryGrid — A CSS-based masonry layout for items of varying heights. */ interface Props { columns?: number; gap?: string; className?: string; } const { columns = 3, gap = '1.5rem', className = '' } = Astro.props; --- <div class={`masonry ${className}`} style={`--cols: ${columns}; --gap: ${gap};`}> <slot> <div class="masonry-demo-item" style="height: 120px;">Item 1 (Small)</div> <div class="masonry-demo-item" style="height: 200px;">Item 2 (Tall)</div> <div class="masonry-demo-item" style="height: 160px;">Item 3 (Medium)</div> <div class="masonry-demo-item" style="height: 140px;">Item 4 (Medium)</div> <div class="masonry-demo-item" style="height: 180px;">Item 5 (Tall)</div> <div class="masonry-demo-item" style="height: 110px;">Item 6 (Small)</div> </slot> </div> <style> .masonry { columns: var(--cols, 3) 220px; column-gap: var(--gap, 1.5rem); width: 100%; } .masonry :global(> *) { break-inside: avoid; margin-bottom: var(--gap, 1.5rem); display: block; } .masonry-demo-item { background: rgb(var(--ink-rgb, 255 255 255) / 0.04); border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08); border-radius: var(--r-md, 12px); display: flex; align-items: center; justify-content: center; color: #94a3b8; font-weight: 600; } </style>

Краткая информация

Категория
Макеты и Сетки
Имя файла
MasonryLayout.astro
Зависимости
Нет — чистый Astro + CSS
Теги
layoutmasonrycolumns