uniapp滑动图片验证

uniapp滑动图片验证


使用组件

<slider-verify :show="isShowSliderVerify" @sliderVerifySuccessHandle="sliderVerifySuccessHandle"></slider-verify>

组件

<template>
	<view class="sliderVerify-shade" v-if="show">
		<view class="sliderVerify-wrap">
			<view class="refresh" @click="refresh">
				<image class="refreshImg" src="@/pagesB/static/slider/refresh.png"></image>
				<text>刷新</text>
			</view>
			<view class="imgWrap">
				<image class="img" :src="src"></image>
				<view class="over" :style="{left:left+'px',top:top+'px'}"></view>
				<view class="smartImg" :style="{left:sleft+'px',top:stop+'px'}">
					<image class="simg" :style="{left:-left+'px',top:-top+'px'}" :src="src"></image>
				</view>
			</view>
			<view class="sliderBox" @touchend="sliderEnd">
				<movable-area class="sliderF">
					<movable-view :animation="true" class="sliderS" :x="sliderx" direction="horizontal" @change="startMove">
						<image class="icon" src="@/pagesB/static/slider/rigth.png"></image>
					</movable-view>
				</movable-area>
				<view class="bgC">
					<text>拖动滑块完成整块拼图</text>
					<view class="bgC_left" :style="{width:backLeft+'px'}"></view>
				</view>
			</view>
		</view>	
	</view>
</template>
 
<script>
	export default {
		name: 'slider-verify',
		props:{
			show:{
				type:Boolean,
				default:false
			}
		},
		watch:{
			show(){
				this.random()
			}
		},
		data() {
			return {
				left: 0,
				top: 0,
				sleft: 0,
				sleftDefault: 0,
				stop: 0,
				sliderx: 0,
				backLeft: 0,
				message: '',
				src:'',
				bgImg:require("@/pagesB/static/slider/slider.jpg"),//背景图片
			}
		},
		mounted() {
			this.random()
		},
		methods: {
			random() {
                let imgLegth=8;
				let ram = Math.random();
				this.left = Math.floor(80 * ram) + 140; //140-220
				this.top = this.stop = Math.floor(80 * ram) + 10;
				this.sleft = this.sleftDefault = Math.floor(70 * ram) + 10;
                if(Math.floor(imgLegth*ram)==8){
					this.src=this.bgImg;
				}else{
					this.src=this.bgImg;
				}
                this.sliderx = 1;
                setTimeout(() => {
					this.sliderx = 0;
					this.refreshStatus=false;
                }, 300)
			},
			refresh(){
				this.message='';
				this.random();
			},
			startMove(e) {
				this.backLeft = e.detail.x + 18;
				this.sleft = this.sleftDefault + e.detail.x;
			},
			sliderEnd() {
				if (Math.abs(this.sleft - this.left) <= 4) {
					this.message = '验证成功!';
	                console.log("[验证成功]")
					this.$emit("sliderVerifySuccessHandle");
				} else {
					this.message = '验证失败,请重试';
                    console.log("[验证失败,请重试]")
					setTimeout(() => {
						this.message = '';
						this.sliderx = 1
						setTimeout(() => {
							this.sliderx = 0
						}, 300)
					}, 1000)
				}
			}
		}
 
	}
</script>
 
<style lang="scss" scoped>
  .sliderVerify-shade{
	  position: fixed;
	  top: 0;
	  left: 0;
	  right: 0;
	  bottom: 0;
	  z-index: 100;
	  display: flex;
	  justify-content: center;
	  align-items: center;
	  background-color: rgba(0,0,0,0.7);
  }
  .sliderVerify-wrap {
  	position: relative;
  	background: #fff;
  	width: 300px;
  	border-radius: 8px;
  	overflow: hidden;
      .refresh{
  		position: absolute;
  		right: 30rpx;
  		top: 124px;
		font-size: 14px;
		font-family: Source Han Sans CN;
		font-weight: 400;
		color: #FFFFFF;
		z-index: 1;
		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
		.refreshImg{
			transition: all 0.3s;
			width: 16px;
			height: 16px;
			margin-right: 5px;
		}
  	}
  	.imgWrap {
  		position: relative;
  		width: 280px;
  		height: 150px;
  		border-radius: 8px;
  		margin: 0 auto;
  		overflow: hidden;
        background: #ddd;
		margin-top: 9px;
  		.img {
  			display: block;
  			width: 100%;
  			height: 100%;
  		}
   
  		.over {
  			position: absolute;
  			left: 0;
  			top: 0;
  			width: 40px;
  			height: 40px;
  			background: #ddd;
  			box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3);
  		}
   
  		.smartImg {
  			position: absolute;
  			z-index: 2;
  			left: 0;
  			top: 0;
  			width: 40px;
  			height: 40px;
  			overflow: hidden;
  			box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
   
  			.simg {
  				position: absolute;
  				display: block;
  				width: 280px;
  				height: 150px;
  			}
  		}
  	}
  }
   
  .sliderBox {
  	width: 280px;
  	margin: 20px auto;
  	height: 22px;
  	position: relative;
  	.sliderF {
  		width: 100%;
  		height: 100%;
  		z-index: 3;
  		.sliderS {
  			height: 36px;
  			width: 36px;
  			background: #EB4D4D;
  			border-radius: 36px;
  			display: flex;
  			justify-content: center;
  			align-items: center;
			margin-top: -8px;
  			.icon {
  				width: 20px;
  				height: 20px;
  			}
  		}
  	}
   
  	.bgC {
  		position: absolute;
  		z-index: 1;
  		left: 0;
  		top: 50%;
  		transform: translateY(-50%);
  		width: 100%;
  		height: 22px;
  		border-radius: 22px;
  		line-height: 22px;
  		font-size: 14px;
  		color: #666666;
		background-color: #E6E6E6;
  		box-shadow: inset 0 0 4px #E6E6E6;
  		text-align: center;
  		overflow: hidden;
  	}
   
  	.bgC_left {
  		position: absolute;
  		left: 0;
  		top: 50%;
  		transform: translateY(-50%);
  		width: 0;
  		height: 22px;
  		border-top-left-radius: 22px;
  		border-bottom-left-radius: 22px;
  		line-height: 22px;
  		font-size: 14px;
  		background-color: #EB4D4D;
  		box-shadow: inset 0 0 4px #EB4D4D;
  		text-align: center;
  	}
  }
</style>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
uniapp中实现滑动删除功能可以通过以下步骤实现: 1. 首先,在需要实现滑动删除的视图组件中,添加`@touchstart`、`@touchmove`和`@touchend`事件监听器,并在相应的方法中编写逻辑代码。可以参考中提供的代码示例。 2. 在数据部分,定义`startX`和`delBtnWidth`两个变量,`startX`用于记录触摸开始时的X坐标,`delBtnWidth`表示删除按钮的宽度。 3. 在滑动开始(`drawStart`)事件处理方法中,获取触摸开始时的X坐标,可以使用`event.touches.clientX`来获取。 4. 在滑动过程(`drawMove`)事件处理方法中,计算移动的距离,并根据移动的距离来移动视图组件,使其呈现出滑动效果。具体的实现逻辑可以根据需求进行调整。 5. 在滑动结束(`drawEnd`)事件处理方法中,判断滑动的距离是否超过了删除按钮的一半宽度,如果超过了,则执行删除操作;否则,将视图组件恢复原位。 以上是使用原生的手势事件来实现滑动删除功能的方法。另外,uniapp也提供了组件`uni-swipe-action`来方便实现滑动删除效果。可以参考中提供的代码示例来使用`uni-swipe-action`组件实现滑动删除。在`uni-swipe-action`中,可以使用`left-options`和`right-options`来设置左滑和右滑出现的内容,同时可以监听`@change`事件来处理组件的打开或关闭操作。 综上所述,你可以根据需求选择使用原生手势事件或者`uni-swipe-action`组件来实现滑动删除功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【uni-app】uniapp如何实现左滑删除以及改造uni-ui中的swiperAction](https://blog.csdn.net/wuguidian1114/article/details/123683506)[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_1"}}] [.reference_item style="max-width: 50%"] - *2* [uni-app 实现滑动删除](https://blog.csdn.net/Lsp19980917/article/details/119043549)[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_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值