先来张效果图:
这个特效是跟着慕课网上的视频学的,视频链接如下:https://www.imooc.com/learn/284
源码和技术点已经上传到附件,有需要的可以查看、下载。
下面直接上代码(PS:代码中的注释是根据个人理解添加的,并不是老师原有的注释):
页面结构:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>canvas学习-学写一个字</title> <link type="text/css" href="handwriting.css" rel="stylesheet"/> <meta name="viewport" content="height=device-height, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/> <script type="text/javascript" src="handwriting.js"></script> <script type="text/javascript" src="jquery.min.js"></script> </head> <body> <canvas id="myCanvas"> 您的浏览器不支持canvas,请换个浏览器试试 <!--这句话在支持canvas的浏览器中会被忽略,不支持的则会显示出来--> </canvas> <!--颜色选择和清除 --> <div id="controller"> <div id="black_btn" class="color_btn color_btn_selected"></div> <div id="red_btn" class="color_btn"></div> <div id="orange_btn" class="color_btn"></div> <div id="yellow_btn" class="color_btn"></div> <div id="green_btn" class="color_btn"></div> <div id="cyan_btn" class="color_btn"></div> <div id="blue_btn" class="color_btn"></div> <div id="clear_btn" class="op_btn">清 除</div> <div class="clearfix"></div> </div> </body> </html>
CSS样式:
#myCanvas{ height:100%; display:block; margin:0 auto; } #controller{ margin:0 auto; } .op_btn{ float:right; margin:10px 0 0 10px; border:2px solid #aaa; width:80px; height:40px; line-height:40px; font-size:20px; text-align:center; border-radius:5px 5px; cursor:pointer; background-color:white; font-weight:bold; font-family:Microsoft Yahei,Arial; } .op_btn:hover{ background-color:#def; } .clearfix{ clear:both; } .color_btn{ float:left; margin:10px 5px 0 0; border:5px solid white; width:40px; height:40px; border-radius:5px 5px; cursor:pointer; } .color_btn:hover{ border:5px solid violet; } .color_btn_selected{ border:5px solid blueviolet; } #black_btn{ background-color:black; } #red_btn{ background-color:red; } #orange_btn{ background-color:orange; } #yellow_btn{ background-color:yellow; } #green_btn{ background-color:green; } #blue_btn{ background-color:blue; } #cyan_btn{ background-color:cyan; }
JS代码:
//学习链接:http://www.imooc.com/learn/284 var windowWidth = 600; var windowHeight = 600; var isMouseDowm=false;//鼠标是否按下 var myCanvas = null; var context = null; var lastLoc = {x:0,y:0};//鼠标最后一个落脚点 var lastTimestamp=0; var lastLineWidth = -1;//最后一次笔画的大小 var strokeColor = "black"; window.onload=function(){ myCanvas = document.getElementById("myCanvas"); if(myCanvas.getContext("2d")){ windowWidth = document.documentElement.clientWidth-20; windowHeight = document.documentElement.clientHeight-20-60;//60:清除按钮所需要的高度 //取两个数中最小的那个值 if(windowWidth>windowHeight){windowWidth = windowHeight;} else{windowHeight = windowWidth;} //alert(windowWidth); myCanvas.width = windowWidth; myCanvas.height = windowHeight; context =myCanvas.getContext("2d"); //alert(myCanvas.width+"\n"+myCanvas.height); //控制功能区的大小 $("#controller").css("width",windowWidth+"px"); //绘制一个米字格 drawGird(); //阻止鼠标的默认事件 myCanvas.onmousedown=function(e){ e.preventDefault(); //console.log("mouse down"); startStroke({x:e.clientX,y:e.clientY}); } myCanvas.onmouseup=function(e){ e.preventDefault(); //console.log("mouse up"); endStroke(); } myCanvas.onmouseout=function(e){ e.preventDefault(); //console.log("mouse out"); endStroke(); } myCanvas.onmousemove=function(e){ e.preventDefault(); if(isMouseDowm){ //console.log("mouse move"); moveStroke({x:e.clientX,y:e.clientY}); } } //添加触控事件 myCanvas.addEventListener("touchstart",function(e){ e.preventDefault(); var touch = e.touches[0];//只获取一个触控点 startStroke({x:touch.pageX,y:touch.pageY}); }); myCanvas.addEventListener("touchend",function(e){ e.preventDefault(); endStroke(); }); myCanvas.addEventListener("touchmove",function(e){ e.preventDefault(); if(isMouseDowm){ var touch = e.touches[0];//只获取一个触控点 moveStroke({x:touch.pageX,y:touch.pageY}); } }); //清除功能 document.getElementById("clear_btn").onclick=function(){ //清除画布中的内容 context.clearRect(0,0,windowWidth,windowHeight); //重新绘制米字格 drawGird(); } //选择颜色功能 $(".color_btn").click(function(){ //清除选中状态 $(".color_btn").removeClass("color_btn_selected"); $(this).addClass("color_btn_selected"); strokeColor = $(this).css("background-color"); }); }else{ return false; } } //开始绘制 function startStroke(point){ isMouseDowm=true; lastLoc = windowToCanvas(point.x,point.y); lastTimestamp = new Date().getTime(); //alert(lastLoc.x+","+lastLoc.y); } //结束绘制 function endStroke(){ isMouseDowm=false; } //绘制过程中 function moveStroke(point){ //获取鼠标所在canvas的当前位置 var curLoc = windowToCanvas(point.x,point.y); //添加“根据写字速度的快慢调整笔画大小”的应用 //计算两个点之间的距离 var s = calcDistance(curLoc,lastLoc); //计算绘制两个点需要的时间 var curTimestamp = new Date().getTime(); var t = curTimestamp-lastTimestamp;//使用当前时间减去最后一个落笔的时间 //根据s和t的值计算线的宽度 var lineWidth = calcLineWidth(s,t); //alert(curLoc); context.beginPath(); context.moveTo(lastLoc.x,lastLoc.y); context.lineTo(curLoc.x,curLoc.y); context.closePath(); context.strokeStyle = strokeColor; context.lineCap="round"; context.lineJoin="round"; context.lineWidth = lineWidth; context.stroke(); lastLoc = curLoc; lastTimestamp = curTimestamp; lastLineWidth = lineWidth; } //该方法用来将窗口坐标转换成canvas中的坐标 function windowToCanvas(x,y){ var bbox = myCanvas.getBoundingClientRect(); return {x:Math.round(x-bbox.left),y:Math.round(y-bbox.top)}; } //该方法用来计算两个点之间的距离 function calcDistance(loc1,loc2){ return Math.sqrt((loc1.x-loc2.x)*(loc1.x-loc2.x)+(loc1.y-loc2.y)*(loc1.y-loc2.y)); } //该方法根据路程和时间计算速度,依次计算线条宽度 function calcLineWidth(s,t){ var v = s/t; //先判断运笔速度较快和较慢时的情况 var min = 5,max = 20;//笔画大小 var min2 = 0.5,max2=10;//运笔速度大小 var result = min; if(v<=min2){//运笔速度特别慢,那么笔画应该特别大 result = max; }else if(v>=max2){//运笔速度特别快,那么笔画应该特别小 result = min; }else{//不快也不慢的情况下,使用差值的方式逐渐减 //计算方法:使用最大值-(当前速度与最小速度之间的差值)占(最大速度与最小速度之间差值)的比例 * (最大笔画与最小笔画之间的差值) result = max - (v-min2)/(max2-min2)*(max-min) } //解决平滑问题 if(lastLineWidth==-1){//说明还没有赋值 return result; } return lastLineWidth*3/4+result*1/4; } //该方法用来绘制米字格 function drawGird(){ context.save(); //绘制一个红色的正方形 context.strokeStyle="rgb(230,11,9)"; context.beginPath(); context.rect(0,0,windowWidth,windowWidth); context.closePath(); context.lineWidth = 5; context.stroke(); //绘制米字格 context.beginPath(); context.moveTo(0,0); context.lineTo(windowWidth,windowHeight); context.moveTo(windowWidth/2,0); context.lineTo(windowWidth/2,windowHeight); context.moveTo(windowWidth,0); context.lineTo(0,windowHeight); context.moveTo(0,windowHeight/2); context.lineTo(windowWidth,windowHeight/2); context.closePath(); context.lineWidth = 1; context.stroke(); context.restore(); }
相关推荐
【Canvas入门实例01:猜字母】是一个针对前端开发者的基础教程,主要介绍如何利用HTML5的Canvas元素进行图形绘制和交互。在这个实例中,我们将学习Canvas的基本用法,包括画布的设置、文本渲染以及用户事件处理。...
在本篇【canvas学习(十六):绘制时钟】中,我们将探讨HTML5中的Canvas API,它是Web开发中用于在网页上动态绘制图形的强大工具。Canvas API允许开发者使用JavaScript来绘制2D图形,包括简单的线条、形状以及复杂的...
在本篇【canvas学习(二):弹跳小球】中,我们将深入探讨HTML5的Canvas元素以及如何利用它来创建动态的、交互式的弹跳小球效果。Canvas是HTML5的一个重要特性,允许开发者在网页上进行动态图形绘制,为网页增添了...
- 文件名如`step1`到`step13`可能代表逐步教学,每一步可能包含一个具体示例,如`step11.jpg`可能是第十一步的结果截图。 - 逐个学习这些步骤,可以深入理解Canvas的使用。 7. **源码与工具** - 源码:博客可能...
HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 ...
这个“html5 canvas米字格式手写文字练习代码”压缩包提供了一个实例,可以帮助学习者更好地理解和掌握Canvas API的用法,特别是关于文字绘制的部分。 在HTML5中,Canvas是一个二维绘图上下文,通过JavaScript来...
在“canvas学习(十三):clip之图形剪辑”这篇博文中,作者详细介绍了如何利用`clip()`进行图形限制和绘制。 首先,`clip()`方法的基本概念是创建一个剪辑区域,该区域定义了后续绘制操作的影响范围。简单来说,...
在canvas学习中,图形透明及交叠效果是两个重要的概念,它们可以让我们创建出丰富的视觉效果和动态交互。本文将详细解析这两个知识点,并通过提供的标签和文件名来具体阐述。 首先,我们来看“图形透明”这个概念。...
微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的...
HTML5 Canvas是网页开发中的一个强大工具,它允许开发者在网页上进行图形绘制,包括动态图像、动画甚至游戏。在这个“html5 canvas米字格式手写文字练习代码”项目中,用户可以通过鼠标在Canvas上模拟手写汉字,特别...
在微信小程序中,Canvas是一个非常重要的组件,它允许开发者在界面上绘制图形、文字等元素,从而实现丰富的交互效果。本项目着重讲解如何利用Canvas在微信小程序中实现文字的自由移动。 首先,Canvas是一个HTML5的...
在本篇博客“canvas学习(三):炫丽的电子时钟”中,作者通过HTML5的canvas元素展示了如何创建一个动态且具有视觉吸引力的电子时钟。canvas是HTML5中用于绘制图形的一个重要组成部分,它允许开发者用JavaScript来...
学习学习学习 1:初学canvas getContext():上下文环境 2:画矩形 fillRect(x,y,width,height) 不加单位 填充矩形 strokeRect(x,y,wdith,height) 不加单位 带边框的矩形 相当于在中间画 100 :99.5-100.5 (99-101) ...
Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、...
由于标题为"canvas学习.zip",并且描述提到了"canvas的官网小例子",我们可以从中了解到这个压缩包可能包含了一些用于学习`canvas`的实例代码。 `canvas`标签是一个内联元素,通过JavaScript API与之交互。在HTML中...
在网页设计中,canvas元素是HTML5引入的一个强大的特性,它允许动态、程序化地绘制2D图形。这篇博客“canvas使用外部字体”探讨了如何在canvas上使用非标准字体,即外部字体,来增强图形的视觉效果。下面将详细阐述...
【标题】:“分享一个适合学习canvas的案例” 在HTML5中,Canvas是一个强大的绘图工具,它允许开发者通过JavaScript在网页上进行动态图形绘制。这个案例“google-bouncing-balls”是一个非常适合初学者掌握和练习...
在这个"用canvas写的一个对比度"的例子中,我们将探讨如何利用JavaScript操作Canvas API来调整图像的对比度,从而实现图片的动态视觉调整。 首先,Canvas API提供了一个名为`getImageData`的方法,它可以从画布上...
在这个“canvas数字时钟”项目中,开发者利用Canvas结合JavaScript和CSS,创建了一个实时更新的数字时钟。下面将详细解释这个项目中涉及的技术和知识点。 1. **Canvas基础**: - **Canvas元素**:HTML5中的`...
对于想要深入Canvas LMS集成的开发者来说,参与这个项目的贡献或者跟踪其进展,将是一个学习和实践的好机会。 总结来说,Canvas.ts是Node.js环境下用于与Canvas LMS进行交互的客户端库,它简化了API调用的过程,...