uniapp 实现洗牌发牌的功能

本文介绍了如何在uniapp中利用自定义指令实现洗牌发牌的功能。首先,通过v-for创建3x3的页面布局,并设置view的样式,包括边框半径和背景图片。接着,利用自定义指令处理洗牌和发牌逻辑,通过注册全局或局部指令实现。同时,为解决牌按顺序一张张显示的问题,文章提到了动态绑定style的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先进行页面的布局,通过v-for 生成 3X3 的页面布局

<view class="card-item" v-for="list in 9" :key="list"></view>

为这些view item制定样式让他们生成我们想要的布局
我这里就生成 3 x 3 的布局

.card-item{
   width:30vm;
   heigth:40vm;
   margin-top:20rpx;
   transition:all 0.2s; 
}

你可以自己定义item的样式 例如添加圆角(border-radius:20rpx )
添加背景图片 background:url(图片的地址)
如果添加背景图片后,发现没有完全的显示图片,就需要再添加一个属性 background-size:100% 100%;
基本布局设计完成后 我们来实现洗牌发牌的功能

使用自定义指令实现洗牌发牌的功能

directives 可以注册全局的指令也可以注册局部的指令

directives:{
   trans:{ //自定义指令的名字
      componentUpdated(el,binding){ //钩子函数:componentUpdated 是指令所在组件的Vnode 及其子Vnode全部更新后调用
      //el binding 是钩子函数的参数 其中el是指令所绑定的元素,可以直接操作DOM
      //binding 是一个对象 包括name(指令名) value(指令的绑定值)
      if(binding.value){//洗牌的效果 
		   let temloca = document.querySelectorAll(".card-item")[4];//获取第五张牌的位置
		   let top = temloca.offsetTop;
		   let left = temloca.offsetLeft;
		   
		   //当前元素的坐标
		   let currTop = el.offsetTop;
		   let currLeft = el.offsetLeft;
			
			//相对像素差 也就是每个卡片移到中间(第五张卡片的位置)要移动的距离
			let disTop = top - currTop;
			let disLeft - left - currLeft;
			el.style.transform = `translate(${disTop}px,${disLeft}px)`;
			el.style.zIndex = Math.floor(Math.random()*9); //往中间插的时候随机插入
		}else{
				el.style.transform = `none`; //如果绑定值为false 就清空移动样式 也就完成了发牌的功能
			}
      }
   }
   }

自定义组件的使用 只要在view中用 v-trans绑定就可以了

最后还有一个小问题 就是发牌手牌不想要一块发出一块收回 想要按顺序一个一个来
拿着就要为这个view 动态绑定一个style

<view class="card-item" v-for="list in 9" :key="list" :style="{transitionDelay:`${list}*0.2`}s"></view>
//因为每一个卡片移动的时间是0.2s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值