跳转到内容

Masonry 瀑布流

将等宽、不等高的内容排列为瀑布流。

用法

按最短列排列卡片

组件结构

加粗的是必需部件。

data-scope="masonry"root · column · item

示例

响应式列

根据容器宽度调整列数

间距

设置列与项目之间的间距

sm
lg

顺序排列

按文档顺序逐列填充

设计指引

何时使用

  • 展示图片墙、卡片流或长短不一的摘要。
  • 希望内容按最短列排列并减少空白。

何时不用

特性

  • 默认按最短列排列,也支持按顺序逐列填充。
  • 支持固定列数和响应式列数。
  • 支持五档行列间距。

组合

最佳实践

  • 图片应提供宽高或宽高比,减少加载后的重排。
  • 避免在会重排的项目中放置不可恢复的交互状态。
  • Web Components 需按最大列数提供空的 column 节点。

反模式

  • 不要用 CSS 多栏替代瀑布流布局。
  • 不要对有严格顺序的内容使用最短列策略。
  • 不要用项目外边距代替 gap

API 参考

产物

自定义元素<xh-masonry>
Vue 组件XhMasonry
状态机无,connect 直接由 props 算属性
皮肤@xihan-ui/styles/masonry.css

Props

属性类型必填说明
columnsMasonryColumns列数,未提供时按三列。也接受断点对象 { base, sm, md, lg, xl },逐档写各自的列数, 未写的档沿用更窄的一档。换档依据容器自身的宽度,不是视口宽度。
gapMasonryGap列与列、项与项之间的间距档位:xs / sm / md / lg / xl,未提供时不留间距。档位对应的数值由皮肤决定。
sequentialboolean按文档序逐列填充:项分段落入各列,阅读顺序仍是先走完左列,再走下一列。 未提供时最短列优先,视觉上更齐平,但相邻的两项未必相邻。

connect API

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
getRootProps() => T['element']
getColumnProps(props: MasonryColumnProps) => T['element']
getItemProps(props: MasonryItemProps) => T['element']

无障碍

键盘

规格出处:W3C APG

无键盘交互(不接收焦点,或焦点行为完全由原生元素提供)。

  • 最短列策略会改变 DOM 顺序。
  • 顺序有意义的内容使用 sequential
  • 需要稳定焦点顺序时使用栅格

样式参考

皮肤

@xihan-ui/styles/masonry.css 使用 [data-scope="masonry"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides

数据属性

connect 生成;条件不成立时不输出无值属性。

部件属性
rootdata-gapprops.gap
rootdata-sequential''(条件成立时才出现)
columndata-indexString(column.index)
itemdata-columnString(item.column)
itemdata-indexString(item.index)

CSS 变量

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-masonry-gapcolumn
root
gapdefault
gap=lg
gap=md
gap=sm
gap=xl
gap=xs
--xh-layout-gap-lg
--xh-layout-gap-md
--xh-layout-gap-sm
--xh-layout-gap-xl
--xh-layout-gap-xs
--xh-space-0
masonry 的 column、root 部件 gap 覆盖槽。

动效

本组件皮肤不含过渡与关键帧,也没有脚本驱动的动效:状态一变,外观立即到位。

响应式

  • 响应式列数根据容器宽度计算。
  • 内容或容器尺寸变化后自动重新排列。

RTL

  • 列顺序和间距自动适配 RTL。

Released under The MIT License