老师看看这个

老师看看这个

点击事件怎么没有效果

<!DOCTYPE html>

<html lang="en">


<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

<style>

* {

padding: 0;

margin: 0;

}


input {

outline: none;

border: none;


}


.box {

position: absolute;

left: 30px;

top: 50px;

width: 300px;

height: 250px;

background-color: gray;

}


input {

display: inline-block;

border-radius: 8px;

width: 200px;

height: 25px;

line-height: 25px;

margin: 10px 50px 10px 50px;

text-indent: 15px;

}


.btn {

width: 86px;

margin: 20px 107px 50px 107px;

text-align: center;

text-indent: 0;

background-color: black;

color: white

}


canvas {

position: absolute;

left: 330px;

top: 50px;

background-color: blanchedalmond;

}

</style>

</head>


<body>

<div class="box" id="box">

<input type="text" placeholder="姓名" id="username">

<input type="text" placeholder="地址" id=addr>

<input type="text" placeholder="职业" id=job>

<input type="text" placeholder="口号" id="slogn">

<input type="button" value="生成名片" class="btn" id="btn">

</div>

<canvas id="canvas" width="600" height="250"></canvas>

<script>

var ctx = canvas.getContext("2d");

var linear = ctx.createLinearGradient(250, 40, 400, 40,);

linear.addColorStop(0, "black");


linear.addColorStop(1, "gray");

ctx.fillStyle = linear;

ctx.translate(80, 80);

ctx.fillRect(0, 0, 400, 80);

var img = new Image();

img.src = "logo.png";

img.onload = function () {

ctx.drawImage(img, 0, 0, 40, 40, 10, 5, 70, 70);

}

var namevalue = "", addvalue = "", jobvalue = "", slognvalue = "";

ctx.fillStyle = 'white';

namevalue = '请输入姓名';

ctx.font = "23px sans-serif ";

ctx.fillText(namevalue, 80, 25);


ctx.fillStyle = 'white';

addvalue = '请输入地址';

ctx.font = "15px sans-serif ";

ctx.fillText(addvalue, 80, 50);


ctx.fillStyle = 'white';

jobvalue = '请输入职业';

ctx.font = "15px sans-serif ";

ctx.fillText(jobvalue, 80, 70);


ctx.save();

ctx.fillStyle = 'white';

slognvalue = '请输入口号';

ctx.font = "15px sans-serif ";

ctx.rotate(-Math.PI / 60);

ctx.fillText(slognvalue, 250, 55);

ctx.restore();



btn.onclick = function () {

console.log(1);

namevalue = username.value;

addvalue = addr.value;

jobvalue = job.value;

slognvalue = slogn.value;

}




</script>

</body>


</html>


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
好帮手慕言 2020-07-29 16:57:01

同学你好,解答如下:

1、初始时卡片上是有内容的

http://img1.sycdn.imooc.com//climg/5f213a3f09bec0e702820076.jpg

在输入框中填入内容,点击“生成名片”按钮,会把点击事件里面的代码执行一遍,也就是把画布中所有的内容都绘制一遍,因为内容的位置是一样的,所以就会发生覆盖。

2、Math.PI代表的是180度,ctx.rotate(-Math.PI / 60);这样写相当于逆时针旋转了3度,

ctx.rotate(-Math.PI / 3)这样写相当于逆时针旋转了60度。在绘制口号时,开始绘制文本的 x 坐标位置是250,y坐标是55,导致溢出了画布,就不会显示了

http://img1.sycdn.imooc.com//climg/5f2133d7099b392a04770063.jpg

如果同学想看到画布坐标系旋转60度是什么样子的,可以修改下x和y的坐标,例如:

http://img1.sycdn.imooc.com//climg/5f2134b909107cb704670087.jpg

口号绘制在起点的效果:

http://img1.sycdn.imooc.com//climg/5f2134cf09ef5f2502050096.jpg

祝学习愉快~

好帮手慕言 2020-07-29 13:42:12

同学你好,如果把下方代码去掉

http://img1.sycdn.imooc.com//climg/5f210be2097a02e209130288.jpg

那么输入内容之后,点击“生成名片”按钮,内容会覆盖,如下:

http://img1.sycdn.imooc.com//climg/5f210bcf09e21a2602770109.jpg

所以建议先清空画布,再重新绘制。

祝学习愉快~

  • 提问者 慕标5156652 #1
    哎 你没get到我问的重点 我说的是 为什么要清空 你说不清空就会覆盖 那你也不说为啥要覆盖啊?
    2020-07-29 15:19:04
好帮手慕言 2020-07-29 09:41:40

同学你好,代码从上往下执行,同学的代码中在点击事件里面对namevalue等变量赋值,赋值完之后代码不会再执行 fillText方法,也就不会修改页面上显示的内容,因此,可以把代码放到点击事件里面。

在点击事件中清空了画布,所以在点击事件里面又写了一遍背景的线性渐变和绘制logo。

祝学习愉快~

  • 提问者 慕标5156652 #1
    为什么要在点击事件里面清空画布
    2020-07-29 10:21:46
好帮手慕言 2020-07-28 18:38:36

同学你好,关于同学的疑问,解答如下:

1、点击事件是生效的,页面没有变化,是因为书写的有问题,可以参考下方修改:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        input {
            outline: none;
            border: none;
        }

        .box {
            position: absolute;
            left: 30px;
            top: 50px;
            width: 300px;
            height: 250px;
            background-color: gray;
        }

        input {
            display: inline-block;
            border-radius: 8px;
            width: 200px;
            height: 25px;
            line-height: 25px;
            margin: 10px 50px 10px 50px;
            text-indent: 15px;
        }

        .btn {
            width: 86px;
            margin: 20px 107px 50px 107px;
            text-align: center;
            text-indent: 0;
            background-color: black;
            color: white
        }

        canvas {
            position: absolute;
            left: 330px;
            top: 50px;
            background-color: blanchedalmond;
        }
    </style>
</head>

<body>
    <div class="box" id="box">
        <input type="text" placeholder="姓名" id="username">
        <input type="text" placeholder="地址" id="addr">
        <input type="text" placeholder="职业" id="job">
        <input type="text" placeholder="口号" id="slogn">
        <input type="button" value="生成名片" class="btn" id="btn">
    </div>
    <canvas id="canvas" width="600" height="250"></canvas>
    <script>
        var ctx = canvas.getContext("2d");
        var linear = ctx.createLinearGradient(250, 40, 400, 40, );
        linear.addColorStop(0, "black");
        linear.addColorStop(1, "gray");
        ctx.fillStyle = linear;
        ctx.translate(80, 80);
        ctx.fillRect(0, 0, 400, 80);
        var img = new Image();
        img.src = "logo.png";
        img.onload = function () {
            ctx.drawImage(img, 0, 0, 40, 40, 10, 5, 70, 70);
        }
        btn.onclick = function () {
            ctx.clearRect(0, 0, 400, 80);
            // 背景的线性渐变
            var linearGradient = ctx.createLinearGradient(0, 0, 400, 80);
            linearGradient.addColorStop(0, "black");
            linearGradient.addColorStop(1, "gray");
            ctx.fillStyle = linearGradient;
            ctx.fillRect(0, 0, 400, 80);
            ctx.drawImage(img, 0, 0, 40, 40, 10, 5, 70, 70);
            var namevalue = "",
                addvalue = "",
                jobvalue = "",
                slognvalue = "";
            ctx.fillStyle = 'white';
            namevalue = document.getElementById("username").value || '请输入姓名';
            ctx.font = "23px sans-serif ";
            ctx.fillText(namevalue, 80, 25);
            ctx.fillStyle = 'white';
            addvalue = document.getElementById("addr").value || '请输入地址';
            ctx.font = "15px sans-serif ";
            ctx.fillText(addvalue, 80, 50);
            ctx.fillStyle = 'white';
            jobvalue = document.getElementById("job").value || '请输入职业';
            ctx.font = "15px sans-serif ";
            ctx.fillText(jobvalue, 80, 70);
            ctx.save();
            ctx.fillStyle = 'white';
            slognvalue = document.getElementById("slogn").value || '请输入口号';
            ctx.font = "15px sans-serif ";
            ctx.rotate(-Math.PI / 60);
            ctx.fillText(slognvalue, 250, 55);
            ctx.restore();
            console.log(namevalue)
            // console.log(1);
            // namevalue = username.value;
            // addvalue = addr.value;
            // jobvalue = job.value;
            // slognvalue = slogn.value;
        }
        btn.onclick()
    </script>
</body>

</html>

2、如果写成ctx.rotate(-Math.PI /3),那么就显示到页面的外面了,会看不到。

如果我的回答帮到了你,欢迎采纳,祝学习愉快~

  • 提问者 慕标5156652 #1
    你的帮助没有帮助到我 书写哪里有问题? 我这样写不行?为啥不行?为什么要像你那样书写 var linearGradient = ctx.createLinearGradient(0, 0, 400, 80); linearGradient.addColorStop(0, "black"); linearGradient.addColorStop(1, "gray"); ctx.fillStyle = linearGradient; ctx.fillRect(0, 0, 400, 80); ctx.drawImage(img, 0, 0, 40, 40, 10, 5, 70, 70); 还有就是前面已经设置了渐变 为啥要clear 在设置一遍? 还有那个drawimage怎么又来一遍?
    2020-07-28 22:22:26
提问者 慕标5156652 2020-07-28 15:57:16

还有这行代码ctx.rotate(-Math.PI / 60);为什么不可以写成ctx.rotate(-Math.PI /3)

  • 提问者 慕标5156652 #1
    这两个旋转的度数不一样? 为啥一个跑在外面去了? Math.PI 这个不是代表180度吗? 这个ctx.rotate(-Math.PI / 60) 和 ctx.rotate(-Math.PI /3)有什么区别?
    2020-07-28 22:25:05
  • 提问者 慕标5156652 #2
    ?????
    2020-07-29 10:43:14
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师