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

这篇具有很好参考价值的文章主要介绍了uniapp小程序—实现下滑关闭抽屉(包含上下左右滑动)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果

uniapp抽屉改成上下,前端,uniapp-小程序,uni-app,小程序,javascript
操作:点击相应文字时从底部出现弹框,下滑超过一定速率,弹框回到下方隐藏;

核心点:

// 当按下去的时候
			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>

总结:

这个组件有些多余的地方我没删,可以自行扩展。以下附带移动端的上下左右滑动,可以借鉴实现小程序的左右滑动文章来源地址https://www.toymoban.com/news/detail-534633.html

移动端上下左右滑动

// 元素左右滑动
  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 ? '向下' : '向上';
       
      }
    }
  };

到了这里,关于uniapp小程序—实现下滑关闭抽屉(包含上下左右滑动)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • uniapp 获取 view 的宽度、高度以及上下左右左边界位置

    boundingClientRect 返回的 res 结果(以像素[px]为单位) 属性 类型 说明 id String 节点的 ID dataset Object 节点的 dataset left Number 节点的左边界坐标 right Number 节点的右边界坐标 top Number 节点的上边界坐标 bottom Number 节点的下边界坐标 width Number 节点的宽度 height Number 节点的高度 更多可参

    2024年02月12日
    浏览(55)
  • uniapp:如何将返回标根据下滑的距离而改变颜色

    在项目过程中我们会遇到这种情况: 返回标和背景颜色重合导致无法看见的情况,这里有一个简单的方法可以实现 这个api会 实时监听你鼠标向下滚动的距离 ,直接写在vue2:methods中即可。vue3直接写在setup函数中就可以了如图所示: 来看看运行效果:

    2024年01月22日
    浏览(37)
  • vue 项目中点击弹窗后实现视频播放(包含关闭弹窗视频暂停)

    vue 项目使用 antd vue 的  Modal 弹窗 , 点击事件触发后,弹窗播放视频,播放视频使用 video 标签 补充: video 标签内可以添加 source 标签 Source标 签用于媒体(因为audio标签同样可以包含此标签,所以这儿用媒体,而不是视频)指定多个可选择的(浏览器最终只能选一个)文件

    2024年02月17日
    浏览(55)
  • uniapp、微信小程序:点击空白/蒙版关闭弹窗

    重点:(点击空白区域关闭弹窗,同理) @click.stop:用于阻止冒泡。 添加@click.stop的标签范围内,点击任何区域(包括@click的点击事件)不会关闭弹窗。标签范围外,会关闭弹窗。 @click.stop标签内的@click等事件:如果事件内有关闭弹窗的代码,(不影响)可关闭弹窗。 (下面

    2024年02月11日
    浏览(53)
  • uniapp实现webview页面关闭功能

    1.关闭按钮是使用原生button添加的close属性。(见page.json页面) 2.监听关闭按钮的方法。(onNavigationBarButtonTap) 3.写实现关闭webview所有页面的逻辑。 废话不多说,直接上代码 1.page.json添加关闭按钮 2.webview页面实现关闭逻辑 实现代码:

    2024年02月03日
    浏览(23)
  • uniapp解析富文本(包含图片)微信小程序+app可用

     最终效果图: 1、uniapp中,在需要使用的vue界面中  2、在后端php中,将提交保存到数据库的富文本图片路径更改为含http或https的(含自己域名的),不然图片无法展示。 将 img src=\\\"upload/article/2022/04-03/273e82bf525920976b0aa5d845a59cb9.jpg\\\" alt=\\\"\\\" style=\\\"display:inline-block;height:auto;max-width:100%\\\"

    2024年02月16日
    浏览(20)
  • uniapp---- 获取当前位置的经纬度等信息的详细步骤(包含小程序)

    1.在项目中进行配置,我选择的是高德地图,填写相关信息。 2.进入高德官网:https://lbs.amap.com/upgrade#quota,进行登录注册,进入到“控制台”。 3.打开 “应用管理” - “我的应用”页面,点击“创建新应用”,根据页面提示填写内容创建应用。 4.在应用下点击“添加”为应用

    2024年02月11日
    浏览(34)
  • uniapp - 实现动态且 “可重复“ 开启与关闭动画,由 JS 点击 / 长按等事件控制开启 “某个元素“ 的 CSS 动画(类似常见的点赞动画效果可以一直重复触发动画)兼容 H5 App 小程序

    如果您是 Vue.js / Nuxt.js 等项目,请访问 这篇文章。 本文实现了 uniapp 全端兼容,在函数内用 JS 让一个元素(DOM),“重复执行” 写好的 CSS 动画,类似点赞动画一样, 你可以直接复制示例源码,稍微改改(写上你想要的动画,换个元素就行)就能应用到您的项目中去, 如下图

    2023年04月08日
    浏览(48)
  • uniapp开发,app手机状态栏问题挡住问题、小程序关闭过滤无依赖文件

    问题:在使用uniapp开发手机App时,因为HBuildX创建的应用默认是沉浸式样式,如果去除自带的导航栏之后,页面会直通手机顶部状态栏,解决办法如下: 方法1:使用uniapp官方文档提供的解决方案 https://uniapp.dcloud.io/collocation/pages?id=customnav 方法二:配置mainfest.json来关闭沉浸式。

    2024年02月11日
    浏览(31)
  • uniapp 微信小程序 封装axios 包含请求拦截、响应拦截、无感刷新令牌功能

    前言: 1、为什么不适用uniapp自带的请求功能? 答:uniapp自带的请求功能,再刷新了令牌后,重新请求返回的数据无法返回给发起请求的方法。也就是说,刷新令牌后重新发起的请求和第一次发起请求的方法是割裂的。 2、封装文件中,我设置了无感刷新令牌功能。我后台的

    2024年02月03日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包