关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » HTML5 »超酷的HTML5 Canvas网络画板教程

    超酷的HTML5 Canvas网络画板教程

    2014-09-06 00:00:00 出处:ITJS
    分享

    在今天的HTML教程里,大家要学习一下如何使用HTML5 Canvas实现一个超酷而又简单的网络画板功能。在这个教程中,我们可以选择笔刷的类型、笔刷的大小以及笔刷的颜色,当然作为画板还需要很多功能,这里只是最基本的绘制功能,大家可以自己实现类似矩形、椭圆等复杂元素的绘制。

    html5-canvas-draw

    你也可以再这里查看DEMO演示

    下面我们来简单地分析一下实现这个HTML5网页画板的原理及代码,代码由HTML以及Javascript组成,主要还是Javascript代码。

    HTML代码:

    <div style="width:530px;margin:10px auto">
        <div id="canvasDiv"></div>
    </div>

    HTML代码非常简单,仅仅是构造了一个canvas容器,我们的画板就在这个地方生成。

    Javascript代码:

    首先我们通过一组变量来定义画板的样式,以及一些数据的初始化:

    var canvas;
    var context;
    var canvasWidth = 490;
    var canvasHeight = 220;
    var padding = 25;
    var lineWidth = 8;
    var colorPurple = "#cb3594";
    var colorGreen = "#659b41";
    var colorYellow = "#ffcf33";
    var colorBrown = "#986928";
    var outlineImage = new Image();
    var crayonImage = new Image();
    var markerImage = new Image();
    var eraserImage = new Image();
    var crayonBackgroundImage = new Image();
    var markerBackgroundImage = new Image();
    var eraserBackgroundImage = new Image();
    var crayonTextureImage = new Image();
    var clickX = new Array();
    var clickY = new Array();
    var clickColor = new Array();
    var clickTool = new Array();
    var clickSize = new Array();
    var clickDrag = new Array();
    var paint = false;
    var curColor = colorPurple;
    var curTool = "crayon";
    var curSize = "normal";
    var mediumStartX = 18;
    var mediumStartY = 19;
    var mediumImageWidth = 93;
    var mediumImageHeight = 46;
    var drawingAreaX = 111;
    var drawingAreaY = 11;
    var drawingAreaWidth = 267;
    var drawingAreaHeight = 200;
    var toolHotspotStartY = 23;
    var toolHotspotHeight = 38;
    var sizeHotspotStartY = 157;
    var sizeHotspotHeight = 36;
    var sizeHotspotWidthObject = new Object();
    sizeHotspotWidthObject.huge = 39;
    sizeHotspotWidthObject.large = 25;
    sizeHotspotWidthObject.normal = 18;
    sizeHotspotWidthObject.small = 16;
    var totalLoadResources = 8;
    var curLoadResNum = 0;

    接下来开始准备画布,也就是初始化Canvas对象:

    function prepareCanvas()
    {
        // Create the canvas (Neccessary for IE because it doesn't know what a canvas element is)
        var canvasDiv = document.getElementById('canvasDiv');
        canvas = document.createElement('canvas');
        canvas.setAttribute('width', canvasWidth);
        canvas.setAttribute('height', canvasHeight);
        canvas.setAttribute('id', 'canvas');
        canvasDiv.appendChild(canvas);
        if(typeof G_vmlCanvasManager != 'undefined') {
            canvas = G_vmlCanvasManager.initElement(canvas);
        }
        context = canvas.getContext("2d"); // Grab the 2d canvas context
        // Note: The above code is a workaround for IE 8 and lower. Otherwise we could have used:
        //     context = document.getElementById('canvas').getContext("2d");
    
        // Load images
        // -----------
        crayonImage.onload = function() { resourceLoaded(); 
        };
        crayonImage.src = "images/crayon-outline.png";
        //context.drawImage(crayonImage, 0, 0, 100, 100);
    
        markerImage.onload = function() { resourceLoaded(); 
        };
        markerImage.src = "images/marker-outline.png";
    
        eraserImage.onload = function() { resourceLoaded(); 
        };
        eraserImage.src = "images/eraser-outline.png";    
    
        crayonBackgroundImage.onload = function() { resourceLoaded(); 
        };
        crayonBackgroundImage.src = "images/crayon-background.png";
    
        markerBackgroundImage.onload = function() { resourceLoaded(); 
        };
        markerBackgroundImage.src = "images/marker-background.png";
    
        eraserBackgroundImage.onload = function() { resourceLoaded(); 
        };
        eraserBackgroundImage.src = "images/eraser-background.png";
    
        crayonTextureImage.onload = function() { resourceLoaded(); 
        };
        crayonTextureImage.src = "images/crayon-texture.png";
    
        outlineImage.onload = function() { resourceLoaded(); 
        };
        outlineImage.src = "images/watermelon-duck-outline.png";
    
        // Add mouse events
        // ----------------
        $('#canvas').mousedown(function(e)
        {
            // Mouse down location
            var mouseX = e.pageX - this.offsetLeft;
            var mouseY = e.pageY - this.offsetTop;
    
            if(mouseX < drawingAreaX) // Left of the drawing area
            {
                if(mouseX > mediumStartX)
                {
                    if(mouseY > mediumStartY && mouseY < mediumStartY + mediumImageHeight){
                        curColor = colorPurple;
                    }else if(mouseY > mediumStartY + mediumImageHeight && mouseY < mediumStartY + mediumImageHeight * 2){
                        curColor = colorGreen;
                    }else if(mouseY > mediumStartY + mediumImageHeight * 2 && mouseY < mediumStartY + mediumImageHeight * 3){
                        curColor = colorYellow;
                    }else if(mouseY > mediumStartY + mediumImageHeight * 3 && mouseY < mediumStartY + mediumImageHeight * 4){
                        curColor = colorBrown;
                    }
                }
            }
            else if(mouseX > drawingAreaX + drawingAreaWidth) // Right of the drawing area
            {
                if(mouseY > toolHotspotStartY)
                {
                    if(mouseY > sizeHotspotStartY)
                    {
                        var sizeHotspotStartX = drawingAreaX + drawingAreaWidth;
                        if(mouseY < sizeHotspotStartY + sizeHotspotHeight && mouseX > sizeHotspotStartX)
                        {
                            if(mouseX < sizeHotspotStartX + sizeHotspotWidthObject.huge){
                                curSize = "huge";
                            }else if(mouseX < sizeHotspotStartX + sizeHotspotWidthObject.large + sizeHotspotWidthObject.huge){
                                curSize = "large";
                            }else if(mouseX < sizeHotspotStartX + sizeHotspotWidthObject.normal + sizeHotspotWidthObject.large + sizeHotspotWidthObject.huge){
                                curSize = "normal";
                            }else if(mouseX < sizeHotspotStartX + sizeHotspotWidthObject.small + sizeHotspotWidthObject.normal + sizeHotspotWidthObject.large + sizeHotspotWidthObject.huge){
                                curSize = "small";                        
                            }
                        }
                    }
                    else
                    {
                        if(mouseY < toolHotspotStartY + toolHotspotHeight){
                            curTool = "crayon";
                        }else if(mouseY < toolHotspotStartY + toolHotspotHeight * 2){
                            curTool = "marker";
                        }else if(mouseY < toolHotspotStartY + toolHotspotHeight * 3){
                            curTool = "eraser";
                        }
                    }
                }
            }
            else if(mouseY > drawingAreaY && mouseY < drawingAreaY + drawingAreaHeight)
            {
                // Mouse click location on drawing area
            }
            paint = true;
            addClick(mouseX, mouseY, false);
            redraw();
        });
    
        $('#canvas').mousemove(function(e){
            if(paint==true){
                addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);
                redraw();
            }
        });
    
        $('#canvas').mouseup(function(e){
            paint = false;
              redraw();
        });
    
        $('#canvas').mouseleave(function(e){
            paint = false;
        });
    }

    看起来很复杂,前面主要是初始化canvas的背景图片,后面主要是初始化画笔事件,像click、mouseup、mouseleave等鼠标事件。

    下面是draw的主要方法:

    function redraw()
    {
        // Make sure required resources are loaded before redrawing
        if(curLoadResNum < totalLoadResources){ return; }
    
        clearCanvas();
    
        var locX;
        var locY;
        if(curTool == "crayon")
        {
            // Draw the crayon tool background
            context.drawImage(crayonBackgroundImage, 0, 0, canvasWidth, canvasHeight);
    
            // Purple
            locX = (curColor == colorPurple)   18 : 52;
            locY = 19;
    
            context.beginPath();
            context.moveTo(locX + 41, locY + 11);
            context.lineTo(locX + 41, locY + 35);
            context.lineTo(locX + 29, locY + 35);
            context.lineTo(locX + 29, locY + 33);
            context.lineTo(locX + 11, locY + 27);
            context.lineTo(locX + 11, locY + 19);
            context.lineTo(locX + 29, locY + 13);
            context.lineTo(locX + 29, locY + 11);
            context.lineTo(locX + 41, locY + 11);
            context.closePath();
            context.fillStyle = colorPurple;
            context.fill();    
    
            if(curColor == colorPurple){
                context.drawImage(crayonImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(crayonImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
    
            // Green
            locX = (curColor == colorGreen)   18 : 52;
            locY += 46;
    
            context.beginPath();
            context.moveTo(locX + 41, locY + 11);
            context.lineTo(locX + 41, locY + 35);
            context.lineTo(locX + 29, locY + 35);
            context.lineTo(locX + 29, locY + 33);
            context.lineTo(locX + 11, locY + 27);
            context.lineTo(locX + 11, locY + 19);
            context.lineTo(locX + 29, locY + 13);
            context.lineTo(locX + 29, locY + 11);
            context.lineTo(locX + 41, locY + 11);
            context.closePath();
            context.fillStyle = colorGreen;
            context.fill();    
    
            if(curColor == colorGreen){
                context.drawImage(crayonImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(crayonImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
    
            // Yellow
            locX = (curColor == colorYellow)   18 : 52;
            locY += 46;
    
            context.beginPath();
            context.moveTo(locX + 41, locY + 11);
            context.lineTo(locX + 41, locY + 35);
            context.lineTo(locX + 29, locY + 35);
            context.lineTo(locX + 29, locY + 33);
            context.lineTo(locX + 11, locY + 27);
            context.lineTo(locX + 11, locY + 19);
            context.lineTo(locX + 29, locY + 13);
            context.lineTo(locX + 29, locY + 11);
            context.lineTo(locX + 41, locY + 11);
            context.closePath();
            context.fillStyle = colorYellow;
            context.fill();    
    
            if(curColor == colorYellow){
                context.drawImage(crayonImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(crayonImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
    
            // Yellow
            locX = (curColor == colorBrown)   18 : 52;
            locY += 46;
    
            context.beginPath();
            context.moveTo(locX + 41, locY + 11);
            context.lineTo(locX + 41, locY + 35);
            context.lineTo(locX + 29, locY + 35);
            context.lineTo(locX + 29, locY + 33);
            context.lineTo(locX + 11, locY + 27);
            context.lineTo(locX + 11, locY + 19);
            context.lineTo(locX + 29, locY + 13);
            context.lineTo(locX + 29, locY + 11);
            context.lineTo(locX + 41, locY + 11);
            context.closePath();
            context.fillStyle = colorBrown;
            context.fill();    
    
            if(curColor == colorBrown){
                context.drawImage(crayonImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(crayonImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
        }
        else if(curTool == "marker")
        {
            // Draw the marker tool background
            context.drawImage(markerBackgroundImage, 0, 0, canvasWidth, canvasHeight);
    
            // Purple
            locX = (curColor == colorPurple)   18 : 52;
            locY = 19;
    
            context.beginPath();
            context.moveTo(locX + 10, locY + 24);
            context.lineTo(locX + 10, locY + 24);
            context.lineTo(locX + 22, locY + 16);
            context.lineTo(locX + 22, locY + 31);
            context.closePath();
            context.fillStyle = colorPurple;
            context.fill();    
    
            if(curColor == colorPurple){
                context.drawImage(markerImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(markerImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
    
            // Green
            locX = (curColor == colorGreen)   18 : 52;
            locY += 46;
    
            context.beginPath();
            context.moveTo(locX + 10, locY + 24);
            context.lineTo(locX + 10, locY + 24);
            context.lineTo(locX + 22, locY + 16);
            context.lineTo(locX + 22, locY + 31);
            context.closePath();
            context.fillStyle = colorGreen;
            context.fill();    
    
            if(curColor == colorGreen){
                context.drawImage(markerImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(markerImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
    
            // Yellow
            locX = (curColor == colorYellow)   18 : 52;
            locY += 46;
    
            context.beginPath();
            context.moveTo(locX + 10, locY + 24);
            context.lineTo(locX + 10, locY + 24);
            context.lineTo(locX + 22, locY + 16);
            context.lineTo(locX + 22, locY + 31);
            context.closePath();
            context.fillStyle = colorYellow;
            context.fill();    
    
            if(curColor == colorYellow){
                context.drawImage(markerImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(markerImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
    
            // Yellow
            locX = (curColor == colorBrown)   18 : 52;
            locY += 46;
    
            context.beginPath();
            context.moveTo(locX + 10, locY + 24);
            context.lineTo(locX + 10, locY + 24);
            context.lineTo(locX + 22, locY + 16);
            context.lineTo(locX + 22, locY + 31);
            context.closePath();
            context.fillStyle = colorBrown;
            context.fill();    
    
            if(curColor == colorBrown){
                context.drawImage(markerImage, locX, locY, mediumImageWidth, mediumImageHeight);
            }else{
                context.drawImage(markerImage, 0, 0, 59, mediumImageHeight, locX, locY, 59, mediumImageHeight);
            }
        }
        else if(curTool == "eraser")
        {
            context.drawImage(eraserBackgroundImage, 0, 0, canvasWidth, canvasHeight);
            context.drawImage(eraserImage, 18, 19, mediumImageWidth, mediumImageHeight);    
        }else{
            alert("Error: Current Tool is undefined");
        }
    
        if(curSize == "small"){
            locX = 467;
        }else if(curSize == "normal"){
            locX = 450;
        }else if(curSize == "large"){
            locX = 428;
        }else if(curSize == "huge"){
            locX = 399;
        }
        locY = 189;
        context.beginPath();
        context.rect(locX, locY, 2, 12);
        context.closePath();
        context.fillStyle = '#333333';
        context.fill();    
    
        // Keep the drawing in the drawing area
        context.save();
        context.beginPath();
        context.rect(drawingAreaX, drawingAreaY, drawingAreaWidth, drawingAreaHeight);
        context.clip();
    
        var radius;
        var i = 0;
        for(; i < clickX.length; i++)
        {        
            if(clickSize[i] == "small"){
                radius = 2;
            }else if(clickSize[i] == "normal"){
                radius = 5;
            }else if(clickSize[i] == "large"){
                radius = 10;
            }else if(clickSize[i] == "huge"){
                radius = 20;
            }else{
                alert("Error: Radius is zero for click " + i);
                radius = 0;    
            }
    
            context.beginPath();
            if(clickDrag[i] && i){
                context.moveTo(clickX[i-1], clickY[i-1]);
            }else{
                context.moveTo(clickX[i], clickY[i]);
            }
            context.lineTo(clickX[i], clickY[i]);
            context.closePath();
    
            if(clickTool[i] == "eraser"){
                //context.globalCompositeOperation = "destination-out"; // To erase instead of draw over with white
                context.strokeStyle = 'white';
            }else{
                //context.globalCompositeOperation = "source-over";    // To erase instead of draw over with white
                context.strokeStyle = clickColor[i];
            }
            context.lineJoin = "round";
            context.lineWidth = radius;
            context.stroke();
    
        }
        //context.globalCompositeOperation = "source-over";// To erase instead of draw over with white
        context.restore();
    
        // Overlay a crayon texture (if the current tool is crayon)
        if(curTool == "crayon"){
            context.globalAlpha = 0.4; // No IE support
            context.drawImage(crayonTextureImage, 0, 0, canvasWidth, canvasHeight);
        }
        context.globalAlpha = 1; // No IE support
    
        // Draw the outline image
        context.drawImage(outlineImage, drawingAreaX, drawingAreaY, drawingAreaWidth, drawingAreaHeight);
    }

    其实HTML5说白了还是需要很多Javascript支持,不过Canvas非常不错,可以让你在上面自由地绘制图形和动画。这款基于HTML5 Canvas的网页画板就是一个很好的例子。源代码下载>>

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    如何从 Windows 11 中完全删除/卸载 OneNote?无解!

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    IT头条

    华为Pura80系列新机预热,余承东力赞其复杂光线下的视频拍摄实力

    01:28

    阿里千问3开源首战告捷:全球下载破千万,国产AI模型崛起新高度!

    01:22

    DeepSeek R1小版本试升级:网友实测编程能力已达到国际一线水平

    23:15

    NVIDIA 与 Dell 合作,大规模交付 Blackwell AI 系统

    20:52

    Cerebras 以最快的 Llama 4 Maverick 性能引领 LLM 推理竞赛

    20:51

    技术热点

    PHP中的随机性——你觉得自己幸运吗?

    搞定Ubuntu Linux下WPA无线上网

    Java使用内存映射实现大文件的上传

    MySQL安全性指南

    MySQL两项性能的基本测试浅谈

    教您使用UniqueIdentifier选取SQL Server主键

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。