用uniapp写堆叠卡片式轮播图

<template>
	<view class="focus" :style="{'width': width + 'rpx'}">
		<view class="ul">
			<view v-for="(item,index) in list" :key="item.id" class="li"
				:style="{'z-index': -1 * index,'width': itemWidth + 'rpx','transform':translateX(index+moving),'transition': transition,}">
				<view class="item" :style="{'transform':`scale(${1-0.1*index+scale})`,'transition': transition}"
					@transitionend="transitionend(index)">
					<view class="item-content" :style="{'opacity':index ? 1 : moving ? 0 : 1}">
						<image class="img" :src="item.url"></image>
						<view class="">
							666666666<br>
							666666
						</view>
					</view>
				</view>
			</view>
			<view class="li"
				:style="{'z-index': -1 * list.length,'width': itemWidth + 'rpx','transform':translateX(list.length+moving)}">
				<view class="item" :style="{'transform':`scale(${1-0.1*list.length+scale})`,'transition': transition}">
					<image class="img" :src="list[0].url"></image>
					<view class="">
						666666666<br>
						666666
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		props: {
			// 整个轮播图的宽度
			width: {
				type: Number,
				default: 750
			},
			// 轮播图里每张的宽度
			itemWidth: {
				type: Number,
				default: 600
			},
			interval: {
				type: Number,
				default: 3000
			},
			duration: {
				type: Number,
				default: 1000
			}
		},
		data() {
			return {
				list: [{
						url: 'https://i0.hdslb.com/bfs/feed-admin/bcb259e99288a0f5e11040b9f0a51c6eb9d8405f.png',
						id: 1
					},
					{
						url: 'https://i0.hdslb.com/bfs/sycp/creative_img/202109/472d7ba939e323a4fe5dd205ca4146e8.jpg@880w_388h_1c_95q',
						id: 2
					},
					{
						url: 'https://i0.hdslb.com/bfs/feed-admin/4458cae9f0f353841a5c89dec2ad9a8437df79e5.png@880w_388h_1c_95q',
						id: 3
					}
				],
				scale: 0, //移动的时候控制缩放
				rightPadding: 0, //计算右边每张图要凸出来多少
				padding: 0, //计算缩放后,缩放的图片右边空出的距离
				transition: `all ${this.duration/1000}s`, //控制过渡
				moving: 0, //0表示不动,-1表示正在移动
				timer: null //定时器
			}
		},
		mounted() {
			// 右边凸出来的单张的宽度
			this.rightPadding = (this.width - this.itemWidth) / (this.list.length - 1);
			this.padding = this.itemWidth * 0.1 / 2;
			this.setAction()
		},
		methods: {
			transitionend(index) {
				if (!index) {
					this.transition = "none";
					this.scale = 0;
					this.moving = 0;
					this.list.push(this.list.shift());
				}
			},
			setAction() {
				this.timer = setInterval(() => {
					this.transition = `all ${this.duration/1000}s`;
					this.scale = 0.1;
					this.moving = -1;
				}, this.interval)
			},
			// 初始时每张的偏移宽度
			translateX(index) {
				const scaleRightPadding = this.itemWidth * 0.1 * index / 2;
				return `translateX(${this.rightPadding * index + scaleRightPadding + 'rpx'})`
			}
		},
		beforeDestroy() {
			this.timer && clearInterval(this.timer)
		}
	}
</script>

<style lang="scss" scoped>
	.focus {
		position: relative;
		overflow: hidden;
		width: 750rpx;
		height: 500rpx;

		.img {
			width: 100%;
			height: 80%;
			vertical-align: middle;
		}

		.ul {
			position: absolute;
			width: 100%;
			height: 100%;

			.li {
				position: absolute;
				height: 100%;
			}
		}

		.item {
			width: 100%;
			height: 100%;

			.item-content {
				width: 100%;
				height: 100%;
				background-color: #fff;
			}
		}
	}
</style>

Uniapp 中实现卡片式轮播图,可以通过使用组件库或自定义组件来实现。以下是一个简单的实现示例: 1. 首先,在你的 Uniapp 项目中引入需要的组件库,如 vant、uView 等。或者你可以自己编一个自定义组件。 2. 在需要使用轮播图的页面中,引入轮播图组件: ```vue <template> <view> <swiper class="swiper-container" indicator-dots autoplay circular> <block v-for="(item, index) in swiperList" :key="index"> <swiper-item> <!-- 卡片内容 --> <view class="card"> <image :src="item.image" mode="aspectFill" class="card-image" /> <text>{{ item.title }}</text> </view> </swiper-item> </block> </swiper> </view> </template> <script> export default { data() { return { swiperList: [ { image: '图片地址1', title: '标题1', }, { image: '图片地址2', title: '标题2', }, // 依此类推 ], }; }, }; </script> <style> .card { width: 200px; /* 设置卡片宽度 */ height: 300px; /* 设置卡片高度 */ background-color: #f5f5f5; border-radius: 8px; } .card-image { width: 100%; height: 200px; /* 设置卡片中图片的高度 */ border-top-left-radius: 8px; border-top-right-radius: 8px; } </style> ``` 在上述代码中,我们使用了 `swiper` 组件和 `swiper-item` 组件来实现轮播图效果。每个 `swiper-item` 中放置一个卡片内容,其中使用了 `image` 组件来显示图片,`text` 组件来显示标题。 你可以根据实际需求调整卡片的样式和轮播图的配置,例如设置自动轮播、指示器等。同时,也可以根据项目需要自定义组件样式和交互效果。 希望这个示例能够帮助到你!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值