微信公众号H5页面vue仿QQ微信列表左滑删除效果

仿QQ微信列表左滑删除效果


效果
在这里插入图片描述

1.实现思路

通过两个事件touchstart,touchend,结合css样式

2.代码

列表部分就是正常的vue循环渲染
<div class="container">
				<ul>
						<li class="list-item" v-for="(item,index) in billList" data-type="0">
								<div class="list-box" @touchstart.capture="touchStart" @touchend.capture="touchEnd" @click="skip(item.keyid,item.org_code,item.state)">
										<div class="list-content">
											<p class="idx">{{index + 1}}</p>
											<p class="title">{{item.carNo}}</p>
											<p class="time">{{item.name}}</p>
											<p class="tips">{{item.productName}}</p>
											<p class="center">{{item.weight}}()</p>
											<p class="bottom">{{item.billNo}}</p>
										</div>
								</div>
								<div class="delete" @click="deleteItem(item.keyid,item.org_code,item.carNo,item.id)" :data-index="index">撤销</div>
								<div class="edit" @click="editItem(item.keyid)" :data-index="index">编辑</div>
						</li>
				</ul>
</div>
data: {
      startX: 0, // 滑动开始位置
	  endX: 0,  // 滑动结束位置
}
methods: {
				    //跳转
					skip(id, org_code, state) {
							if (this.checkSlide()) {
								this.restSlide();
							} else {
							}
						},
					//滑动开始
					touchStart(e) {
							// 记录初始位置
							this.startX = e.touches[0].clientX;
					},
					//滑动结束
					touchEnd(e) {
							// 当前滑动的父级元素
							let parentElement = e.currentTarget.parentElement;
							// 记录结束位置
							this.endX = e.changedTouches[0].clientX;
							// 左滑
							if (parentElement.dataset.type == 0 && this.startX - this.endX > 5) {
								this.restSlide();
								parentElement.dataset.type = 1;
							}
							// 右滑
							if (parentElement.dataset.type == 1 && this.startX - this.endX < -5) {
								this.restSlide();
								parentElement.dataset.type = 0;
							}
							this.startX = 0;
							this.endX = 0;
					},
					//判断当前是否有滑块处于滑动状态
					checkSlide() {
							let listItems = document.querySelectorAll('.list-item');
							for (let i = 0; i < listItems.length; i++) {
								if (listItems[i].dataset.type == 1) {
									return true;
								}
							}
							return false;
					},
					//复位滑动状态
					restSlide() {
							let listItems = document.querySelectorAll('.list-item');
							// 复位
							for (let i = 0; i < listItems.length; i++) {
								listItems[i].dataset.type = 0;
						}
				},
}
			// css style
			.list-item {
				position: relative;
				height: 4rem;
				-webkit-transition: all 0.2s;
				transition: all 0.2s;
			}

			.list-item[data-type="0"] {
				transform: translate3d(0, 0, 0);
			}

			.list-item[data-type="1"] {
				transform: translate3d(-8rem, 0, 0);
			}

			.list-item:after {
				content: " ";
				position: absolute;
				left: 0.2rem;
				bottom: 0;
				right: 0;
				height: 1px;
				border-bottom: 1px solid #ccc;
				color: #ccc;
				-webkit-transform-origin: 0 100%;
				transform-origin: 0 100%;
				-webkit-transform: scaleY(0.5);
				transform: scaleY(0.5);
				z-index: 2;
			}

			.list-box {
				padding: 0.2rem;
				background: #fff;
				display: flex;
				align-items: center;
				-webkit-box-sizing: border-box;
				box-sizing: border-box;
				justify-content: flex-end;
				position: absolute;
				top: 0;
				right: 0;
				bottom: 0;
				left: 0;
				font-size: 0;
			}

			.list-item .list-img {
				display: block;
				width: 1rem;
				height: 1rem;
			}

			.list-item .list-content {
				padding: 0.1rem 0 0.1rem 0.2rem;
				position: relative;
				flex: 1;
				flex-direction: column;
				align-items: flex-start;
				justify-content: center;
				overflow: hidden;
			}

			.list-item .title {
				display: block;
				color: #333;
				overflow: hidden;
				font-size: 15px;
				margin-left: 28px;
				font-weight: 500;
				text-overflow: ellipsis;
				white-space: nowrap;
			}

			.list-item .tips {
				display: block;
				overflow: hidden;
				font-size: 12px;
				color: #999;
				margin-left: 28px;
				line-height: 20px;
				text-overflow: ellipsis;
				white-space: nowrap;
			}

			.list-item .time {
				display: block;
				font-size: 12px;
				position: absolute;
				right: 5px;
				top: 0.1rem;
				color: #666;
			}

			.list-item .bottom {
				display: block;
				font-size: 12px;
				position: absolute;
				right: 5px;
				top: 2rem;
				color: #666;
			}

			.list-item .center {
				display: block;
				font-size: 12px;
				position: absolute;
				left: 40%;
				top: 2rem;
				color: #666;
			}

			.list-item .delete {
				width: 4rem;
				height: 4rem;
				/* padding: 0.2rem; */
				background: #ff4949;
				font-size: 12px;
				color: #fff;
				text-align: center;
				line-height: 4rem;
				position: absolute;
				top: 0;
				right: -4rem;
			}

			.list-item .edit {
				width: 4rem;
				height: 4rem;
				/* padding: 0.2rem; */
				background: #00aaff;
				font-size: 12px;
				color: #fff;
				text-align: center;
				line-height: 4rem;
				position: absolute;
				top: 0;
				right: -8rem;
			}

			.cur {
				background-color: #e5ecff;
			}

			.aa {
				/* cursor: pointer; */
				border: 1px solid #C0C0C0;
			}

			.red {
				background-color: #C0C0C0;
				color: red;
			}

			.idx {
				position: absolute;
				/* left: 5px; */
				top: 50%;
				margin-top: -10px;
				width: 22px;
				height: 22px;
				text-align: center;
				font-size: 1rem;
				line-height: 22px;
				background: #239AFF;
				color: #FFF;
				border-radius: 100%;
			}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue H5页面中实现微信分享,可以按照以下步骤进行: 第一步,获取微信分享所需的相关配置: 在Vue项目中引入微信开放平台的JS-SDK,然后通过微信开放平台接口获取到当前页面的分享配置信息,包括标题、描述、链接和图片等信息。 第二步,调用微信JS-SDK进行分享: 在Vue的组件中,通过引入微信JS-SDK提供的方法,如`wx.onMenuShareTimeline`和`wx.onMenuShareAppMessage`等,来实现对应的分享功能。可以将这些方法封装成一个单独的util文件,方便在项目中多次调用。 第三步,配置分享参数: 调用微信JS-SDK的分享方法前,需要将获取到的分享配置信息传入相应的参数中,如标题、链接、描述和分享图等。可以根据当前页面的不同内容来动态设置分享的参数。 第四步,设置微信签名: 在Vue页面中,可以使用`vue-router`插件进行路由控制,当进入到需要分享的页面时,通过异步请求来获取当前页面的分享配置信息和签名,然后将签名设置给微信JS-SDK。 第五步,调用分享方法: 在上面的配置完成后,即可通过微信JS-SDK提供的分享方法,如`wx.onMenuShareTimeline`和`wx.onMenuShareAppMessage`等,来实现对应的分享功能。可以按需选择分享到朋友圈、发送给好友或分享到QQ等渠道。 需要注意的是,Vue H5页面在与微信分享时,由于所处的环境和限制会有所不同,可能需要在不同的事件中触发分享,比如在路由切换完成后触发分享方法。 以上是实现Vue H5页面分享微信的一般步骤,具体实现还需要根据项目的需求和微信开放平台的接口文档进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值