响应式瀑布流布局Waterfall Flow Layout
瀑布流是一种流行的网页布局。这种效果的名称取自瀑布,悬挂在高处并自顶向下流淌,就像这种布局的视觉效果一样。瀑布流布局将元素按照垂直方向排列,以达到优化页面空间的效果,通常很受图片-heavy 网站的欢迎。
原理:对每个 item 都使用绝对定位,left 和 top 都是 0, 最后根据容器大小、item 的高度通过计算来得到 item 的 transform 值
初始化结构
我们先搭建一个简单的结构,然后为 container 设置一个 ref,在 useEffect
中获取所有 item 元素,并将其保存到 items
数组中。
监听窗口大小变化
由于我们需要监听窗口大小变化,所以我们可以使用 ResizeObserver
监听容器的大小变化。
主要逻辑在 handleResize
函数中。
计算 item 的 transform 值 和 item 的宽度
- 首先我们可以获取容器的宽度,然后根据宽度来计算每一行放置多少 item,并计算每一个 item 的宽度。
- 创建一个 columnsHeights 数组用来保存每一列的高度,初始化为 0。
- 遍历所有 item,根据 item 的宽度来计算 item 的 transform 值,同时更新 columnHeights 的值。
完整代码
总结
瀑布流布局主要就是需要计算每行最小高度,然后根据最小高度来计算每个 item 的位置。 使用 transform 控制每个 item 的位置可以避免不必要的重排。