移动组件到指定坐标_react组件: 刮刮卡

此组件已经开发完毕,兼容pc和移动端

github地址:

dsmelon/react-scratch-perfect​github.com
aa3b7ae8068126d3808843074771da6e.png

例子:

刮一刮​dsmelon.github.io

讲一讲此组件的设计理念

调研了市面上的刮刮卡组件,优秀的也就那么几个,而且用起来总是少了一点功能,因此准备集大成做一款更灵活更容易使用的组件

本组件使用的是canvas画笔重叠属性。

第一步:将属性globalCompositeOperation设置为destination-out,这个意思就是当画的内容重叠时,保留不重叠的部分,重叠的部分则透明。

第二步:监听鼠标事件,开始画内容。这个有一个问题,就是使用lineTo连续画时,会莫名其妙的出现较多的锯齿,形状很奇怪,因此,我们需保留上次的坐标点,每次都先使用moveTo然后lineTo就能解决此问题

第三步:以上就是刮刮卡的核心了,然后我们需要判断一个完成态,这个让我思考了很久,首先就放弃了getImageData判断透明像素占比的方式,因为鼠标移动事件触发的频率很高,首先是性能问题,其次是容易出现跨域问题,所以放弃。最终我选择了性能最高而且比较靠谱的算法解决这个问题,首先我将画布分为10*10=100份,设置一个数组,判断鼠标轨迹划过的坐标,看看在哪些方格内,然后遍历这些方格,判断距离画笔点的距离小于一半的画笔尺寸,就将对应的数组位置设为true。这样很好的解决了性能和兼容问题,只是当画笔过小时,可能判断的就没有那么精准了,不过这种情况应该没有人用,如果需要更精确的百分比,可以分成20*20=400份,性能上应该也过得去。

第四步:核心部分完毕后,剩余的就是解决一些小问题了,比如canvas的抗锯齿,图片的填充方式,在图片未加载完毕前不显示底部文案,图片失败时使用颜色解决,鼠标移动时阻止屏幕滚动,限定奖品范围,移动过快时补充轨迹计算等等。

我自己体验了一下,还是比较满意的,有意见的话可以提issue,我继续迭代,谢谢大家支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值