d3 zoom 抖动问题 事件

最近在使用d3 zoom得时候   遇到一个小坑

直接对元素添加 zoom事件 会有很大得抖动,查文档 看代码之后发现是 由于元素在不断变化, 所以计算基础值也不不断变化,所以会导致计算出来得值 忽大忽小  从而造成抖动

解决办法  在他父元素上添加事件  然后在子元素上添加style 方法

  具体代码

_addZoomEvent(canvas, container) {
    const _container = d3.select(container);
    const _canvas = d3.select(canvas);
    let isFirstZoom = true;
    // 为了防止抖动 所以把事件添加到父级元素上  防止每次不停计算 而产生抖动
    jsPlumb.setZoom(this._scale);
    _canvas.style('transform', `scale(${this._scale})`);
    _canvas.style('transform-origin', '0 0');
    _container.call(d3
      .zoom()
      .scaleExtent(this._zoomOption.range)
      .on('zoom', e => {
        // 兼容5.xx 版本  新版本去掉了d3.event 使用 e
        e = e || d3.event;
        if (isFirstZoom) {
          e.transform.k = this._scale;
          isFirstZoom = false;
        }

        let { k, x, y } = e.transform;
        _canvas.style('transform', `translate(${x}px, ${y}px) scale(${k})`);
        jsPlumb.setZoom(k);
        _canvas.style('transform-origin', '0 0');
      }));
    this._eventManagement.addCancelHandler(() => {
      _container.on('zoom', null);
    });
  }

顺便在记录一下 我们在对dom添加事件得时候 要记得销毁事件   所以我们对事件做一个整体统一处理  具体代码如下

export class EventManagement {
  _eventList = [];
  constructor() {}
  clearEvents() {
    this._eventList.forEach(fn => fn());
  }
  addEvent(target, event, cb, opts) {
    target.addEventListener(
      event,
      e => {
        cb(e);
      },
      opts
    );
    this._eventList.push(() => {
      target.removeEventListener(event, cb);
    });
  }

  addCancelHandler(handler) {
    this._eventList.push(handler);
  }
}

  使用时  创建一个实例出来 所有事件有关方法都挂在到实例上 最后销毁

_eventManagement = new EventManagement();
this._eventManagement.addEvent(canvas, 'mouseup', e => {
      this._analyzeCanvasMouseup(e);
   });
this._eventManagement.clearEvents();

  

(0)

相关推荐

  • CSS动画实例:Loading加载动画效果(三)

    3.小圆型Loading 这类Loading动画的基本思想是:在呈现容器中定义1个或多个子层,再对每个子层进行样式定义,使得其均显示为一个实心圆形,最后编写关键帧动画控制,使得各个实心圆或者大小发生改 ...

  • ERPLAB中文教程:创建与查看EventList

    更多技术干货第一时间送达 Hello,大家好! Rose小哥今天介绍一下ERPLAB中是如何创建EventList的. 主要内容包括: 介绍ERPLAB中常见的几个概念: 介绍如何创建EventLis ...

  • python测试开发django-135.CSS如何让左侧浮动(float)元素占满屏幕高度

    前言 在设计左侧固定,右侧自适应布局页面的时候,左侧的浮动(float)元素一般会给个背景色,希望根据屏幕高度铺满整个屏高. 展示效果 如下图,左侧黑色背景只显示一半,希望实现效果能一直到屏幕底部,并 ...

  • CSS动画基础知识

    CSS动画就是通过CSS (Cascading Style Sheet,层叠样式表)代码搭建的网页动画.它允许设计师和开发人员通过编辑网站的CSS代码来添加页面动画,从而轻松取代传统动画图片或flas ...

  • ERPLAB中文教程:高级EvenList选项

    更多技术干货第一时间送达 大家好! 今天Rose小哥介绍关于ERPLAB中的高级EvenList选项. 前面我们介绍了使用ERPLAB来分析脑电数据的第一步: 安装ERPLAB并添加通道<ERP ...

  • 《血疫》改编自真实事件“埃博拉病毒”,看完令人毛孔悚然

    今年上半年,新冠病毒让许多人陷入了恐慌,疫情还未结束,最近又传出了埃博拉病毒重来的消息.不得不说,2020真的很魔幻! 也许许多人还不知道埃博拉病毒到底有多恐怖?<血疫>这部片子就是像我们 ...

  • 这些根据真实事件改编的电影,你看过几部?

    电影源于生活,而生活有时候比电影更狗血. 今天小编就为大家盘点几部今年改编自真实事件的电影,如果说不是电影将这些故事呈现出来,也许我们很难想象,这是事情居然真实的在这个世界发生过. 1,孟买酒店 这部 ...

  • 小委托人|真实事件改编,7岁男孩被后妈虐打致死。

    小委托人|真实事件改编,7岁男孩被后妈虐打致死。

  • 孟买酒店|改编自印度“911”事件,每一秒都令人紧张到窒息。

    比恐怖片更恐怖的永远都是真实事件! 近年来,印度电影总是不断带给我们惊喜. 这一次,<孟买酒店>再次刷新了印度片的高度,整部片子没有载歌载舞没有欢笑,观影过程中,满是令人窒息的紧张感. 大 ...

  • 火工头陀事件后,少林派为什么不能靠七十二绝技迅速崛起?

    作者:萨沙 本文章为萨沙原创,谢绝任何媒体转载 萨沙一本正经的胡说八道第152期 火工头陀事件后,少林派为什么不能靠七十二绝技迅速崛起? 火工头陀事件,竟然使得少林寺,长达70多年一蹶不振. 当昆仑三 ...

  • 长沙中创教育事件:成人高考成绩查询时间

    成人高考简介 成人高等学校招生全国统一考试,简称成人高考,是我国成人高等学校选拔合格的毕业生以进入更高层次学历教育的入学考试,属于国民教育系列教育,已经列入国家招生计划. 成人高考报名时间 考试时间由 ...

  • 悬崖之上背景介绍 悬崖之上历史原型事件是什么

    悬崖之上背景介绍 悬崖之上历史原型事件是什么 时间:2021-04-26 10:09:05 作者:河森堡 来源:网络 <悬崖之上>并不是一部简单的谍战片,背后的历史事件是有原型可寻的.故事 ...

  • 加涅的9个教学事件/学习水平

    你是否曾经对某人进行新流程或技能方面的培训?也许你认为这将是一个简单,直接的任务.但是,一旦你真正开始了会话,它可能会比你预期的要难. 每个人都有不同的学习风格.你如何呈现信息以使受训者或一组受训者有 ...

  • 威迈斯IPO事件

    威迈斯IPO事件,也让很多汽车明白行业未来五年将会出现百年一遇的重大变革,这也是一场淘汰赛. 胜利者将享受全球最大汽车市场的蛋糕失败者将黯然离场,因为特斯拉的出现. 就如当初苹果变革手机产业一样,把所 ...