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 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
jQuery 操作下拉列表框实现代码
Feb 22 Javascript
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
Mar 12 Javascript
ajax的hide隐藏问题解决方法
Dec 11 Javascript
jQuery基本选择器选择元素使用介绍
Apr 18 Javascript
动态加载script文件的两种方法
Aug 15 Javascript
JavaScript中的方法调用详细介绍
Dec 30 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
May 25 Javascript
Angular2 组件通信的实例代码
Jun 23 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 Javascript
微信小程序动态设置图片大小的方法
Nov 21 Javascript
微信小程序组件生命周期的踩坑记录
Mar 03 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
关于时间计算的结总
2006/12/06 PHP
php中根据变量的类型 选择echo或dump
2012/07/05 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
JS实现页面超时后自动跳转到登陆页面
2015/01/19 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
微信小程序 Page()函数详解
2016/10/17 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
python爬虫 模拟登录人人网过程解析
2019/07/31 Python
python系列 文件操作的代码
2019/10/06 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
英国知名衬衫品牌美国网站:Charles Tyrwhitt美国
2016/08/28 全球购物
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
西门豹教学反思
2014/02/04 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
MySQL学习之基础命令实操总结
2022/03/19 MySQL