原生 canvas 实现一个画板案例

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<style>
    #huaban {
        display: inline-flex;
        justify-content: space-between;
        width: 500px;
        height: 40px;
        align-items: center;
    }
    #huaban>div {
        width: 30px;
        height: 30px;
        text-align: center;
        line-height: 40px;
    }
</style>

<body>

    <canvas width="500" height="500" style="border:1px solid;"></canvas>
    <div id="huaban">
        <input type="range" id="range" value="1">
        <input type="submit" value="擦除" id="button">
        <input type="color" id="color">
    </div>


    <script>

        const canvas = document.querySelector('canvas');               //获取画布
        let ctx = canvas.getContext('2d');                      //声明画布的描绘类型为,2D绘图

  
       
        //画布

        canvas.onmousedown = function (event) {         //当我在canvas,里面,有一个鼠标按下时,就触发的的事件
            // 获取起始坐标
            ctx.moveTo(event.offsetX, event.offsetY);    //线条的起点坐标就是,我点下时,鼠标相对于事件源的坐标

            canvas.onmousemove = function (event) {          //然后当鼠标按住不动,开始移动,触发鼠标移动事件
                ctx.lineTo(event.offsetX, event.offsetY);   //这时候,线条移动到的位置,就等于,鼠标移动到某个点时的坐标,随着鼠标的移动不断变化,就相当于用画笔画图
                ctx.strokeStyle = see;           //线条的颜色,等于,获取到颜色的变量
                ctx.lineWidth = liwidht;                         //线条的粗细值,等于,储存获取数值的变量
                ctx.stroke();                 //描绘
            }
            document.onmouseup = function () {             //当鼠标松开时,就取消鼠标的移动事件,停止继续画线
                canvas.onmousemove = null
            }
            ctx.beginPath();    //        清除路径列表,让每条线之间的样式互不影响
        }

        //颜色
        let see = null;                 //声明一个变量,用来放获取的颜色
        color.onchange = function () {        //当input标签,失焦时,触发一个事件
            see = color.value;              //获取到的input,value,颜色存到声明的变量里面
        }

        // 字体大小

        let liwidht = 1           //声明一个变量,存放线条粗细的数值         
        range.onchange = function () {                                //有一个鼠标失焦触发的的事件
            liwidht = parseInt(range.value / 10);        //粗细,我们这里取1-10,由于input,滑块的默认最大值是100,所以我们这里,把获取到的input值,除以10,并且取整一下。
            if (liwidht < 1) {                           //判断一下,如果,当取值小于1时,那么它的值,就为一,意思就是,线段,的粗细值,最小为1
                liwidht = 1
            }
        }
        //擦除
        button.onclick = function () {                 //当我点击擦除按钮后,有一个擦除,清屏事件,
            ctx.clearRect(0, 0, canvas.width, canvas.height);                 //括号里是,擦除的起点坐标,为左上角的0点位置,擦除的范围是,整个画布的宽和高
        }
    </script>

</body>

</html>

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧梦星轨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值