Canvas是一种非保留性的绘图界面,即不会记录过去执行的绘图操作,而是保持最终结果(构成图像的彩色像素)。

如果想让 Canvas变得具有交互性,比如用户可以选择、拖动画布上的图形。那么我们必须记录绘制的每一个对象,才能在将来灵活的修改并重绘它们,实现交互。

在之前的文章中(点击查看)我演示了如何实现通过鼠标点击来选择图形,以及图形的拖动。本文接着介绍如何实现当鼠标移入到一个图形元素上,显示相应 tooltip提示信息的功能。

1,效果图

(1)下面样例中点击“添加圆圈”按钮可以在画布上增加位置、大小、颜色都是随机的圆圈。

(2)点击“清空画布”按钮可以清除画布上所有圆圈。

(3)鼠标移动到任意圆圈上,该圆圈会出现黑色边框,同时在鼠标位置处会显示该圆圈的 tip提示文本信息(跟随鼠标)。

(4)鼠标移出圆圈,该圆圈的黑色边框消失,同时 tip提示框也会自动隐藏。

2,代码说明

(1)为了能够将圆圈对象保存起来,我们定义了一个叫Circle()的函数类创建自定义对象。同时要让这个对象能够保持数据,要使用关键字 this来创建属性。

(2)drawCircles() 函数用来根据当前圆圈的集合来填充画布。drawToolTip()函数用来绘制 toolTip提示框。每次程序刷新画布时,会先使用clearRect()方法清除画布上的所有内容。但不用当心这样会造成画布闪烁,即画布上的圆圈一下子全部消失,然后一下子又重新出现。

因为 Canvas针对这个问题进行了优化,会在所有绘图逻辑执行完毕后才清除或绘制所有内容,保证最终结果的流畅。

(3)我们监听 canvas的鼠标移动事件(mousemove),当鼠标每次移动时都与所有的圆形进行碰撞检测。即计算鼠标当前位置是否落在某个形状里。对于圆圈而言,只要计算当前点与圆心的直线距离即可。

如果找到符合条件的圆圈,则将其设置为选中,重绘时对该圆圈描黑边。同时再绘制一个提示框(包含提示框背景,以及上面的提示文字)。

如果没找到符合条件的圆圈,则将之前选中的圆圈置为未选中(如果有的话),那么重绘所有圆圈均无黑边。且提示框也不再绘制。

3,样例代码

(高亮处表示与 tooltip相关的代码)

hangge.com

canvas {

cursor: pointer;

border: 1px solid black;

}

// 这个方法用来储存每个圆圈对象

function Circle(x, y, radius, color) {

this.x = x;

this.y = y;

this.radius = radius;

this.color = color;

this.isSelected = false;

}

// 保存画布上所有的圆圈

var circles = [];

var canvas;

var context;

window.onload = function() {

canvas = document.getElementById("canvas");

context = canvas.getContext("2d");

canvas.onmousemove = onMouseMove;

};

//“添加圆圈”按钮点击

function addRandomCircle() {

// 为圆圈计算一个随机大小和位置

var radius = randomFromTo(10, 60);

var x = randomFromTo(0, canvas.width);

var y = randomFromTo(0, canvas.height);

// 为圆圈计算一个随机颜色

var colors = ["green", "blue", "red", "yellow", "magenta", "orange", "brown",

"purple", "pink"];

var color = colors[randomFromTo(0, 8)];

// 创建一个新圆圈

var circle = new Circle(x, y, radius, color);

// 把它保存在数组中

circles.push(circle);

// 重新绘制画布

drawCircles();

}

//“清空画布”按钮点击

function clearCanvas() {

// 去除所有圆圈

circles = [];

// 重新绘制画布.

drawCircles();

}

//绘制圆圈

function drawCircles() {

// 清除画布,准备绘制

context.clearRect(0, 0, canvas.width, canvas.height);

// 遍历所有圆圈

for(var i=0; i

var circle = circles[i];

// 绘制圆圈

context.globalAlpha = 0.85;

context.beginPath();

context.arc(circle.x, circle.y, circle.radius, 0, Math.PI*2);

context.fillStyle = circle.color;

context.strokeStyle = "black";

if (circle.isSelected) {

context.lineWidth = 5;

}

else {

context.lineWidth = 1;

}

context.fill();

context.stroke();

}

}

//绘制tooltip提示文字

function drawToolTip(txtLoc, x, y) {

context.save();

var padding = 3;

var font = "16px arial";

context.font = font;

context.textBaseline = 'bottom';

context.fillStyle = 'yellow';

//绘制ToolTip背景

var width = context.measureText(txtLoc).width;

var height = parseInt(font, 10);

context.fillRect(x, y-height, width+padding*2, height+padding*2);

//绘制ToolTip文字

context.fillStyle = '#000';

context.fillText(txtLoc, x+padding, y+padding);

context.restore();

}

//当前选中的圆圈

var previousSelectedCircle;

//鼠标移动事件

function onMouseMove(e) {

// 清除之前选择的圆圈

if (previousSelectedCircle != null) {

previousSelectedCircle.isSelected = false;

previousSelectedCircle = null;

}

// 取得画布上被单击的点

var clickX = e.pageX - canvas.offsetLeft;

var clickY = e.pageY - canvas.offsetTop;

// 查找被单击的圆圈

for(var i=circles.length-1; i>=0; i--) {

var circle = circles[i];

//使用勾股定理计算这个点与圆心之间的距离

var distanceFromCenter = Math.sqrt(Math.pow(circle.x - clickX, 2)

+ Math.pow(circle.y - clickY, 2))

// 判断这个点是否在圆圈中

if (distanceFromCenter <= circle.radius) {

previousSelectedCircle = circle;

//选择新圆圈

circle.isSelected = true;

//停止搜索

break;

}

}

//更新显示,重绘圆圈

drawCircles();

//如果当前鼠标位置有圆圈,还要显示tip

if(previousSelectedCircle != null){

drawToolTip("颜色:" + previousSelectedCircle.color, clickX, clickY);

}

}

//在某个范围内生成随机数

function randomFromTo(from, to) {

return Math.floor(Math.random() * (to - from + 1) + from);

}

添加圆圈

清空画布

html鼠标经过状态,HTML5 - 让Canvas内部元素实现鼠标移入、移出效果(Tooltip提示效果)...相关推荐

  1. cesium两种方式鼠标移入移出实体显示提示框

    cesium两种方式鼠标移入移出实体显示提示框 第一种方式 采用cesium的label作为提示框 var labelEntity = viewer.entities.add({label : {sh ...

  2. HTML中设置鼠标悬停状态伪类,四大伪类,css鼠标样式设置,reset操作,静止对文本操作...

    本文将要为您介绍的是四大伪类,css鼠标样式设置,reset操作,静止对文本操作,教程操作方法:07.31自我总结 一.a标签的四大伪类 a:link{样式} 未访问时的状态(鼠标点击前显示的状态) ...

  3. cesium鼠标移入移出实体显示提示框

    使用cesium的label作为提示框 //鼠标移动事件point放大缩小var canvas = this.cesiumViewer.scene.canvas;var handler= new Ce ...

  4. 在html利用canvas蚂蚁,html5 利用canvas实现简单的人物走动

    最近在学习html5,其中涉及到很关键的元素canvas-画布,在网上下载了一些游戏源代码,虽然能看懂,但是想单独地针对某个功能提取出来还是有难处的,于是乎自己又上网查找了一些例子,才将超级玛丽简单的 ...

  5. canvas 判断哪个元素被点击_监听 Canvas 内部元素点击事件的三种方法

    canvas内部元素不能像DOM元素一样方便的添加交互事件监听,因为canvas内不存在"元素"这个概念,他们仅仅是canvas绘制出来的图形.这对于交互开发来说是一个必经障碍,想 ...

  6. div 内部元素出发 mouseout 和mouseover 事件解决

    在用到mouseover和mouseout事件来作为事件触发的条件,但是如果我们用做触发的元素内部有其他的元素的时候当鼠标移上的时候会反复的触发mouseover和mouseout事件.因为内部元素在 ...

  7. 鼠标经过下划线 css3,详解css3和伪元素实现鼠标移入时下划线向两边展开

    本文主要介绍了利用css3+伪元素实现鼠标移入时下划线向两边展开效果的相关资料,文中先进行了详细的介绍,方便大家理解,而后给出了完整的实例代码让大家可以参考学习,需要的朋友们下面来一起学习学习吧.希望 ...

  8. 利用HTML5的canvas进行鼠标写字

    简介: 主要是使用HTML5中的canvas标签进行的,对画布的基本操作可以参考以下链接内容中的HTML5画布canvas: https://blog.csdn.net/qq_44174803/art ...

  9. html5选择状态,HTML5 Canvas 状态

    HTML5 Canvas 状态 我们在canvas上绘制图形的时候,经常需要通过save()和restore()改变2D上下文的状态.举例来说,你在绘制直线或矩形的时候需要一种strokStyle,在 ...

  10. 前端笔记(Html+CSS+JS+DOM+网页特效+jQuery+HTML5+CSS3+canvas 标签+web开发重难点+面向对象+AJAX)

    第1章Html Html:超级文本标记语言(HyperText Markup Language),在浏览器上运行的一种标记语言. 就是给文本加上含有语义的标签. 接下来应该学习更多具体语义标签: 一. ...

最新文章

  1. Spring 注解之@RestController与@Controller的区别
  2. eureka同步原理_eureka原理剖析
  3. html中显示shell脚本的输出,网页从shell脚本中输入并显示结果
  4. python自动化运维快速入门pdf下载_Python自动化运维快速入门
  5. excel 2007 vba与宏完全剖析_Excel怎么保护自己的劳动成果?强制用户启用宏,再加上这一步...
  6. java 线程池 初始大小_为什么tomcat的默认线程池大小如此之大? - java
  7. Android启示录——开始Android旅途
  8. 红外线遥控c语言程序,红外线遥控解码接收程序-c语言讲解学习.pdf
  9. html-webpack-plugin 中使用 title选项设置模版中的值无效
  10. 关于前端开发,你真的了解吗?
  11. count时结果 hive_关于hive中的count的用法(一)
  12. 操作系统学习笔记02【进程控制——进程互斥的硬件实现方法】【自用】
  13. 第六次作业——潘芊睿
  14. 什么是“可维护性”?
  15. 发送广播失败 Parcelable encountered IOException writing serializable object (name =xxxx).
  16. 如何快速理解最大流和最小割
  17. 关于在POI以SAX方式解析,会导出拼音(音标)的问题解决
  18. 腾讯电脑管家 v12.13正式版
  19. STM32 串口下载hex 串口下载程序 CH340串口
  20. 关于信息化管理的建议

热门文章

  1. 项目管理学习 ---- 理解项目管理思维框架
  2. 分享一个HTML【叶子特效】,确切一点 是 落叶特效(完整代码)
  3. 搜索引擎代码资源[转]
  4. Lambda表达式的几种简化形式
  5. 什么软件可以测试宝宝身高体重,如何测试宝宝身高体重
  6. android耳机检测驱动程序,USB 音频 CTS 验证程序测试
  7. 氧化镁MgO晶体基片|钛酸锶SrTiO3晶体基片|铌酸锂LiNbO3晶体基片;直径10mm
  8. 推荐mac os 下更改键盘映射软件KeyRemap4MacBook
  9. 巨星故事之永恒答案:强者才能生存!斗士艾弗森
  10. 引用网页链接的BibTEX格式