uniapp小程序—实现下滑关闭抽屉(包含上下左右滑动)

效果

在这里插入图片描述
操作:点击相应文字时从底部出现弹框,下滑超过一定速率,弹框回到下方隐藏;

核心点:

// 当按下去的时候
			fingerstart(e) {
				// 记录 距离可视区域左上角 左边距 和 上边距
				this.startData.clientX = e.changedTouches[0].clientX;
				this.startData.clientY = e.changedTouches[0].clientY;
				
			},
			// 当抬起来的时候
			fingerend(e) { 
				// 当前位置 减去 按下位置 计算 距离
				const subX = e.changedTouches[0].clientX - this.startData.clientX;
				const subY = e.changedTouches[0].clientY - this.startData.clientY;
				if (subY > this.updDistance || subY < -this.updDistance) {
					if (subY > this.updDistance) {
						this.showMax = false;
						this.getDomTop()
					} else if (subY < -this.updDistance) {
						this.showMax = true;
						this.getDomTop()
					}
				} 
			},

使用组件

<btmPop :startShow="showPop" @closePop="closeWord">
	<template #detail>
	</template>
</btmPop>

全部代码

<template>
	<view 
		class="detailBox" 
		:style="[
			{
			'height':minHeight+'px',
			'transform':`translateY(${isHide?99:0}rem)`,
			'backgroundColor':bgColor
			}, 
		]"  
		@touchstart="fingerstart"
		@touchend="fingerend"
	>
	
		<view v-if="showLine" class="popLine"></view>
		<view v-if="!showLine" class="popClose" @click="closePopBox">
			<u-icon name="close" :size="20"></u-icon>
		</view>
		<!-- 自定义内容插槽 -->
		<slot name="detail"></slot>
	</view>
</template>

<script>
	export default{
		props:{
			// 高度
			boxHeihgt:{
				type:Number,
				default:0
			},
			// 背景色
			bgColor:{
				type:String,
				default:"#FDFAF5"
			},
			// 控制初始是否显示
			startShow:{
				type:Boolean,
				default:false
			},
			// 是否显示线
			showLine:{
				type:Boolean,
				default:true
			},
			// 上下滑动 超过多少距离触发 updownDistance
			updDistance: { 
				type: Number,
				default: 160
			},
		},
		watch:{
			'startShow':{
				handler(n,o){
					this.isHide =!n;
				},
				deep:true,
				immediate:true
			}
		},
		data(){
			return{
				minHeight:0,
				isHide:true,
				boxPadBottom:0,
				// 根据滑动设置位置
				changeTop:0,
				// 是否固定高度
				showMax:false,
				// 记录起始位置
				startData: {
					clientX: '',
					clientY: ''
				}
			}
		},
		methods:{
			
			// 当按下去的时候
			fingerstart(e) {
				// 记录 距离可视区域左上角 左边距 和 上边距
				this.startData.clientX = e.changedTouches[0].clientX;
				this.startData.clientY = e.changedTouches[0].clientY;
				
			},
			// 当抬起来的时候
			fingerend(e) { 
				// 当前位置 减去 按下位置 计算 距离
				const subX = e.changedTouches[0].clientX - this.startData.clientX;
				const subY = e.changedTouches[0].clientY - this.startData.clientY;
				if (subY > this.updDistance || subY < -this.updDistance) {
					if (subY > this.updDistance) {
						// this.bottomscroll(subY);
						this.showMax = false;
						this.getDomTop()
					} else if (subY < -this.updDistance) {
						// this.topscroll(subY);
						this.showMax = true;
						this.getDomTop()
					}
				} 
			},
			// 获取元素的top值
			getDomTop(){
				const query = uni.createSelectorQuery().in(this);
				query.select('.detailBox').boundingClientRect(data => {
				  if(data){
					// 上滑
					if(this.showMax){
					}else{
					// 下滑
						this.closePopBox()
					}
				  }
				}).exec();
			},
			// 关闭弹框
			closePopBox(){
				this.isHide = true;
				this.$emit("closePop",true)
			}
		},
		onReady() {
			let windowHeight = uni.getSystemInfoSync().windowHeight;
			let NavbarHeight = this.$store.state.Layout.NavbarHeight;
			this.minHeight = windowHeight-NavbarHeight-20-this.boxHeihgt;
			
		},
	}
</script>

<style lang="scss" scoped>
	.detailBox {
		position: fixed;
		width: 100%;
		height: auto;
		bottom: 0;
		left: 0;
		border-top-left-radius: 40rpx;
		border-top-right-radius: 40rpx;
		overflow-y: auto;
		transition: all .5s;
		z-index: 99999;
	}
	.popLine{
		width: 115rpx;
		height: 10rpx;
		border-radius: 28rpx;
		background-color: #EEE2D6;
		margin: 20rpx auto 35rpx;
	}
	.popClose{
		width: calc(100% - 80rpx);
		display: flex;
		justify-content: flex-end;
		margin: 30rpx 40rpx 10rpx 40rpx;
	}
</style>

总结:

这个组件有些多余的地方我没删,可以自行扩展。以下附带移动端的上下左右滑动,可以借鉴实现小程序的左右滑动

移动端上下左右滑动

// 元素左右滑动
  const NavonTouchStart = (e) => {
    e.persist();
    state.firstX = e.targetTouches[0].clientX;
    state.firstY = e.targetTouches[0].clientY + 60;
  };
  const NavonTouchEnd = (e) => {
    e.persist();
    state.endX = e.targetTouches[0].clientX;
    state.endY = e.targetTouches[0].clientY + 60;
    let moveX = state.endX - state.firstX;
    let moveY = state.endY - state.firstY;
    if (Math.abs(moveX) > 130 || Math.abs(moveY) > 130) {    // 130理解为滑动距离
      if (Math.abs(moveX) > Math.abs(moveY)) {
        let ele = moveX > 0 ? '向右' : '向左';

      } else {
        let ele = moveY > 0 ? '向下' : '向上';
       
      }
    }
  };
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现uniapp仿快手的左侧抽屉效果,可以按照以下步骤进行操作: 1. 创建一个包含左侧抽屉的组件或页面。在该组件或页面中,使用uni的布局组件(如<view>和<scroll-view>)来实现左侧抽屉的外观和交互效果。可以通过设置组件的宽度、位置和动画效果来调整抽屉的展开和收起。 2. 在需要展示左侧抽屉的页面中,引入并使用该组件或页面。可以通过点击按钮或手势等方式触发抽屉的展开和收起。 3. 使用uni的事件绑定机制,例如使用@click事件监听用户的点击行为,来控制抽屉的展开和收起。在事件处理函数中,可以通过修改组件或页面的数据状态(如使用data中的变量)来控制抽屉的显示和隐藏。 4. 如果需要在抽屉中展示搞笑视频,可以使用uni的媒体组件(如<video>)来加载和播放视频文件。可以通过设置视频的源地址和控制按钮来实现视频的浏览和播放功能。 5. 如果需要支持用户关注和下载视频,可以在组件或页面中添加相应的按钮,并通过绑定事件来处理用户的点击行为。可以通过调用相关的API接口(如关注接口和下载接口)来实现这些功能。 6. 如果需要支持微信分享,可以通过调用uni的分享API(如uni.share)来实现。可以在组件或页面中添加分享按钮,并在按钮的点击事件中调用分享接口,将相关的信息传递给微信。 以上是实现uniapp仿快手的左侧抽屉效果的一种方法。具体的实现方式可以根据具体需求和项目要求进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [高仿快手APP](https://download.csdn.net/download/he_666/9481084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [uniapp-快手小程序支付,字节小程序支付](https://blog.csdn.net/qq_45499633/article/details/124823204)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值