d3 zoom 抖动问题事件

摘要:直接对元素添加 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();

来自:https://www.cnblogs.com/shanghx/archive/2021/01/14/14276514.html


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_10077