「移动端实战」Vue3+Vant4仿小红书 瀑布流布局+图片懒加载+滑动交互
·

以下是基于Vue3+Vant4实现小红书风格瀑布流布局、图片懒加载及滑动交互的实战方案:
瀑布流布局实现
核心思路:使用CSS Grid或Flexbox结合动态计算高度
代码示例:
<template>
<div class="waterfall-container">
<div
v-for="(item, index) in list"
:key="index"
class="waterfall-item"
:style="{ height: item.height + 'px' }"
>
<img v-lazy="item.imgUrl" />
</div>
</div>
</template>
<style>
.waterfall-container {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px;
padding: 12px;
}
</style>
动态计算要点:
- 通过
ResizeObserver监听容器宽度变化 - 根据图片原始宽高比例动态计算显示高度
- 使用
column-count实现多列布局时需要处理内容断裂问题
图片懒加载方案
Vant4组件:
<van-image
lazy-load
:src="item.imgUrl"
width="100%"
height="auto"
/>
自定义实现:
- 安装
@vueuse/core利用useIntersectionObserver - 设置占位图及错误处理
const { stop } = useIntersectionObserver(
target,
([{ isIntersecting }]) => {
if (isIntersecting) {
loadImage()
stop()
}
},
{ threshold: 0.1 }
)
滑动交互优化
下拉刷新:
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<!-- 瀑布流内容 -->
</van-pull-refresh>
无限滚动:
useIntersectionObserver(
loadMoreElement,
([{ isIntersecting }]) => {
if (isIntersecting && !loading.value) {
loadMore()
}
}
)
触摸反馈:
.waterfall-item:active {
transform: scale(0.98);
transition: transform 0.1s;
}
性能优化技巧
- 使用
<picture>标签配合不同分辨率图片源 - 对滚动事件添加
throttle节流控制 - 虚拟滚动方案适用于超长列表
- 图片预加载关键视图区域内容
注意事项
- 瀑布流布局需处理iOS的回弹效果兼容性问题
- 图片懒加载需要设置最小高度避免布局抖动
- 滑动交互建议使用
passive事件提高流畅度 - 生产环境需配置CDN加速图片加载
完整项目可参考GitHub上的开源实现,搜索关键词vue3 vant4 waterfall demo获取具体案例代码。
更多推荐
所有评论(0)