d3 zoom 抖動問題事件

最近在使用d3 zoom得時候   遇到一個小坑canvas

直接對元素添加 zoom事件 會有很大得抖動,查文檔 看代碼以後發現是 因爲元素在不斷變化, 因此計算基礎值也不不斷變化,因此會致使計算出來得值 忽大忽小  從而形成抖動dom

解決辦法 :在他父元素上添加事件  而後在子元素上添加style 方法ide

 

具體代碼網站

_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添加事件得時候 要記得銷燬事件   因此咱們對事件作一個總體統一處理  具體代碼以下this

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);
}
}

https://www.51220.cn 51220網站目錄orm

使用時  建立一個實例出來 全部事件有關方法都掛在到實例上 最後銷燬事件

_eventManagement = new EventManagement();this._eventManagement.addEvent(canvas, 'mouseup', e => {this._analyzeCanvasMouseup(e);   });this._eventManagement.clearEvents();
相關文章
相關標籤/搜索