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

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

最近项目里有个基于 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>

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 734 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    17 引用 • 7 回帖 • 2 关注
  • 叶归
    12 引用 • 56 回帖 • 23 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 42 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 828 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 53 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 625 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 16 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    37 引用 • 157 回帖
  • Follow
    4 引用 • 12 回帖 • 4 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    167 引用 • 408 回帖 • 487 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    54 引用 • 37 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 26 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 2 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 642 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 469 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 2 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 153 关注
  • Typecho

    Typecho 是一款博客程序,它在 GPLv2 许可证下发行,基于 PHP 构建,可以运行在各种平台上,支持多种数据库(MySQL、PostgreSQL、SQLite)。

    12 引用 • 67 回帖 • 446 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    199 引用 • 1421 回帖 • 2 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    100 引用 • 905 回帖
  • Anytype
    3 引用 • 31 回帖 • 28 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    115 引用 • 319 回帖 • 1 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 59 回帖
  • Outlook
    1 引用 • 5 回帖 • 2 关注
  • Solo

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

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

    1444 引用 • 10083 回帖 • 506 关注