基于 Raphael.js 实现对 Raphael 画布进行缩放和移动

本贴最后更新于 2824 天前,其中的信息可能已经渤澥桑田

最近项目里有个基于 raphael.js 的功能要进行迭代,要求要可以对画布进行缩放和移动,类似于地图那种放大缩小移动,研究了一番,发现 raphael 并没有直接实现这些功能,看了手册,我发现了 paper 的 setViewBox 方法:
a375341fa9d941d7a4a9c492cc46b4ae-WX201707302346332x.png
经过测试,这个方法类似于一个放大镜的功能,它在不改变画布 paper 的情况下,截取某一个区域,用这个区域来铺满 paper,于是我们可以使用它来实现放大、移动的效果,代码如下:

<html> <head> <title>raphael缩放移动画布/</title> <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js" type="text/javascript"></script> <script src="https://cdn.bootcss.com/raphael/2.2.7/raphael.min.js" type="text/javascript"></script> </head> <body> <div id="paper"></div> </body> </html> <script> $(function () { //一些全局参数 const paperWidth = 500; //画布宽度 const paperHeight = 500; //画布高度 const maxSize = 3; //允许放大的最大倍数 const minSize = 0.5; //允许缩小的最大倍数 var mouseOnBackGround = false; //鼠标是否悬浮在画布上 var mouseOnObject = false; //鼠标是否悬浮在画布的某个对象上 var mouseDown = false; //鼠标是否得按住状态 var lastMouseLocation = {}; //记录鼠标移动之前的坐标 //缩放相关参数 //coef:每次放大、缩小的增量; //zoom:目前的大小与原来大小的比例; //(x,y):目前缩放图的左上角坐标; //w,h:以(x,y)为原点取得宽度和高度; const scale = {coef: 0.05, zoom: 1, x: 0, y: 0, w: paperWidth, h: paperHeight}; //创建一个画布 var paper = new Raphael("paper", paperWidth, paperHeight); //创建一个跟paper一样尺寸的rect模拟背景图 paper.rect(0, 0, paperWidth, paperHeight) .attr({ "stroke": "blue", "stroke-width": 4, "fill": "#e1e1e1" } ) .hover( function () { //鼠标进入背景 mouseOnBackGround = true; }, function () { //鼠标移出背景 mouseOnBackGround = false; } ); //创建一个圆 paper.circle(150, 150, 40) .attr({ "stroke": "red", "stroke-width": 4, "fill": "blue", "opacity": 0.5 }) .hover( function () { //鼠标进入 mouseOnObject = true; }, function () { //鼠标移出 mouseOnObject = false; } ); //创建一个圆角方形 paper.rect(250, 250, 50, 50, 10) .attr({ "stroke": "blue", "stroke-width": 4, "fill": "green" } ) .hover( function () { //鼠标进入 mouseOnObject = true; }, function () { //鼠标移出 mouseOnObject = false; } ); //更新Scale function updateScale(x, y, w, h) { scale.w = w; scale.h = h; scale.x = x; scale.y = y; } //获取操作前的viewbox中心点 function getLastCenterPoint() { var centerPoint = {}; centerPoint.x = scale.x + scale.w / 2; centerPoint.y = scale.y + scale.h / 2; return centerPoint; } /** *鼠标滚轮缩放 * */ function onMouseWheeling(e) { var dtl; if (!mouseOnBackGround && !mouseOnObject) { return; } if (e.wheelDelta) { //chrome dtl = e.wheelDelta; } else if (e.detail) {//firefox or others dtl = -e.detail; } if (dtl < 0) { //缩小, if (scale.zoom < minSize) { return; } scale.zoom -= scale.coef; } else { //放大 if (scale.zoom > maxSize) { return; } scale.zoom += scale.coef; } //计算新的视图参数 var w = paperWidth / scale.zoom; var h = paperHeight / scale.zoom; var lastCenterPoint = getLastCenterPoint(); var x = lastCenterPoint.x - w / 2; var y = lastCenterPoint.y - h / 2; updateScale(x, y, w, h); paper.setViewBox(x, y, w, h, false); } if (document.addEventListener) { document.addEventListener('DOMMouseScroll', onMouseWheeling, false); window.onmousewheel = document.onmousewheel = onMouseWheeling;//IE/Opera/Chrome/Safari } else { alert("鼠标滚轮监听事件绑定失败"); } //监听鼠标移动 $(document).bind('mousedown', function (e) { lastMouseLocation.x = e.clientX; lastMouseLocation.y = e.clientY; mouseDown = true; }).bind('mouseup', function (e) { lastMouseLocation = {}; mouseDown = false; }).bind('mousemove', function (e) { if (!mouseDown) { return; } if (!mouseOnBackGround && !mouseOnObject) { return; } var dx = e.clientX - lastMouseLocation.x; var dy = e.clientY - lastMouseLocation.y; var x = scale.x - dx; var y = scale.y - dy; updateScale(x, y, scale.w, scale.h); lastMouseLocation.x = e.clientX; lastMouseLocation.y = e.clientY; paper.setViewBox(x, y, scale.w, scale.h, false); }) }); </script>

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 611 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 597 回帖
  • 996
    13 引用 • 200 回帖 • 3 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    267 引用 • 666 回帖 • 2 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 6 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖 • 1 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 2 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    173 引用 • 516 回帖
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖 • 2 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖
  • Sandbox

    如果帖子标签含有 Sandbox ,则该帖子会被视为“测试帖”,主要用于测试社区功能,排查 bug 等,该标签下内容不定期进行清理。

    431 引用 • 1250 回帖 • 596 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖 • 10 关注
  • Access
    1 引用 • 3 回帖 • 2 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 210 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 532 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 115 关注