先说说用到的两个方法:
1、isPositonInPath(x,y):判断(x,y)是否在canvas绘制的图形所在路径中。不太理解的可以参考W3School中的“HTML5 canvas isPointInPath() 方法”
2、getBoundingClientRect():这个方法用来用来获取元素位置,即获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。getBoundingClientRect是DOM元素到浏览器可视范围的距离(不包含文档卷起的部分)。该函数返回一个Object对象,该对象有6个属性:top,lef,right,bottom,width,height;这里的top、left和css中的理解很相似,width、height是元素自身的宽高,但是right,bottom和css中的理解有点不一样。right是指元素右边界距窗口最左边的距离,bottom是指元素下边界距窗口最上面的距离。
然后说说要实现的效果:
在canvas中绘制20个小球,当鼠标点击小球时,小球变红。
具体思路:先在canvas中绘制20个小球,然后在原来小球的位置处再绘制一遍小球但是不填充颜色,再根据鼠标点击的坐标判断是否在某个小球的绘制范围内,若在其中就将小球填充为红色,否则不填充。
具体html页面与以前的相同,这里就不多说了,直接上JS代码:
var ball = [];//用来存放小球 var canvas = null;//用来存放canvas对象,方便后面方法调用 var context2 = null;//用来存放context对象,方便后面方法调用 window.onload=function(){ var myCanvas = document.getElementById("myCanvas"); if(myCanvas.getContext("2d")){ myCanvas.width = document.documentElement.clientWidth-20; myCanvas.height = document.documentElement.clientHeight-20; var context =myCanvas.getContext("2d"); canvas = myCanvas; context2 = context; //生成20个小球 var aBall=null; for(var i=0;i<20;i++){ aBall={ x:Math.random()*myCanvas.width, y:Math.random()*myCanvas.height, r:Math.random()*50+10 } ball[i]=aBall;//添加到数组中 } //在canvas中绘制小球 drawBall(context); //添加事件:mouseup myCanvas.addEventListener("mouseup",detect); }else{ return false; } } //该方法用来绘制小球 function drawBall(cxt){ for(var i=0;i<ball.length;i++){ cxt.beginPath(); cxt.arc(ball[i].x,ball[i].y,ball[i].r,0,Math.PI*2); cxt.fillStyle="#058"; cxt.fill(); cxt.closePath(); } } //当鼠标点击小球时触发该事件 function detect(event){ var x = event.clientX - canvas.getBoundingClientRect().left; var y = event.clientY - canvas.getBoundingClientRect().top; //每个小球都进行判断,判断(x,y)是否在其中 for(var i=0;i<ball.length;i++){ context2.beginPath(); context2.arc(ball[i].x,ball[i].y,ball[i].r,0,Math.PI*2); //判断(x,y)是否在canvas绘制的路径中(绘制的每个图形算一个路径) if(context2.isPointInPath(x,y)){ context2.fillStyle="red"; context2.fill(); } } }
再来个更舒服点的效果:当鼠标经过某个小球时,小球变红否则小球还是原来的颜色。
实现思路与上个例子相同,代码除触发时间不一样之外其他都一样,因此雷同代码就不在赘述了。这里只粘贴鼠标经过事件及处理方法:
//添加事件:mouseover myCanvas.addEventListener("mousemove",detect2); //当鼠标经过小球时触发该事件 function detect2(event){ var x = event.clientX - canvas.getBoundingClientRect().left; var y = event.clientY - canvas.getBoundingClientRect().top; //每个小球都进行判断,判断(x,y)是否在其中 for(var i=0;i<ball.length;i++){ context2.beginPath(); context2.arc(ball[i].x,ball[i].y,ball[i].r,0,Math.PI*2); if(context2.isPointInPath(x,y)){//在其中 context2.fillStyle="red"; }else{ context2.fillStyle="#058"; } context2.fill(); } }
最后感谢老师的分享!
相关推荐
说明:Delphi6 Canvas画特效图片:颜色渐变 核心技术:DelphiTColor(R,G,B:Integer):TColor; Google搜索:inttohex(,stringtocolor(,DelphiTColor(,ColortoRGB(,垂直翻转,Bitmap
低版本HTML2canvas 前端开发 生成海报 截图等功能 1.该脚本允许您直接在用户浏览器上对网页或其部分进行“截图”。屏幕截图基于 DOM,因此可能不是 100% 准确到真实表示,因为它不会制作实际的屏幕截图,而是根据...
本书是Canvas的畅销图书,它在上一版的基础上,通过讲解如何开发可交互式多媒体应用,引导读者学习HTML5 Canvas。通过本书,你将学到如何使用Canvas进行绘图、渲染文字、处理图像、创建动画,而这些是开发交互式Web...
NULL 博文链接:https://cshbbrain.iteye.com/blog/1989891
NULL 博文链接:https://bun-ny.iteye.com/blog/1304950
HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 HTML Canvas 学习过程中的一些代码HTML Canvas 学习过程中的一些代码 ...
包含的有:...当浏览器不支持Canvas时,将采用Flashcanvas或ExplorerCanvas技术代替实现。以下浏览器能够很好的支持该脚本:Firefox 3.5+, Google Chrome, Opera新的版本, IE9以上的浏览器。
NULL 博文链接:https://1017401036.iteye.com/blog/2314916
小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的小鸟:canvas实现,java后端(适用1221)(学习版)微信小程序源码 小程序完整demo:飞翔的小鸟:...
《HTML5 Canvas核心技术:图形、动画与游戏开发》是HTML5 Canvas领域的标杆之作,也是迄今为止该领域内容最为全面和深入的著作之一,是公认的权威经典、Amazon五星级超级畅销书、资深技术专家David Geary最新力作。...
4.4_屏幕坐标和canvas坐标的转换|使用鼠标和canvas交互|canvas项目综合实战|Canvas图形、动画、游戏开发
html5 canvas交互式数据图表插件代码 html5 canvas交互式数据图表插件代码
4.8_使用HTML控件和canvas交互|交互绘制的处理和完善|canvas项目综合实战|Canvas图形、动画、游戏开发从入
内容概要:下落小球碰撞物体运动轨迹,简单3D弹球基础逻辑。 实现技术:htm+js实现。双击浏览器打开即可看效果 能学到什么:canvas技术 适用人群: 前端canvas学习新手 阅读建议:支持canvas的浏览器
3.7_canvas和鼠标交互|离屏Canvas图像处理|Canvas图形、动画、游戏开发从入门到精通全系列课程
NULL 博文链接:https://1017401036.iteye.com/blog/2315301
内容概要:canvas案例,色盘、颜色过渡。 实现技术:htm+js实现。双击浏览器打开即可看效果 能学到什么:canvas技术 适用人群: 前端canvas学习新手 阅读建议:支持canvas的浏览器
FMX 的 Canvas 在不同的系统上会分别使用: WinVista、Win7: D2D (FMX.Canvas.D2D.pas) WinXP: GDI+ (FMX.Canvas.GDIP.pas) Mac 系列: Core Graphics (FMX.Canvas.Mac.pas) 和 HTML5 中的 Canvas 非常类似, 现在的 ...
NULL 博文链接:https://1017401036.iteye.com/blog/2407866
Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、入门学习Canvas技术代码。 HTML5 Canvas核心技术源码技术代码、图形、动画与游戏开发。 Canvas开发、...