请老师检查,雪花的绘制是看了老师的源码案例才想到,不完全是自己写出来的能达到学习效果吗?
来源:9-3 完成案例动画部分
龍巛幽
2020-03-20 18:43:09
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>canvas案例</title>
<style>
.content{
width: 1000px;
height: 285px;
margin: 100px auto;
}
.input-content{
width: 300px;
height: 248px;
background-color: #a4a19a;
padding-top: 37px;
float: left;
}
.text{
width: 255px;
height: 23px;
font-size: 10px;
background-color: #fff;
padding-left: 10px;
border: none;
border-radius: 12px;
outline: none;
margin: 0 18px 22px;
}
.submit{
width: 84px;
height: 23px;
font-size: 10px;
background-color: #232124;
border-radius: 12px;
border: none;
outline: none;
color: #fff;
margin-left: 108px;
cursor: pointer;
}
.canvas-content{
width: 700px;
height: 100%;
background-color: #f0e9d6;
float: left;
}
.card{
margin: 75px 100px;
border: 1px solid red;
}
</style>
</head>
<body>
<div class="content">
<div class="input-content">
<input type="text" class="text" placeholder="姓名" id="name" autocomplete="off" maxlength="6">
<input type="text" class="text" placeholder="地址" id="adds" autocomplete="off" maxlength="10">
<input type="text" class="text" placeholder="职业" id="work" autocomplete="off" maxlength="10">
<input type="text" class="text" placeholder="口号" id="slogan" autocomplete="off" maxlength="10">
<button class="submit" id="subBtn">生成名片</button>
</div>
<div class="canvas-content">
<canvas class="card" id="animationCanvas" width="500px" height="76px">
您的浏览器不支持canvas
</canvas>
<canvas class="card" id="canvas" width="500px" height="76px" style="display: none;">
您的浏览器不支持canvas
</canvas>
</div>
</div>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext('2d');
var btn = document.getElementById('subBtn'),
nameNode = document.getElementById('name'),
addsNode = document.getElementById('adds'),
workNode = document.getElementById('work'),
sloganNode = document.getElementById('slogan');
//设置btn点击事件
btn.onclick = function () {
if(nameNode.value != /\s+/.exec(nameNode.value) && addsNode.value != /\s+/.exec(addsNode.value) && workNode.value != /\s+/.exec(workNode.value) && sloganNode.value != /\s+/.exec(sloganNode.value)){
ctx.clearRect(0, 0, canvas.width, canvas.height);
var nameStr = nameNode.value || '请输入姓名',
addsStr = addsNode.value || '请输入地址',
workStr = workNode.value || '请输入职业',
sloganStr = sloganNode.value || '请输入口号';
//创建canvas渐变色背景
var linearGradient = ctx.createLinearGradient(0,38,500,38);
linearGradient.addColorStop(0,'#000');
linearGradient.addColorStop(.5,'#000');
linearGradient.addColorStop(1,'grey');
ctx.fillStyle = linearGradient;
ctx.fillRect(0,0,canvas.width,canvas.height);
//设置图片
var img = new Image();
img.src = 'http://climg.mukewang.com/59859f4d00014f1503000100.jpg';
img.onload = function () {
ctx.drawImage(img,20,11,80,81,0,0,78,78);
}
//设置文字
ctx.fillStyle = '#fff';
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.save();
ctx.font = 'bold 22px 微软雅黑';
ctx.fillText(nameStr,93,10);
ctx.restore();
ctx.save();
ctx.font = 'bold 14px 微软雅黑';
ctx.fillText(addsStr,93,37);
ctx.fillText(workStr,93,56);
//获取name长度 设置基础值和增加方式
var nameStrWidth = ctx.measureText(nameStr).width,
sloganPositionX = 245,
sloganX = nameStrWidth + sloganPositionX;
//设置旋转文字
//设置阴影
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.shadowColor = '#000';
ctx.shadowBlur = 2;
ctx.rotate(- Math.PI / 30);
ctx.fillText(sloganStr,sloganX,67);
ctx.restore();
//设置曲线
ctx.save();
//设置阴影
ctx.shadowOffsetX = 5;
ctx.shadowOffsetY = 5;
ctx.shadowColor = '#000';
ctx.shadowBlur = 2;
//获取口号长度 设置长度方式
var sloganStrWidth = ctx.measureText(sloganStr).width,
linePositionX = 350;
lineToX = sloganStrWidth + linePositionX;
ctx.beginPath();
ctx.strokeStyle = '#fff';
ctx.moveTo(sloganX,58);
ctx.quadraticCurveTo(sloganX,47,lineToX + sloganX - 320,45);
ctx.stroke();
ctx.restore();
}else{
alert('内容不能为空格');
}
};
btn.click();
//创建动画canvas
var aCanvas = document.getElementById("animationCanvas");
var aCtx = aCanvas.getContext('2d');
var snow = [];
setInterval(function () {
// 清除动画画布
aCtx.clearRect(0,0,500,76);
// 重新在动画画布上绘制名片
aCtx.drawImage(canvas,0,0,500,76);
// 创建雪花
for(var i = 0; i <= 10; i ++) {
if(!snow[i]) {
snow[i] = {};// 把雪花的各项数据存放在一个对象内
snow[i].radius = Math.floor(Math.random() * 5) + 1; // 半径
snow[i].y = - snow[i].radius - Math.floor(Math.random() * 10); // y坐标
snow[i].x = i * 50 + Math.floor(Math.random() * 10) - 5; // x坐标
snow[i].vy = Math.floor(Math.random() * 2) + 1; // 下落速度
}
aCtx.beginPath();
aCtx.arc(snow[i].x, snow[i].y, snow[i].radius, 0, Math.PI * 2);
aCtx.fillStyle = "rgba(255, 255, 255, 0.5)";
aCtx.fill();
snow[i].y = snow[i].y + snow[i].vy;
if(snow[i].y > aCtx.canvas.height + snow[i].radius * 2) {
snow[i] = undefined;
}
}
},70);
</script>
</body>
</html>长度计算的部分写的有点low,雪花的绘制也是看了老师的源码案例才想到,不完全是自己写出来的能达到学习效果吗?
1回答
同学你好,代码实现的正确,很棒 !同学才刚入门,没有实际的经验,所以能够仿照别人的实现,就是一个很不错的开头。学习就是一个循序渐进的过程,当我们刚入门的时候,就是要先学会照着别人的代码去写,到基础慢慢提升了,要学习别人的思路,仿照思路去实现。等到技术达到一定的高度,就能有自己的思路独立去写了。
另外,Canvas还是有难度的,不过在实际开发中不用,简单的练习一下就好。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
相似问题