diff --git a/web/src/lib/components/photo/PhotoGrid.svelte b/web/src/lib/components/photo/PhotoGrid.svelte index 5b3c181..0b182e3 100644 --- a/web/src/lib/components/photo/PhotoGrid.svelte +++ b/web/src/lib/components/photo/PhotoGrid.svelte @@ -1,4 +1,5 @@ {#if photos.length === 0 && !hasMore} {:else}
- {#key waterfall + '_' + borderLess} -
- {#each getVisiblePhotos() as photo, i (photo.id)} - - {/each} -
+ {#key waterfall + '_' + borderLess + '_' + columnCount} + {#if waterfall} +
+ {#each splitToColumns(getVisiblePhotos(), columnCount) as col} +
+ {#each col as photo (photo.id)} + + {/each} +
+ {/each} +
+ {:else} +
+ {#each getVisiblePhotos() as photo, i (photo.id)} + + {/each} +
+ {/if} {/key} {#if isLoading} @@ -103,22 +169,35 @@ gap: 0; } - /* 瀑布流布局 */ + /* 瀑布流布局:Flex 列分栏 */ .photo-grid-waterfall { - display: block; - column-count: 3; - column-gap: var(--space-md); + display: flex; + gap: var(--space-md); + padding-bottom: var(--space-xl); } - /* 瀑布流 + 紧凑:无间距 */ .photo-grid-waterfall.photo-grid-borderless { - column-gap: 0; + gap: 0; } - @media (max-width: 768px) { - .photo-grid-waterfall { - column-count: 2; - } + .waterfall-column { + flex: 1; + display: flex; + flex-direction: column; + min-width: 0; + } + + .photo-grid-waterfall .waterfall-column > :global(.photo-card) { + break-inside: avoid; + margin-bottom: var(--space-md); + } + + .photo-grid-waterfall .waterfall-column > :global(.photo-card):last-child { + margin-bottom: 0; + } + + .photo-grid-waterfall.photo-grid-borderless .waterfall-column > :global(.photo-card) { + margin-bottom: 0; } @media (min-width: 768px) { @@ -127,12 +206,6 @@ } } - @media (min-width: 1200px) { - .photo-grid-waterfall { - column-count: 4; - } - } - .load-more-trigger, .loading-trigger { text-align: center;