js+html5
canvas实现的涂鸦画板特效,可调画笔颜色|粗细|橡皮,可以保存涂鸦效果为图片编码,非常适合学习html5的canvas,必须支持html5的浏览器才能看到效果。
<!doctype html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>javascript结合html5 canvas实现的涂鸦板</title> <meta name="Copyright" content="JavaScript分享网 http://www.php.cn/" /> <meta name="description" content="javascript结合html5 canvas实现的涂鸦板,JavaScript分享网,js脚本,网页特效,网页模板,png图标,矢量图下载" /> <meta content="JavaScript,分享,JavaScript代码,Ajax,jQuery,网页模板,PNG图标,矢量图" name="keywords" /> </head> <body> <style> *{margin:0;padding:0;} .fa{width:740px;margin:0 auto;} .top{margin:20px 0;} .top input{width:25px;height:25px;border:1px solid #fff;border-radius:4px;background:#ddd;} .top .i1{background:#000000;} .top .i2{background:#FF0000;} .top .i3{background:#80FF00;} .top .i4{background:#00FFFF;} .top .i5{background:#808080;} .top .i6{background:#FF8000;} .top .i7{background:#408080;} .top .i8{background:#8000FF;} .top .i9{background:#CCCC00;} #canvas{background:#eee;cursor:default;} .font input{font-size:14px;} .top .grea{background:#aaa;} </style> </head> <body> <p class="fa"> <p class="top"> <p id="color"> 请选择画笔颜色: <input class="i1" type="button" value="" /> <input class="i2" type="button" value="" /> <input class="i3" type="button" value="" /> <input class="i4" type="button" value="" /> <input class="i5" type="button" value="" /> <input class="i6" type="button" value="" /> <input class="i7" type="button" value="" /> <input class="i8" type="button" value="" /> <input class="i9" type="button" value="" /> </p> <p class="font" id="font"> 请选择画笔的宽度: <input type="button" value="细" /> <input type="button" value="中" class="grea"/> <input type="button" value="粗" /> </p> <p> <span id="error">如果有错误,请使用橡皮擦:</span> <input id="eraser" style="width:60px;font-size:14px;"type="button" value="橡皮擦" /> </p> <input id="clear" type="button" value="清除画布" style="width:80px;"/> <input id="revocation" type="button" value="撤销" style="width:80px;"/> <input id="imgurl" type="button" value="导出图片路径" style="width:80px;"/> </p> <canvas id="canvas" width="740" height="420">您的浏览器不支持 canvas 标签</canvas> <p id="p1"></p> </p> <p id="html"> </p> <script> (function(){ var paint={ init:function() { this.load(); }, load:function() { this.x=[];//记录鼠标移动是的X坐标 this.y=[];//记录鼠标移动是的Y坐标 this.clickDrag=[]; this.lock=false;//鼠标移动前,判断鼠标是否按下 this.isEraser=false; //this.Timer=null;//橡皮擦启动计时器 //this.radius=5; this.storageColor="#000000"; this.eraserRadius=15;//擦除半径值 this.color=["#000000","#FF0000","#80FF00","#00FFFF","#808080","#FF8000","#408080","#8000FF","#CCCC00"];//画笔颜色值 this.fontWeight=[2,5,8]; this.$=function(id){return typeof id=="string"?document.getElementById(id):id;}; this.canvas=this.$("canvas"); if (this.canvas.getContext) { } else { alert("您的浏览器不支持 canvas 标签"); return; } this.cxt=this.canvas.getContext('2d'); this.cxt.lineJoin = "round";//context.lineJoin - 指定两条线段的连接方式 this.cxt.lineWidth = 5;//线条的宽度 this.iptClear=this.$("clear"); this.revocation=this.$("revocation"); this.imgurl=this.$("imgurl");//图片路径按钮 this.w=this.canvas.width;//取画布的宽 this.h=this.canvas.height;//取画布的高 this.touch =("createTouch" in document);//判定是否为手持设备 this.StartEvent = this.touch ? "touchstart" : "mousedown";//支持触摸式使用相应的事件替代 this.MoveEvent = this.touch ? "touchmove" : "mousemove"; this.EndEvent = this.touch ? "touchend" : "mouseup"; this.bind(); }, bind:function() { var t=this; /*清除画布*/ this.iptClear.onclick=function() { t.clear(); }; /*鼠标按下事件,记录鼠标位置,并绘制,解锁lock,打开mousemove事件*/ this.canvas['on'+t.StartEvent]=function(e) { var touch=t.touch ? e.touches[0] : e; var _x=touch.clientX - touch.target.offsetLeft;//鼠标在画布上的x坐标,以画布左上角为起点 var _y=touch.clientY - touch.target.offsetTop;//鼠标在画布上的y坐标,以画布左上角为起点 if(t.isEraser) { /* t.cxt.globalCompositeOperation = "destination-out"; t.cxt.beginPath(); t.cxt.arc(_x, _y,t.eraserRadius, 0, Math.PI * 2); t.cxt.strokeStyle = "rgba(250,250,250,0)"; t.cxt.fill(); t.cxt.globalCompositeOperation = "source-over"; */ t.resetEraser(_x,_y,touch); }else { t.movePoint(_x,_y);//记录鼠标位置 t.drawPoint();//绘制路线 } t.lock=true; }; /*鼠标移动事件*/ this.canvas['on'+t.MoveEvent]=function(e) { var touch=t.touch ? e.touches[0] : e; if(t.lock)//t.lock为true则执行 { var _x=touch.clientX - touch.target.offsetLeft;//鼠标在画布上的x坐标,以画布左上角为起点 var _y=touch.clientY - touch.target.offsetTop;//鼠标在画布上的y坐标,以画布左上角为起点 if(t.isEraser) { //if(t.Timer)clearInterval(t.Timer); //t.Timer=setInterval(function(){ t.resetEraser(_x,_y,touch); //},10); } else { t.movePoint(_x,_y,true);//记录鼠标位置 t.drawPoint();//绘制路线 } } }; this.canvas['on'+t.EndEvent]=function(e) { /*重置数据*/ t.lock=false; t.x=[]; t.y=[]; t.clickDrag=[]; clearInterval(t.Timer); t.Timer=null; }; this.revocation.onclick=function() { t.redraw(); }; this.changeColor(); this.imgurl.onclick=function() { t.getUrl(); }; /*橡皮擦*/ this.$("eraser").onclick=function(e) { t.isEraser=true; t.$("error").style.color="red"; t.$("error").innerHTML="您已使用橡皮擦!"; }; }, movePoint:function(x,y,dragging) { /*将鼠标坐标添加到各自对应的数组里*/ this.x.push(x); this.y.push(y); this.clickDrag.push(y); }, drawPoint:function(x,y,radius) { for(var i=0; i < this.x.length; i++)//循环数组 { this.cxt.beginPath();//context.beginPath() , 准备绘制一条路径 if(this.clickDrag[i] && i){//当是拖动而且i!=0时,从上一个点开始画线。 this.cxt.moveTo(this.x[i-1], this.y[i-1]);//context.moveTo(x, y) , 新开一个路径,并指定路径的起点 }else{ this.cxt.moveTo(this.x[i]-1, this.y[i]); } this.cxt.lineTo(this.x[i], this.y[i]);//context.lineTo(x, y) , 将当前点与指定的点用一条笔直的路径连接起来 this.cxt.closePath();//context.closePath() , 如果当前路径是打开的则关闭它 this.cxt.stroke();//context.stroke() , 绘制当前路径 } }, clear:function() { this.cxt.clearRect(0, 0, this.w, this.h);//清除画布,左上角为起点 }, redraw:function() { /*撤销*/ this.cxt.restore(); }, preventDefault:function(e){ /*阻止默认*/ var touch=this.touch ? e.touches[0] : e; if(this.touch)touch.preventDefault(); else window.event.returnValue = false; }, changeColor:function() { /*为按钮添加事件*/ var t=this,iptNum=this.$("color").getElementsByTagName("input"),fontIptNum=this.$("font").getElementsByTagName("input"); for(var i=0,l=iptNum.length;i<l;i++) { iptNum[i].index=i; iptNum[i].onclick=function() { t.cxt.save(); t.cxt.strokeStyle = t.color[this.index]; t.storageColor=t.color[this.index]; t.$("error").style.color="#000"; t.$("error").innerHTML="如果有错误,请使用橡皮擦:"; t.cxt.strokeStyle = t.storageColor; t.isEraser=false; } } for(var i=0,l=fontIptNum.length;i<l;i++) { t.cxt.save(); fontIptNum[i].index=i; fontIptNum[i].onclick=function() { t.changeBackground(this.index); t.cxt.lineWidth = t.fontWeight[this.index]; t.$("error").style.color="#000"; t.$("error").innerHTML="如果有错误,请使用橡皮擦:"; t.isEraser=false; t.cxt.strokeStyle = t.storageColor; } } }, changeBackground:function(num) { /*添加画笔粗细的提示背景颜色切换,灰色为当前*/ var fontIptNum=this.$("font").getElementsByTagName("input"); for(var j=0,m=fontIptNum.length;j<m;j++) { fontIptNum[j].className=""; if(j==num) fontIptNum[j].className="grea"; } }, getUrl:function() { this.$("html").innerHTML=this.canvas.toDataURL(); }, resetEraser:function(_x,_y,touch) { /*使用橡皮擦-提醒*/ var t=this; //this.cxt.lineWidth = 30; /*source-over 默认,相交部分由后绘制图形的填充(颜色,渐变,纹理)覆盖,全部浏览器通过*/ t.cxt.globalCompositeOperation = "destination-out"; t.cxt.beginPath(); t.cxt.arc(_x, _y, t.eraserRadius, 0, Math.PI * 2); t.cxt.strokeStyle = "rgba(250,250,250,0)"; t.cxt.fill(); t.cxt.globalCompositeOperation = "source-over" } }; paint.init(); })(); </script> <p style="clear:both"></p> </body> </html>
相关文章:

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

Dreamweaver CS6
视觉化网页开发工具