map系列(一)——canvas

近期工作用到了map相关的一些知识,有些资料找起来着实费劲。忙里偷闲,顺手整理一下啦。(≧▽≦)/啦啦啦。

首先呢,是canvas。

❤先来个simple demo

涂鸦画板.png
❤实现功能:
  • 选择画笔颜色
  • 绘画
  • 橡皮擦
  • 清空画板
❤核心技能:
  • 获取鼠标在画板中的位置
  • canvas绘画

❤canvas相关

  • canvas是一个可以使用脚本在其中绘制图形的HTML元素。注意:无论canvas 上画多少东西,canvas都始终是单个元素。
  • canvas标签只有两个非通用属性width和height,canvas默认的大小为300*150.
  • canvas元素也和普通的元素一样,有margin,border,background等属性。
  • 如果在canvas绘制出来的图像是扭曲的,尝试在<canvas>的属性中明确规定宽和高,而不是使用CSS。
  • 基本用法
  • 元素引入
    <canvas id="canvas" width="600" height="400">
    <p>浏览器不支持canvas</p>
    </canvas>
  • 渲染上下文
    • canvas本身不具备画图形的功能,一切都是由canvas内部的CanvasRenderingContext2D对象来做的。
  • 绘制矩形
    • canvas只支持一种原生的图形绘制:矩形。所有其他图形的绘制都至少需要生成一条路径。

    • canvas提供三种绘制矩形的方法

      • fillRect(x,y,width,height) 绘制一个填充的矩形
      • strokeRect(x,y,width,height) 绘制一个矩形的边框
      • clearRect(x,y,width,height) 清除指定矩形矩形,让清除部分完全透明
    • 绘制线段
      1.开始路径 ctx.beginPath()
      2.设置起点 ctx.moveTo(x,y)
      3.设置终点 ctx.lineTo(x,y)
      4.绘制 ctx.stroke()
      5.结束路径 ctx.closePath()

    • 绘制三角形

      • 利用绘制线段的原理绘制三角形
    • 绘制弧形

    • 绘制弧形的参数分别是:弧形圆心x坐标、y坐标、半径、起始角(以三点钟的位置开始)、结束角、方向(true表示逆时针,false表示顺时针)

      • ctx.arc(600,200,100,0,Math.PI*2,false);
    • 绘制贝塞尔曲线:

      • 二次贝塞尔曲线:ctx.quadraticCurveTo (cpx, cpy, x, y)参数是控制点x坐标,控制点y坐标,结束点x坐标和结束点y坐标

      • 三次贝塞尔曲线 ctx.bezierCurveTo (cp1x, cp1y, cp2x, cp2y, x, y)参数是控制点1的x坐标和控制点1的y坐标、控制点2的x坐标和控制点2的y坐标、结束点x坐标和结束点y坐标

三次贝塞尔曲线绘制.png

❤完整代码如下,注释有详解

   <!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        
        #box{
            width: 600px;
            height: 500px;
            margin: 100px auto;
            border: 1px solid black;
        }
        
        #box .control{
            height: 100px;
        }
        
        #box .control div{
            height: 50px;
            line-height: 50px;
        }
        
        #box .control .changeColor{
            padding-left: 15px;
        }
        
        #box .control .changeColor input{
            width: 30px;
            height: 30px;
            margin: 0 15px;
            font-size: 0;
            /*background-color: orange;*/
            vertical-align: middle;
        }
        
        #box .control .changeColor input:nth-of-type(1){
            background-color: black;
        }
        
        #box .control .changeColor input:nth-of-type(2){
            background-color: pink;
        }
        
        #box .control .changeColor input:nth-of-type(3){
            background-color: red;
        }
        
        #box .control .changeColor input:nth-of-type(4){
            background-color: orange;
        }
        
        #box .control .changeColor input:nth-of-type(5){
            background-color: brown;
        }
        
        #box .control .changeColor input:nth-of-type(6){
            background-color: purple;
        }
        
        #box .control .clear{
            height: 50px;
        }
        
        #box .control .clear input{
            width: 100px;
            height: 50px;
            margin: 0 15px;
            font-size: 20px;
            background-color: #FDF5E5;
        }
        
        #canvas{
            background-color: #FFEBCB;
        }
        
        b{
            font-size: 20px;
        }
        
        
    </style>
</head>
<body>
    <div id="box">
        <div class="control">
            <div class="changeColor">
                选择画笔颜色:
                <input type="button" value="黑色" />
                <input type="button" value="粉色" />
                <input type="button" value="红色"/>
                <input type="button" value="橘色"/>
                <input type="button" value="棕色" />
                <input type="button" value="紫色" />
            </div>
            <div class="clear">
                <input type="button" value="清空画布" id="clearAllBtn" />
                当前选中的颜色:<b>黑色</b>
                <input type="button" value="橡皮擦" id="rubberBtn" />
            </div>
        </div>
        <canvas id="canvas" width="600" height="400"></canvas>
    </div>
    <script type="text/javascript">
        var cvs = document.querySelector("#canvas");
        var ctx = canvas.getContext("2d");      
        
        //记录坐标的对象(用来给move使用)
        var pointerObj = {
            
        }
        //切换橡皮擦的状态
        var isRubber = false;
        
        //按下
        cvs.addEventListener('mousedown', function (e) {
            var x = e.offsetX;
            var y = e.offsetY;
            
            console.log(x + " : " + y);
            
            pointerObj.x = x;
            pointerObj.y = y;
            
            if (isRubber) {
                //橡皮擦
                rubberFn(x, y); 
            } else {
                //画画
                draw(x, y);
            }
            
            
            //移动和抬起
            this.addEventListener('mousemove', move);
            this.addEventListener('mouseup', up);
        })
        
        //移动
        function move (e) {
            var x = e.offsetX;
            var y = e.offsetY;
            
            if (isRubber) {
                //橡皮擦
                rubberFn(x, y); 
            } else {
                //画画
                draw(x, y);
            }
            
            //在移动的时候把之前的存储起来
            pointerObj.x = x;
            pointerObj.y = y;
        }
        
        //抬起
        function up () {
            cvs.removeEventListener('mousemove', move);
        }
        
        //画画
        function draw (x, y) {
            ctx.beginPath();
            ctx.lineWidth = 5;
            //设置样式为圆头
            ctx.lineCap = "round";
            ctx.moveTo(x, y);
            ctx.lineTo(pointerObj.x, pointerObj.y);
            ctx.stroke();
            ctx.closePath();
        }
        
        var colorBtns = document.querySelectorAll('.changeColor input');
        for (var i = 0; i < colorBtns.length; i++) {
            colorBtns[i].onclick = changeColor;
        }
        
        //改变画笔颜色
        function changeColor () {
            ctx.strokeStyle = getComputedStyle(this, null).backgroundColor;
            var b = document.querySelector("b");
            b.style.color = ctx.strokeStyle;
            b.innerHTML = this.value;
            
            //改变橡皮擦的状态
            isRubber = false;
        }
        
        var clearAllBtn = document.querySelector("#clearAllBtn");
        var rubberBtn = document.querySelector("#rubberBtn");
        
        //清空画布
        clearAllBtn.onclick = function () {
            ctx.clearRect(0, 0, cvs.width, cvs.height);
        }
        
        //橡皮擦按钮
        rubberBtn.onclick = function () {
            //开启橡皮擦功能
            isRubber = true;
        }
        
        //橡皮擦功能
        function rubberFn (x, y) {
            ctx.beginPath();
            //裁剪之前先把当前场景保存下来
            ctx.save();
            //裁剪区域
            ctx.arc(x, y, 20, 0, Math.PI * 2, false);
            //裁剪
            ctx.clip();
            //在裁剪之后画一个清空矩形,但根据裁剪的原理,只有在裁剪区域才生效
            ctx.clearRect(0, 0, cvs.width, cvs.height);
            //然后在还原之前的场景
            ctx.restore();
            ctx.closePath();
        }
        
        
        
        
    </script>
</body>
</html>
❤推荐一个特别赞的学习canvas的网站,简直不能再完美http://bucephalus.org/text/CanvasHandbook/CanvasHandbook.html
❤下次见.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 一:canvas简介 1.1什么是canvas? ①:canvas是HTML5提供的一种新标签 ②:HTML5 ...
    GreenHand1阅读 4,661评论 2 32
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,935评论 3 40
  • 神奇且强大的canvas 一.Canvas的基本介绍 1.什么是Canvas 定义:是HTML5提供的一种新标签,...
    Ainy尘世繁花终凋落阅读 10,710评论 1 18
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,492评论 0 4
  • 第一天,我打开了窗 没有月亮、星星的夜晚 我看见,你在闪闪发光 第二天,我在窗台放了一盆花 我最爱的一朵白蔷薇 今...
    西巷旧时阅读 140评论 2 13