相册 瀑布流 uniapp
时间: 2025-02-25 14:59:09 浏览: 36
### 实现 UniApp 中的相册瀑布流布局
为了实现在 UniApp 中创建一个相册瀑布流布局,需考虑不同设备间的兼容性和性能优化。下面提供了一个基于 `uni-app` 的实现方案[^1]。
#### 使用 Flex 布局构建基础结构
通过 CSS 的 flexbox 来管理列之间的间距以及子项排列方式:
```css
.waterfall-container {
display: flex;
justify-content: space-between; /* 平均分配剩余空间 */
}
.column {
width: calc((100% - 2 * var(--gap)) / 3); /* 计算每栏宽度 */
}
```
这里假设页面分为三栏显示照片,可以根据实际需求调整分隔符大小 (`--gap`) 和栏目数量。
#### 动态加载图片并处理尺寸差异
对于每一项图片元素,应该能够根据其原始比例自动调整高度来保持视觉上的连续性:
```html
<template>
<view class="waterfall-container">
<!-- 循环渲染图片 -->
<block v-for="(item, index) in images" :key="index">
<view :class="'column column-' + (index % 3)">
<image mode="widthFix" lazy-load @load="onImageLoad(item)" />
</view>
</block>
</view>
</template>
<script>
export default {
data() {
return {
images: [], // 图片数组
};
},
methods: {
onImageLoad(imageItem) {
const query = uni.createSelectorQuery().in(this);
query.select(`.column-${this.images.indexOf(imageItem)} image`)
.fields({ size: true }, res => {
if (!res || !res.width || !res.height) return;
this.$set(
this.images[this.images.indexOf(imageItem)],
'height',
`${Math.floor(res.height * 0.8)}px`
);
}).exec();
}
},
onLoad(options){
// 模拟异步获取图片资源
setTimeout(() => {
let tempImages = Array.from({ length: 60 })
.map(_=>({
src:`https://via.placeholder.com/${Math.random()*700+300}x${Math.random()*900+400}`,
height:'auto'
}));
this.images=[...tempImages];
},500);
}
};
</script>
```
上述代码片段展示了如何监听单个 `<image>` 组件完成加载后的回调函数,在其中查询该节点的实际尺寸,并据此设定最终的高度属性以确保良好的用户体验。
#### 支持触底懒加载和其他特性
当滚动到底部时触发新的数据请求,从而逐步增加可见的内容量而不一次性加载过多的数据。这可以通过监测窗口位置变化或利用框架自带的方法如 `onReachBottom()` 完成。
此外还可以加入缓存机制防止重复下载相同的文件;采用 WebP 格式提高压缩率降低带宽消耗等措施进一步提升效率。
阅读全文
相关推荐

















