实现uniapp+Vue3中swiper组件的自动高度功能

引言

uniapp中swiper组件默认并不支持内容自适应高度,这在展示不同尺寸的图片时可能会导致显示问题。本文将介绍如何使用Vue3的组合式API(Composition API)来实现swiper组件的自动高度功能。

一、实现思路

自动高度?父元素使用 height:auto不就行了
虽然将高度设置为 auto 在某些场景下是可行的,但需要注意的是,在移动应用开发中,滑动视图通常需要一个明确的高度来确保滑动效果的正常运作。

  1. 监听图片加载事件:当swiper中的图片加载完成时,获取其原始宽度和高度。
  2. 计算实际高度:根据图片的原始宽高比和设定的宽度(例如750rpx),计算出图片在目标宽度下的实际高度。
  3. 动态设置swiper高度:将计算出的实际高度应用到swiper组件的样式上,以实现高度自适应。

二、代码实现

  1. 模板部分(Template)
 <template>
	<view class="top_swiper">
			<swiper @change="onSwiperChange" class="swiper" :style="{ height: swiperHeight }" circular indicator-dots="true" :autoplay="true" interval="2000" duration="500">
				<block v-for="(item, index) in bannerList" :key="item.id">
					<swiper-item>
						<image class="top_swiper_img" :src="item.image" alt="" mode="widthFix" @load="imageLoaded(index, $event)" />
					</swiper-item>
				</block>
			</swiper>
		</view>
</template>
  1. 脚本部分(Script)
<script setup>
import { ref, onMounted, nextTick } from 'vue';
import { post } from '../../libs/request.js'

const bannerList = ref([])
const swiperHeight = ref('300rpx');
const imageHeights = ref([]); // 存储图片的高度  

onMounted(() => {
	getBanner();
})

/**
 * 图片加载完成  
 */
const imageLoaded = (index, event) => {
	const { width, height } = event.detail;
	let actualHeight = height / (width / 750);
	imageHeights.value[index] = actualHeight;
	if (index === 0) {
		swiperHeight.value = actualHeight + 'rpx';
	}
}

/**
 * swiper 切换  
 */
const onSwiperChange = async (e) => {
	const index = e.detail.current;
	await nextTick();
	const currentImageHeight = imageHeights.value[index];
	swiperHeight.value = currentImageHeight + 'rpx';
}

/**
 * 获取轮播图
 */
const getBanner = () => {
	post("Banner/getList", {}).then((result) => {
		if (result.code == 0) {
			bannerList.value = result.data;
		}
	})
}

</script>
  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UniApp是一个基于Vue.js的跨平台开发框架,可以用于开发iOS、Android、H5等多个平台的应用程序。而vue-awesome-swiper是一个基于SwiperVue组件,用于实现轮播图等滑动效果。 要在UniApp使用vue-awesome-swiper,首先需要安装它。可以通过npm或者yarn进行安装,命令如下: ``` npm install vue-awesome-swiper --save ``` 安装完成后,在需要使用的页面引入vue-awesome-swiper组件,并注册为全局组件或局部组件。例如,在`main.js`全局注册: ```javascript import Vue from 'vue' import VueAwesomeSwiper from 'vue-awesome-swiper' import 'swiper/css/swiper.css' Vue.use(VueAwesomeSwiper) ``` 然后,在需要使用轮播图的页面,可以直接使用`<swiper>`标签来创建轮播图。例如: ```html <template> <swiper :options="swiperOptions"> <swiper-slide v-for="(item, index) in swiperList" :key="index"> <img :src="item.imgUrl" alt=""> </swiper-slide> <div class="swiper-pagination" slot="pagination"></div> </swiper> </template> <script> export default { data() { return { swiperOptions: { autoplay: true, loop: true, pagination: { el: '.swiper-pagination', }, }, swiperList: [ { imgUrl: 'https://example.com/image1.jpg' }, { imgUrl: 'https://example.com/image2.jpg' }, { imgUrl: 'https://example.com/image3.jpg' }, ], } }, } </script> ``` 在上面的代码,`swiperOptions`是轮播图的配置项,可以根据需要进行设置。`swiperList`是轮播图的数据列表,可以根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值