红色代表需要改写的代码

1.添加定义图像大小和容器的大小及坐标

d3.behavior.zoom = function () {

      var moveCanvas={

          width: , height: ,

          cx:,cy:,cwidth:,cheight:

      };

    var view = {

      x: ,

      y: ,

      k: 

    }, translate0, center0, center, size = [ ,  ], scaleExtent = d3_behavior_zoomInfinity, duration = , zooming = , mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1;

    if (!d3_behavior_zoomWheel) {

      d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() {

        return -d3.event.deltaY * (d3.event.deltaMode ?  : );

      }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() {

        return d3.event.wheelDelta;

      }, "mousewheel") : (d3_behavior_zoomDelta = function() {

        return -d3.event.detail;

      }, "MozMousePixelScroll");

    }

2.添加定义设置参数方法

zoom.y = function(z) {

      if (!arguments.length) return y1;

      y1 = z;

      y0 = z.copy();

      view = {

        x: ,

        y: ,

        k: 

      };

      return zoom;

    };

 zoom.moveCanvas = function (_) {

        if (!arguments.length) return [moveCanvas.width, moveCanvas.height, moveCanvas.cx, moveCanvas.cy, moveCanvas.cwidth, moveCanvas.cheight];

        moveCanvas = {

            width: +_[],//图像宽度

            height: +_[],//图像高度

            cx: +_[],//容器坐标x

            cy: +_[],//容器坐标y

            cwidth: +_[],//容器宽度

            cheight: +_[],//容器高度

        };

        return zoom;

    };

3.重写translateTo方法

    function scaleTo(s) {

      view.k = Math.max(scaleExtent[], Math.min(scaleExtent[], s));

    }

    function translateTo(p, l) {

      l = point(l);

      view.x += p[] - l[];

      view.y += p[] - l[];

      var minx = moveCanvas.cx - view.k * moveCanvas.width / ;//图像的一半

      var maxx = moveCanvas.cx + moveCanvas.cwidth - moveCanvas.width / *view.k;

      var miny = moveCanvas.cy - view.k * moveCanvas.height / ;//图像的一半

      var maxy = moveCanvas.cy + moveCanvas.cheight - moveCanvas.height / *view.k;

      if (view.x < minx) view.x = minx;

      if (view.y < miny) view.y = miny;

      if (view.x > maxx) view.x = maxx;

      if (view.y > maxy) view.y = maxy;

    }

4.页面调用

 var zoom = d3.behavior.zoom()

                                    .scaleExtent([0.5, ])

                                    .moveCanvas([svgWidth,svgHeight,,,divWidth,divHeight])

                                    .on("zoom", function (d) {

                                        sval = d3.event.scale;

                                        console.info("transform");

                                        gMap.attr("transform", "translate(" + d3.event.translate + ")" + "scale(" + d3.event.scale + ")")

                                    });

使用d3.js的时候,如何用zoom translate scale限制拖拽范围的更多相关文章

  1. 【 D3.js 入门系列 --- 4 】 如何使用scale(比例)

    在上一节中使用了一个很重要的概念 — scale (这个不知道翻译成什么,暂且叫它比例).本节将重点介绍它的相关使用方法. 在介绍 scale 之前,先介绍两个经常和 scale 一起出现的函数,在上 ...

  2. 【 D3.js 入门系列 --- 4 】 怎样使用scale(比例)

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 在上一节中使用了一个非常重要的概念 - scale (这个不知道 ...

  3. AngularJS之拖拽排序(ngDraggable.js)

    ngDraggable.js是一款比较简单实用的angularJS拖拽插件,借助于封装好的一些自定义指令,能够快速的进行一些拖拽应用开发.首先先介绍一些基本的概念; ng-drop:是否允许放入拖拽元 ...

  4. 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)

    缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...

  5. D3.js 力导向图的拖拽(drag)与缩放(zoom)

    不知道大家会不会跟我一样遇到这样的问题,在之前做的力导向图的基础上加上缩放功能的时候,拖动节点时整体会平移不再是之前酷炫的效果(失去了拉扯的感觉!).天啊,简直不能接受如此丑X的效果.经过不懈的努力终 ...

  6. 【 D3.js 进阶系列 】 进阶总结

    进阶系列的文章从去年10月开始写的,晃眼又是4个多月了,想在年前总结一下. 首先恭祝大家新年快乐.今年是羊年吧.前段时间和朋友聊天,聊到十二生肖里为什么没猫,我张口就道:不是因为十二生肖开会的时候猫迟 ...

  7. D3.js使用过程中的常见问题(D3版本D3V4)

    目录 一.学习D3我必须要学习好SVG矢量图码? 二.如何理解D3给Dom节点绑定数据时的Update.Enter和Exit模式 三.D3绑定数据时用datum与data有什么不一样? 四.SVG图中 ...

  8. 前端使用d3.js调用地图api 进行数据可视化

    前段时间自己研究了demo就是把某个区域的某个位置通过经纬度在地图上可视化.其实就是使用了第三方插件,比现在比较火的可视化插件d3.js echart.js.大致思路就是,把要用到的位置的geojso ...

  9. 基于cytoscape.js 、 d3.js实现的关系图谱初级版本

    前面的文章已经介绍了cytoscape.js . d3.js的安装及简单demo,现在展示从html页面转移到vue项目下的最初版的demo 效果图: 代码如下: <template> & ...

随机推荐

  1. 非常详细的 Linux C/C++ 学习路线总结!已拿腾讯offer

    创作不易,点赞关注支持一下吧,我的更多原创技术分享,关注公众号「后端技术学堂」第一时间看! 最近在知乎经常被邀请回答类似如何学习C++和C++后台开发应该具体储备哪些基础技能的问题. 本身我从事的的C ...

  2. [枚举] HDU 2019 Multi-University Training Contest 8 - Calabash and Landlord

    Calabash and Landlord Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  3. 检测页面是否允许使用Flash

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 一文带你入门Java Stream流,太强了

    两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:"就想看你写的啊!"你看你看,多么苍白的喜欢啊.那就&qu ...

  5. 十 | 门控循环神经网络LSTM与GRU(附python演练)

    欢迎大家关注我们的网站和系列教程:http://panchuang.net/ ,学习更多的机器学习.深度学习的知识! 目录: 门控循环神经网络简介 长短期记忆网络(LSTM) 门控制循环单元(GRU) ...

  6. 基于STM32F030F4P9和STM32 CUBEMX 输出PWM波形

    STM32F030F4P9定时器功能比较丰富,在此记录项目中使用其自动输出PWM波形(频率:50HZ).CubeMX配置定时器如下图说明. 在此定时器基础时钟为48MHZ,配置中不做分频处理,预分频系 ...

  7. std::bind接口与实现

    前言 最近想起半年前鸽下来的Haskell,重温了一下忘得精光的语法,读了几个示例程序,挺带感的,于是函数式编程的草就种得更深了.又去Google了一下C++与FP,找到了一份近乎完美的讲义,然后被带 ...

  8. 访问修饰符public,private,protected,以及不写(默认)时的区别?

    private: 1.在当前类开发中,main方法之外可以直接借助名字使用,当前类的main方法中可以使用对象打点的方式直接使用成员. 2.在当前类之外,使用对象(或是类名,针对静态的)打点调用都是被 ...

  9. Bitmap之位图采样和内存计算详解

    原文首发于微信公众号:躬行之(jzman-blog) Android 开发中经常考虑的一个问题就是 OOM(Out Of Memory),也就是内存溢出,一方面大量加载图片时有可能出现 OOM, 通过 ...

  10. .NET Core项目部署到Linux(Centos7)(一)前言

    目录 1.前言 2.环境和软件的准备 3.创建.NET Core API项目 4.VMware Workstation虚拟机及Centos 7安装 5.Centos 7安装.NET Core环境 6. ...