uni-app小程序折叠3D轮播图效果实现。

这篇具有很好参考价值的文章主要介绍了uni-app小程序折叠3D轮播图效果实现。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

uni-app封装折叠轮播组件

先来看效果图
uni-app小程序折叠3D轮播图效果实现。

实现原理:
通过小程序的触摸事件,来控制图片数组的变化实现动态样式;来改变图片的样式。

贴上轮播组件完整代码

<template>
	<view :style="{ height: height+'px' }" class="box">
		<view class="swiper-container">
			<view 
				class="swiper-item" 
				v-for="(item, index) in list" :key="index"
	            @tap="imageTap(item)"
	            @touchstart="touchStart" 
	            @touchend="touchEnd"
				:style="{filter:styleList[index].filter, transform: styleList[index].transform, zIndex: styleList[index].zIndex, opacity: styleList[index].opacity,display:styleList[index].display}">
				<view class="wrap">
					<image class="image" :src="item" mode="widthFix"></image>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		props: {
			/**
			 * 图片url列表
			 */
			list: {
				type: Array,
				default: []
			}
		},
		data() {
			return {
				/**
				 * 开始触摸点坐标
				 */
				start: {
					x: 0,
					y: 0
				},
				/**
				 * 每个item样式列表
				 */
				styleList: [],
        height: 0
			};
		},
		created() {
			this.list.forEach((item, index) => {
				this.styleList.push(this.addStyle(index))
			})
		},
		mounted () { //防止页面翻页抖动
		  setTimeout(() => {
		        const query = uni.createSelectorQuery().in(this);
		        query.select('.image').boundingClientRect(data => {
		          this.height = data.height
		        }).exec();
		      }, 1500)
		    },
		methods: {
      	imageTap(item) { // 图片的点击事件
	        this.$emit('image-tap', item)
	      },
			/**
			 * 计算每个item样式
			 * @param {Object} idx
			 */
			addStyle(idx) {
				const len = this.list.length;
				if (idx > len / 2) {
					//这里是数组后一半的item放在左边,平移位置由远到近,例如共6个,后2个处理在这里
					var left = len - idx
					return {
						transform: 'scale(' + (1 - left / 10) + ') translate(-' + (left * 25) + '%,0px)',
						zIndex: 9999 - left,
						filter: `blur(${left==0?0:5}px)`, //滤镜
						display: idx == len - 1 ? "block" : "none"
					}
				} else {
					//这里是数组前一半item放在右边,平移位置由近到远,例如共6个,前4个处理在这里,这里第一个元素始终放在中间位置
					return {
						transform: 'scale(' + (1 - idx / 10) + ') translate(' + (idx * 25) + '%,0px)',
						zIndex: 9999 - idx,
            filter: `blur(${idx==0?0:5}px)`, //滤镜
            display: idx > 1 ? "none" : "block"
					}
				}
			},
			/**
			 * 触摸开始
			 * @param {Object} e
			 */
			touchStart(e) {
				this.start.x = e.changedTouches[0] ? e.changedTouches[0].pageX : 0;
				this.start.y = e.changedTouches[0] ? e.changedTouches[0].pageY : 0;
			},
			/**
			 * 触摸结束
			 * @param {Object} e
			 */
			touchEnd(e) {
				var newStyleList = JSON.parse(JSON.stringify(this.styleList))
				let tx = e.changedTouches[0].pageX - this.start.x
				let ty = e.changedTouches[0].pageY - this.start.y
				if (Math.abs(tx) > Math.abs(ty)) {
					//左右方向滑动
					if (tx < 0) {
						// 向左滑动
						var last = [newStyleList.pop()]
						newStyleList = last.concat(newStyleList)
					} else if (tx > 0) {
						// 向右滑动
						newStyleList.push(newStyleList[0])
						newStyleList.splice(0, 1)
					}
        } else {
					//这里就不处理上下方向的事件了,有此需求的同仁可以在这里写逻辑
					//上下方向滑动
					if (ty < 0) {
						// 向上滑动
					} else if (ty > 0) {
						// 向下滑动
					}
				}
				this.styleList = newStyleList
			},
			/**
			 * 当前item点击返回索引下标
			 * @param {Object} idx
			 */
		}
	}
</script>

<style scoped lang="scss">
.box{
  .swiper-container {
		box-sizing: border-box;
		width: 100%;
		position: relative;

		.swiper-item {
			width: 100%;
			position: absolute;
			top: 0;
			left: 0;
			transition: all .5s;

			.wrap {
				padding: 2upx 44upx;
				.image {
					width: 100%;
					border-radius: 20upx;
				}
			}
		}
	}
}
	
</style>

组件使用


<template>
  <view class="tabbar-page">
    <view class="head">
      <image @tap="showBannerLink" :src="banner.imageUrl" style="width: 100%" mode="widthFix"></image>
    </view>
    <view v-if="imageList.length" class="h1">精彩呈现</view>
    <kevy-swiper v-if="imageList.length" :list="imageUrlList" @image-tap="imageTap"></kevy-swiper>
  </view>
</template>

<script>
  import KevySwiper from '../../components/kevy-swiper/kevy-swiper.vue'
  import store from '@/store/index'
  import crmApiService from '@/api/crmApi'

  export default {
    components: {KevySwiper},
    data () {
      return {
        imageList: [],
        banner: {}
      }
    },
    watch: {},
    computed: {
      ossUrl () {
        return this.$config.ossUrl
      },
      imageUrlList () {
        return this.imageList?this.imageList.map(item => item.imageUrl) : []
      },
      activityUrl () {
        return this.ossUrl + 'test_activity.png'
      }
    },
    methods: {
      showBannerLink() {
//        uni.navigateTo({ url: '/pages/webview/webview?url='+this.banner.linkUrl })
      },
      imageTap (url) {
        this.imageList.some(item => {
          if (item.imageUrl == url) {
            uni.navigateTo({ url: '/pages/webview/webview?url='+item.linkUrl })
            return true
          }
        })
      }
    },
    onShow () {
      this.setTabBarIndex(2)
      crmApiService.getBanners().then(res => {
        if (res.success) {
          this.banner = res.result
        } else {
          this.$tip.toast(res.message)
        }
      })
      crmApiService.getCarousels().then(res => {
        if (res.success) {
          this.imageList = res.result
        } else {
          this.$tip.toast(res.message)
        }
      })
    }
  }
</script>

<style scoped lang="scss">
  .h1 {
    font-size: 48upx;
    color: #111111;
    text-align: center;
    font-weight: 500;
    padding: 44upx 0;
  }
  .tabbar-page {
    padding-bottom: calc(env(safe-area-inset-bottom) + 68px);
    overflow-x: hidden;
  }
  .activity-wrap {
    padding: 0 44upx;
  }
</style>

如果有自动轮播的需求,可以改造下组件加个定时器处理数组就OK了。文章来源地址https://www.toymoban.com/news/detail-509807.html

到了这里,关于uni-app小程序折叠3D轮播图效果实现。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app/微信小程序 实现图片或元素淡入淡出效果

    如题: 直接上代码 html js部分 需要在date中声明好                 current: 0,                 hidepic: null,                 showpic: null 因为是已进入就开始的,所以 要在生命周期中使用 最后一部别忘了,要给需要淡入淡出的元素或者图片设置绝对定位

    2024年02月12日
    浏览(58)
  • 三分钟完成小程序 uni-app、网站接入chatgpt实现聊天效果

    1.实现后台接口 注册laf云开发账号 https://laf.dev/ 注册一个应用后进入这个页面: 下载依赖 chatgpt 配置apiKey 写send函数 配置你的apiKey 2.uni-app小程序代码中 //封装cloud 发送消息方法 微信小程序中使用 3.实现效果 在这里插入图片描述

    2024年02月11日
    浏览(36)
  • 前端效果积累 |别具一格的3D酷炫轮播图效果收集

    📌 个人主页 :个人主页 ​🧀 推荐专栏 :前端开发成神之路 --【 这是一个为想要 入门和进阶前端开发专门开启的精品专栏 !从 个人到商业的全套开发教程 ,实打实的干货分享,确定不来看看? 😻😻】 📝 作者简介 : 从web开发,再到大数据算法,踩过了无数的坑,用

    2024年02月16日
    浏览(30)
  • uni-app 折叠自定义

    uni-app的uni-collapse折叠组件样式修改 下面是修改后的样式 修改一下uni-collapse的uni-collapse-item 设计图样式 修改后的样式 就这样吧…

    2024年02月09日
    浏览(49)
  • 【案例分享 | 旅游出行app】Axure制作banner轮播图交互效果

    哈喽,大家好!今天给大家介绍如何使用Axure软件制作banner轮播图的交互效果。 【预览地址含下载】电脑打开链接:https://wh9x1s.axshare.com/ 【完整案例作品预览含下载】:https://fx2z9z.axshare.com 【视频教程】:哔哩哔哩视频 首先,让我们来看下效果展示:进入页面后自动轮播图

    2024年02月19日
    浏览(46)
  • uni-app:实现时钟自走(动态时钟效果)

    使用钩子函数 mounted(),设置定时器,是指每秒都要去执行时间的获取,以至于实现时间自走的效果  mounted() {     this.updateTime(); // 初始化时间     setInterval(this.updateTime, 1000); // 每秒更新时间   },  自定义方法updateTime去获取当前时间,并设置数据 updateTime() {       const dat

    2024年02月08日
    浏览(42)
  • uni-app - 文本展开 / 收起折叠功能,支持自定义样式(当文本内容超出规定行数后,展开收起折叠的功能)兼容 H5 / App / 小程序且易用更容易修改的插件组件源码,超详细的示例代码及注释

    网上的组件和教程代码都太乱了,根本无法按照自己的需求修改,而且基本上都有兼容性和功能性 BUG。 本文实现了 多行文本展开与折叠组件,灵活性非常高,只完成了核心功能,可随意自定义样式满足您的需求, 您只需要一键复制组件源码,按照详细的代码示例,几分钟快

    2024年02月07日
    浏览(57)
  • uni-app小程序中做页面滚动底部或顶部加载效果

    在移动应用开发中,无限滚动加载是一个常见的功能,用户可以通过滑动屏幕来加载更多的内容,从而提高应用的用户体验。本文将介绍如何使用Uniapp实现无限滚动加载的功能。 概述 我们需要实现的无限滚动加载功能的具体效果如下: 当用户滑动到底部时,自动加载更多的

    2024年02月08日
    浏览(56)
  • uni-app+uView实现点击查看大图片的效果

    参数说明

    2024年02月10日
    浏览(39)
  • 微信小程序中实现轮播图效果

    swiper是轮播图的外层容器,所以使用轮播图就必须使用到swiper标签。 存在默认样式: 1 width 100% 2 height 150px 只能放置在swiper组件中。表示每一个轮播项。 编译效果: 当切换机型后,就可以方向,图片的宽高与效果不一样 1.分析和升级版本,解决换机型的宽高问题 ①先找出

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包