最近在使用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.uj5u.com/qiye/248940.html
標籤:其他
下一篇:nvm-node版本管理工具
