PC端&移动端:canvas三种方式实现刮刮乐(上)
许久没记录了,最近忙着找工作焦头烂额,代码早就写好了一直没空笔记。
言归正传!今天说一说canvas,值得开心的是终于知道自己还是对图像处理,动画制作,数据可视化更感兴趣!之后会再研究多一些,比如SVG啦,WebGL,D3,three.js,etc~
做这个刮刮乐的时候也找了些资料,先把代码效果给出来:查看效果 就是模仿那种纸片,带有涂层,刮开显示中奖否的效果,在外卖啊支付宝啊经常见,所以自己也试着做个。
html和css部分
首先创建一个500x100的div用来包裹涂层和涂层下面的图片:1
2
3
4<div class="scratcher">
<img class="img" src="prize.jpg">
<canvas class="canvas" width="500px" height="150px" id="canvas"></canvas>
</div>
图片一般选的都不是正好这么大,所有给父级div一个overflow: hidden
,再将图片定位调整下就可以咯。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23.scratcher {
width: 500px;
height: 150px;
position: absolute;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
/*以上这些用于将整个canvas在页面正中间也就是垂直水平居中*/
overflow: hidden;
}
.img {
position: absolute;
top: -40px;
left: -50px;
}
.canvas {
position: absolute;
}
因为canvas和父级div宽高相同,我的书写习惯又是不喜欢行内css,所有开始我是这么写的1
2
3
4
5.scratcher,
.canvas {
width: 500px;
height: 150px;
}
貌似没什么区别,但是!但是!
后面test的时候先在涂层上画了个正方形,发现却不是正方形!长宽明显不一样!整个canvas边沿也很模糊,好像被拉伸的样子!检查了n次代码!戳了n次自己的眼睛!就是不对!
最后把代码还原到最原始形态,包括canvas宽高放回了行内,发现好了!试了几次果然是因为这两个属性!妈卖批为毛!有什么区别!查了资料,才得知
这样画布就会失真,并且里面画的东西也会变形,所以画布的尺寸还是在canvas行内设置