经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
d3 zoom 抖动问题 事件
来源:cnblogs  作者:码农方块  时间:2021/1/18 16:26:21  对本文有异议

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

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

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

  具体代码

  1. _addZoomEvent(canvas, container) {
  2. const _container = d3.select(container);
  3. const _canvas = d3.select(canvas);
  4. let isFirstZoom = true;
  5. // 为了防止抖动 所以把事件添加到父级元素上 防止每次不停计算 而产生抖动
  6. jsPlumb.setZoom(this._scale);
  7. _canvas.style('transform', `scale(${this._scale})`);
  8. _canvas.style('transform-origin', '0 0');
  9. _container.call(d3
  10. .zoom()
  11. .scaleExtent(this._zoomOption.range)
  12. .on('zoom', e => {
  13. // 兼容5.xx 版本 新版本去掉了d3.event 使用 e
  14. e = e || d3.event;
  15. if (isFirstZoom) {
  16. e.transform.k = this._scale;
  17. isFirstZoom = false;
  18. }
  19. let { k, x, y } = e.transform;
  20. _canvas.style('transform', `translate(${x}px, ${y}px) scale(${k})`);
  21. jsPlumb.setZoom(k);
  22. _canvas.style('transform-origin', '0 0');
  23. }));
  24. this._eventManagement.addCancelHandler(() => {
  25. _container.on('zoom', null);
  26. });
  27. }

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

  1. export class EventManagement {
  2. _eventList = [];
  3. constructor() {}
  4. clearEvents() {
  5. this._eventList.forEach(fn => fn());
  6. }
  7. addEvent(target, event, cb, opts) {
  8. target.addEventListener(
  9. event,
  10. e => {
  11. cb(e);
  12. },
  13. opts
  14. );
  15. this._eventList.push(() => {
  16. target.removeEventListener(event, cb);
  17. });
  18. }
  19. addCancelHandler(handler) {
  20. this._eventList.push(handler);
  21. }
  22. }

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

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

  

原文链接:http://www.cnblogs.com/shanghx/p/14276514.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号