d3.js 取消zoom双击放大, 阻止默认事件

描述

使用 D3.js v5版本绘制了一个力引导图, 有几个功能之间发生了冲突:

  • 单击节点展示节点信息
  • 双击节点以该节点为中心展开
  • 双击导致 svg 图放大 (zoom)
    在这里插入图片描述

问题

双击节点时, 会触发这个节点的双击事件, 这个节点的单击事件, 还有整个svg的双击事件.

解决

方法一

考虑到整个svg图会受节点双击事件影响导致放大, 是由于冒泡导致的, 所以可以取消一下 d3.js 的事件冒泡:

        .on("zooms", function () {
            d3.event.sourceEvent.stopPropagation();
        })

在这里插入图片描述
效果:

  • 点击节点时不会放大整个 svg 图
  • 点击节点以外的其他区域时, svg 可以放大

方法二

将 zoom 中的双击事件重新设置为null:
在这里插入图片描述

vue 引入的 d3 库中, d3-zoom.js 中的代码:
在这里插入图片描述

效果:

  • 整个svg图的双击放大功能失效, 因此不仅点击节点时不会导致svg图放大, 点击其他区域也不会使svg图放大.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
D3.js是一个强大的JavaScript库,用于数据可视化,其中的zoom缩放和拖拽功能允许用户交互式地探索复杂的数据集。在D3的`d3.zoom()`函数中,你可以创建一个缩放行为,它可以应用于SVG、Canvas或任何支持CSS变换的元素上。 以下是D3 zoom缩放拖拽的基本实现步骤: 1. **创建Zoom行为**: ```javascript const zoom = d3.zoom() .scaleExtent([1, 10]) // 设置缩放范围 .on("zoom", zoomed); // 触发事件处理函数(zoomed) svg.append("g") .call(zoom); // 将zoom行为应用到SVG元素的子元素上 ``` 2. **定义zoomed函数**: 这个函数会在每次缩放事件后被调用,更新视图的位置和比例: ```javascript function zoomed() { svg.select(".zoom-gROUP") .attr("transform", d3.event.transform); // 更新元素的transform属性 } ``` 3. **拖拽处理**: D3没有内置的拖拽功能,但你可以结合`d3.behavior.drag()`来添加拖拽。首先,创建一个可拖拽的元素,然后定义`dragged`函数来处理拖动事件: ```javascript const drag = d3.drag() .on("start", dragstarted) .on("drag", dragged) .on("end", dragended); element.call(drag); ``` 4. **处理开始、移动和结束事件**: ```javascript function dragstarted(d) { // 在开始拖动时设置初始位置 d3.event.sourceEvent.stopPropagation(); // 阻止默认的鼠标事件 } function dragged(d) { // 根据拖动更新元素位置 } function dragended(d) { // 拖动结束后可能需要更新状态或数据 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charonmomo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值