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 相关文章推荐
验证用户是否修改过页面的数据的实现方法
Sep 26 Javascript
提高网站性能之 如何对待JavaScript
Oct 31 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
Dec 19 Javascript
Javascript 多物体运动的实现
Dec 24 Javascript
Javascript核心读书有感之表达式和运算符
Feb 11 Javascript
Ajax清除浏览器js、css、图片缓存的方法
Aug 06 Javascript
JavaScript实现斗地主游戏的思路
Feb 29 Javascript
JS在onclientclick里如何控制onclick的执行
May 30 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
Oct 11 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
vuex 中插件的编写案例解析
Jun 10 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
PHP实现163邮箱自动发送邮件
2016/03/29 PHP
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
js动态为代码着色显示行号
2013/05/29 Javascript
js数组的操作指南
2014/12/28 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
详解ES6 扩展运算符的使用与注意事项
2020/11/12 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
js实现验证码干扰(动态)
2021/02/23 Javascript
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
Python list操作用法总结
2015/11/10 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
用python实现百度翻译的示例代码
2018/03/09 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
tensorflow中tf.reduce_mean函数的使用
2020/04/19 Python
python异步Web框架sanic的实现
2020/04/27 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
CSS3 animation ? steps 函数详解
2019/08/30 HTML / CSS
介绍一下gcc特性
2015/10/31 面试题
网站开发实习生的自我评价
2013/12/11 职场文书
电气个人求职信范文
2014/02/04 职场文书
优秀党员获奖感言
2014/02/18 职场文书
高三霸气励志标语
2014/06/24 职场文书
工伤私了协议书范本
2014/11/24 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
PHP正则表达式之RCEService回溯
2022/04/11 PHP
MySQL深分页问题解决思路
2022/12/24 MySQL