uniapp瀑布流最简单的实现方法

一、效果

二、代码

        下列代码复制粘贴直接可以用,注意图片高度不要写死,image的mode应为widthFix,这是为了让图片高度自己撑开,LazyListItem组件为自己的业务代码,方案实现原理为css3的分栏布局

<template>
	<view class="layout_lazy">
		<LazyListItem v-for="item , index in mockData" :key="index" :item></LazyListItem>
	</view>
</template>

<script setup lang="ts">
	import { ref } from 'vue';
	import LazyListItem from './LazyListItem.vue';
	const mockData = ref([
		'https://img2.baidu.com/it/u=3409103166,1174784345&fm=253&app=138&f=JPEG?w=800&h=1734',
		'https://img.155175.com/d/file/shouyou/ico/20201227/wga5wgsnd4r.jpg',
		'https://inews.gtimg.com/om_bt/Ojy0PdDIWWXRTAMh2QjsiumDZh-D1x7qCkDSmoaaX6INAAA/641',
		'https://img1.baidu.com/it/u=2991172543,3576519688&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=734',
		'https://www.gywb.com.cn/upload/news/image/2024/03/12/1710229081060006094.png?h=1920&w=1080',
		'https://pic.rmb.bdstatic.com/bjh/3f136a9989/240528/950018d5faa65d6f3fdb076741e1fa53.jpeg',
		'https://inews.gtimg.com/om_bt/ODwP4d0lrmrwPtmpGU1D6ppY5p_7XfFut8cNJ0EGcUpzAAA/641',
	])
</script>

<style lang="scss" scoped>
	.layout_lazy {
		margin-top: 20rpx;
		column-count: 2;
		column-gap: 10rpx;
	}
</style>

### 实现 UniApp 中的瀑布布局 在 UniApp实现图片瀑布布局可以通过多种方法完成,以下是基于已有引用内容以及专业知识的具体实现方式。 #### 1. 使用 CSS Grid 布局 CSS Grid 是一种强大的二维布局工具,适合用于构建复杂的网格结构。通过设置 `grid-template-columns` 和 `grid-auto-flow` 属性,可以轻松实现瀑布效果[^1]。 ```css .waterfall-container { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 10px; /* 设置列之间的间距 */ } ``` 此代码片段定义了一个响应式的容器,其中每张图片占据至少 150px 的宽度,并根据屏幕尺寸自动调整列数。 --- #### 2. 图片懒加载技术 为了提升性能,建议采用图片懒加载技术。当用户滚动到特定位置时,动态加载该区域内的图片资源[^1]。 ```javascript export default { data() { return { images: [], // 存储图片列表 loadedImages: [] // 已加载的图片索引 }; }, methods: { lazyLoad(index) { const imgElement = this.$refs[`image-${index}`][0]; if (imgElement && imgElement IntersectionObserver) { const observer = new IntersectionObserver((entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.src = this.images[index].url; // 替换占位符为实际图片地址 observer.unobserve(entry.target); // 取消观察 } }); }); observer.observe(imgElement); } } }, mounted() { this.images.forEach((_, index) => this.lazyLoad(index)); // 初始化懒加载逻辑 } }; ``` 上述代码利用了浏览器原生的 `IntersectionObserver API` 来检测图片是否进入视口范围,并仅在此条件下加载真实图像资源。 --- #### 3. 数据源管理与跨页传递 如果需要支持商品详情功能,则可通过 URL 参数或者本地存储机制(如 Storage 或 Vuex)来保存当前选中项的信息[^3]。 假设每个商品都有唯一的 ID 字段: ```html <view v-for="(item, index) in items" :key="index"> <navigator :url="&#39;/pages/detail?id=&#39; + item.id">{{ item.name }}</navigator> </view> ``` 目标页面接收参数并通过过滤器找到对应的数据条目: ```javascript onLoad(options) { const selectedId = options.id || &#39;&#39;; const selectedItem = this.items.find(item => item.id === parseInt(selectedId)); if (!selectedItem) return; console.log(&#39;Selected Item:&#39;, selectedItem); }, ``` --- #### 4. 自定义 TabBar 性能优化 对于涉及多级导航的应用场景,推荐将主要页面作为 Vue 组件全局注册至主入口文件 main.js 中[^2]。这种方式能够有效减少因频繁销毁重建带来的渲染开销,从而改善 tab 切换过程中的闪屏现象。 ```javascript import PageA from &#39;./components/PageA&#39;; import PageB from &#39;./components/PageB&#39;; Vue.component(&#39;page-a&#39;, PageA); Vue.component(&#39;page-b&#39;, PageB); // AppMain.vue 文件内调用这些组件 <template> <view class="container"> <component :is="currentTab"></component> <!-- 动态切换 --> </view> </template> <script> export default { computed: { currentTab() { return &#39;page-&#39; + this.activeIndex } // activeIndex 表示当前激活标签下标 } }; </script> ``` --- ### 结论 综上所述,在 UniApp 平台开发过程中,借助现代 Web 技术栈(例如 CSS Grid、JavaScript),配合合理的架构设计思路(比如懒加载策略和全局状态共享模式),完全可以高效地达成预期视觉效果的同时兼顾良好的运行效率表现。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值