JS+HTML5 Canvas实现简单的写字板功能示例


Posted in Javascript onAugust 30, 2018

本文实例讲述了JS+HTML5 Canvas实现简单的写字板功能。分享给大家供大家参考,具体如下:

先来看运行效果:

JS+HTML5 Canvas实现简单的写字板功能示例

具体代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>3water.com JS写字板</title>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <style type="text/css">
        body,html {
            padding: 0;
            margin: 0;
        }
        a,div,span {
            font-family: "Arial","Microsoft YaHei","黑体","宋体",sans-serif;
        }
        .canvas-box {
            display: block;
            margin: 40px auto;
            background: #f5f5f5;
        }
        .color-box {
            width: 1080px;
            display: block;
            margin: 20px auto;
            text-align: center;
        }
        .color-item {
            display: inline-block;
            vertical-align: middle;
            width: 48px;
            height: 24px;
            margin: 10px;
            background: #989898;
            cursor: pointer;
        }
        .red {
            background: #e01d5b;
        }
        .blue {
            background: #1d6ae0;
        }
        .green {
            background: #1de087;
        }
        .yellow {
            background: #f3e41d;
        }
        .orange {
            background: #f9850b;
        }
        .black {
            background: #333;
        }
        .color-item.active {
            border: solid 3px #565656;
        }
        .btn {
            display: block;
            width: 120px;
            height: 40px;
            line-height: 40px;
            margin: 10px auto;
            text-align: center;
            font-size: 18px;
            border: solid 1px #999;
            border-radius: 5px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <canvas class="canvas-box" id="canvas"></canvas>
    <div class="color-box">
        <span class="color-item red"></span>
        <span class="color-item blue"></span>
        <span class="color-item green"></span>
        <span class="color-item yellow"></span>
        <span class="color-item orange"></span>
        <span class="color-item black active"></span>
    </div>
    <div class="btn" onclick="clearDraw()">清除</div>
<script type="text/javascript">
var    canvas = document.getElementById('canvas');
var    context = canvas.getContext("2d");
var    isDraw = false; //定义变量控制画笔是否可用
var movePos;         //定义变量存放初始画笔开始位置
var linWidth = 10;
var linColor = '#333';
window.onload = function(){
    draw();
}
function draw(){
    canvas.width = 500;
    canvas.height = 500;
    context.strokeStyle = "red";
    context.lineWidth = 10;
    context.beginPath();
    context.strokeRect(0,0,500,500);
    //设置画笔颜色,宽度
    context.strokeStyle = "red";
    context.lineWidth = 1;
    //使线段连续,圆滑
    context.lineCap = "round";
    context.lineJoin = "round";
    drawDashedLine(context,0,0,500,500);
    drawDashedLine(context,0,500,500,0);
    drawLine(context,0,250,500,250);
    drawLine(context,250,0,250,500);
}
//画虚线(参照网上大神)
function drawDashedLine(context, x1, y1, x2, y2, dashLength) {
  dashLength = dashLength === undefined ? 5 : dashLength;
  var deltaX = x2 - x1;
  var deltaY = y2 - y1;
  var numDashes = Math.floor(
   Math.sqrt(deltaX * deltaX + deltaY * deltaY) / dashLength);
   for (var i=0; i < numDashes; ++i) {
   context[ i % 2 === 0 ? 'moveTo' : 'lineTo' ]    (x1 + (deltaX / numDashes) * i, y1 + (deltaY / numDashes) * i);
   }
  context.stroke();
};
//画直线
function drawLine(context,x1,y1,x2,y2){
    context.moveTo(x1,y1);
    context.lineTo(x2,y2);
    context.stroke();
};
//获取鼠标相对与canvas位置
function getPos(x,y){
    var box = canvas.getBoundingClientRect();
    return {x: x-box.left,y: y-box.top};
};
//画笔
function drawing(e){
    if(isDraw){
        var position = getPos(e.clientX,e.clientY);
        context.strokeStyle = linColor;
        context.lineWidth = linWidth;
        context.save();
        context.beginPath();
        context.moveTo(movePos.x,movePos.y);
        context.lineTo(position.x,position.y);
        context.stroke();
        movePos = position;
        context.restore();
    }
}
//鼠标点下
canvas.onmousedown = function(e){
    isDraw = true;
    movePos = getPos(e.clientX,e.clientY);
    drawing(e);
}
//鼠标移动
canvas.onmousemove = function(e){
    drawing(e);
}
//鼠标松开
canvas.onmouseup = function(e){
    isDraw = false;
}
//鼠标离开
canvas.onmouseout =function(e){
    isDraw = false;
}
//选择画笔颜色
$('.color-item').on('click',function(){
    $(this).addClass('active').siblings().removeClass('active');
    linColor = $(this).css('background-color');
});
//清除
function clearDraw(){
    context.clearRect(0,0,500,500);
    draw();
}
</script>
</body>
</html>

感兴趣的朋友还可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码,亲身体验一下运行效果。

更多关于JavaScript相关内容还可查看本站专题:《JavaScript+HTML5特效与技巧汇总》、《JavaScript图形绘制技巧总结》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
extjs render 用法介绍
Sep 11 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
DOM基础教程之事件类型
Jan 20 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
原生javascript实现addClass,removeClass,hasClass函数
Feb 25 Javascript
聊一聊jQuery插件uploadify使用方法
Aug 24 Javascript
手把手教你搭建ES6的开发运行环境
Jul 11 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
vue项目实现记住密码到cookie功能示例(附源码)
Jan 31 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
Sep 03 Javascript
vue+canvas实现移动端手写签名
May 21 Javascript
JavaScript实现与web通信的方法详解
Aug 07 Javascript
详解React native fetch遇到的坑
Aug 30 #Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 #Javascript
原生JS实现简单的倒计时功能示例
Aug 30 #Javascript
JavaScript fetch接口案例解析
Aug 30 #Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 #Javascript
原生JS实现的简单小钟表功能示例
Aug 30 #Javascript
使用Node搭建reactSSR服务端渲染架构
Aug 30 #Javascript
You might like
php实现快速排序的三种方法分享
2014/03/12 PHP
php+highchats生成动态统计图
2014/05/21 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
PHP之header函数详解
2021/03/02 PHP
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
常用的JavaScript模板引擎介绍
2015/02/28 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
jquery与ajax获取特殊字符实例详解
2017/01/08 Javascript
简单实现jQuery多选框功能
2017/01/09 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
React中如何引入Angular组件详解
2018/08/09 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
VUE+elementui组件在table-cell单元格中绘制微型echarts图
2020/04/20 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python bsddb模块操作Berkeley DB数据库介绍
2015/04/08 Python
python实现在windows服务中新建进程的方法
2015/06/30 Python
Python将视频或者动态图gif逐帧保存为图片的方法
2019/09/10 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
PyTorch安装与基本使用详解
2020/08/31 Python
详解前端HTML5几种存储方式的总结
2016/12/27 HTML / CSS
日常奢侈品,轻松购物:Verishop
2019/08/20 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
保护环境的建议书
2014/03/12 职场文书
高中社区服务活动报告
2015/02/05 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python