关于案例的问题
HTML代码
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>生成名片</title> <link rel="stylesheet" href="style.css"> </head> <body> <div class="main"> <div class="left"> <div> <input type="text" placeholder="姓名" id="name"> <input type="text" placeholder="地址" id="address"> <input type="text" placeholder="职业" id="work"> <input type="text" placeholder="口号" id="call"> </div> <input type="button" id="progress" class="progress" value="生成口号"> </div> <div class="right"> <canvas id="canvas" class="canvas" width="600px" height="100px"> 您的浏览器不支持canvas </canvas> <canvas id="offCanvas" class="canvas" width="600px" height="100px"> 您的浏览器不支持canvas </canvas> </div> </div> <script src="style.js"></script> </body> </html>
Css代码
* { margin: 0; padding: 0; } .main { width: 1200px; height: 400px; margin: 100px auto; } /*输入信息栏*/ .left { float: left; width: 400px; height: 400px; background: gray; } .right { float: right; width: 800px; height: 400px; background: yellow; } .left > div { margin: 50px; } .left > div > input { display: block; appearance:none; outline: medium; /*outline:medium用于去除输入框获得焦点所产生的蓝色边框*/ width: 300px; height: 30px; margin: 30px auto; border-radius: 20px; border:1px solid white; padding-left: 20px; } .left > .progress { display: block; width: 150px; height: 30px; margin: 0 auto; outline: medium; color: white; background: black; border:none; border-radius: 20px; cursor: pointer; } /*名片显示栏*/ .canvas { margin: 100px 0 0 100px; background:linear-gradient(to right,black 60%,gray 100%); }
Js代码
(function () { // 画布 var canvas = document.querySelector("#canvas"); var ctx = canvas.getContext("2d"); var offCanvas = document.querySelector("#offCanvas"); var offCtx = offCanvas.getContext("2d"); var viewName = "请输入姓名"; var viewAddress = "请输入地址"; var viewWork = "请输入职业"; var viewCall = "请输入口号"; var radialX = 10, radialY = -10, dir = 1; offCtx.fillStyle = "rgba(255,255,255,0.5)"; setInterval(function () { radialY += 10 * dir; offCtx.clearRect(0,0,offCanvas.width,offCanvas.height); offCtx.beginPath(); offCtx.arc(radialX,radialY,10,0,Math.PI * 2,true); offCtx.fill(); if (radialY >= offCanvas.height + 20) { radialY = -10; }else if (radialY <= -30) { dir = 1; } },200); function view() { var img = new Image(); img.src = "59859f4d00014f1503000100.jpg"; img.onload = function () { ctx.drawImage(img,0,0,100,100,-30,-10,120,120); } ctx.save(); ctx.beginPath(); ctx.font = "30px 微软雅黑" ctx.fillStyle = "white"; ctx.fillText(viewName,110,35); ctx.beginPath(); ctx.font = "20px 微软雅黑"; ctx.fillText(viewAddress,110,60); ctx.beginPath(); ctx.font = "20px 微软雅黑"; ctx.fillText(viewWork,110,85); ctx.beginPath(); ctx.shadowOffsetX = 0; ctx.shadowOffsetY = 10; ctx.shadowColor = "rgba(0,0,0,0.8)"; ctx.translate(400,0); ctx.rotate(-(Math.PI / 18)); ctx.font = "20px 微软雅黑"; ctx.fillText(viewCall,0,65); var callWidth = ctx.measureText(viewCall).width; ctx.lineWidth = 2; ctx.strokeStyle = "white"; ctx.moveTo(2, 90); ctx.quadraticCurveTo(7, 70, callWidth, 70); ctx.stroke(); ctx.restore(); } view(); // 信息显示 var name = document.querySelector("#name"); var address = document.querySelector("#address"); var work = document.querySelector("#work"); var call = document.querySelector("#call"); var progress = document.querySelector("#progress"); progress.onclick = function () { if (name.value == "" || address.value == "" || work.value == "" || call.value == "") { alert("请将信息填写完整"); }else { ctx.clearRect(0,0,600,100); viewName = name.value; viewAddress = address.value; viewWork = work.value; viewCall = call.value; view(); } } })();
图片:
问题:为什么ctx.drawImage(offCanvas,0,0,offCanvas.width,offCanvas.height,0,0,canvas.width,canvas.height);放在定时器里面能运行,放在外面就不管用了呢?
28
收起
正在回答
2回答
是呀,第二个canvas画布是动态的,但是应该把静态的作为离屏添加到动态上面,如果你ctx.drawImage(offCanvas,0,0,offCanvas.width,offCanvas.height,0,0,canvas.width,canvas.height);这么写,就是把动态的作为离屏添加的动态的上去了,测试是不成功的,或者你如果测试成功了,可以粘贴过来,大家分享下。所以你可以把静态的作为离屏添加到动态上面。
还有就是要使用定时器才能实现雪花效果,但是定时器中也有清除呀,你如果把添加离屏的操作写在计时器外面,那么只执行一次就被清除掉了,所以才需要在计时器中,清除一次,就添加一次。
HTML5&CSS3进阶与常用框架 2018
- 参与学习 315 人
- 提交作业 136 份
- 解答问题 626 个
如果你有H5、CSS3、JS基础,热爱前端并希望在前端应用方面不断进步,那就来吧,本路径为你带来的课程有HTML5进阶、CSS3进阶、JS面向对象、jQ基础、Less等,助你进一步提升前端开发技能
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星