D3.js 拖拽功能实现 (drag)

D3.js drag 拖拽功能:

在使用图表呈现一些数据的交互效果时,难免会有一些需要使用拖拽效果的需求。所以是有必要了解一下drag拖拽的方法。

1.D3.drap()

方法用来创建拖拽事件, d3.drag() 会返回一个drag方法,然后在使用selection.call()这个方法将返回的拖拽事件绑定到对应的元素上。

2.selection.call( )

前面我们知道,使用select.all()可以获取到选择的元素的一个集合,selection.call(function[, arguments…]) 调用给定的函数一次,传入选集和可选的参数。返回这个选集。无论指定函数的返回值是什么,call操作符总是返回当前的选择,所以我们可以对选择的元素进行相关操作

const svg = d3.select(".qq").append("svg").attr("width", 700).attr("height", 400).style("border", "1px solid pink")

    // 模拟数据  这里采用比较简单的原点
    const dataList = [
        { 'r': 10, 'x': 80, y: 180, 'color': 'orange' },
        { 'r': 20, 'x': 150, y: 250, 'color': 'blue' },
        { 'r': 30, 'x': 85, y: 250, 'color': 'purple' },
        { 'r': 15, 'x': 323, y: 100, 'color': 'pink' },
        { 'r': 25, 'x': 500, y: 250, 'color': 'green' },
    ]

    // 绘制图形
    const circle = d3.select("svg")
        .selectAll("circle")
        .data(dataList)
        .join("circle")
        .attr("r", (d) => d.r)
        .attr("cx", (d) => d.x)
        .attr("cy", (d) => d.y)
        .attr("fill", (d) => d.color)
        .call(function (d) {
          	console.log(d)   // d代表circle元素的集合数组  可以对它进行操作
            console.log(this);   //这里的this指向是window
        })
        .call(name,'echo','john');  // 会给每一个函数添加对应的 名称
        function name(selection, first, last) {
        selection.attr("first-name", first).attr("last-name", last);
    }
        

3.拖拽事件的步骤:开始拖拽 drag.on(‘start’) ; 拖拽中 drag.on(‘dragged’) ; 拖拽结束 drag.on(‘end’)

下面直接看一个例子:

![22](C:\Users\user\Desktop\22.gif)// 创建svg和原点数据
const svg = d3.select(".qq").append("svg").attr("width", 700).attr("height", 400).style("border", "1px solid pink")

    // 模拟数据  这里采用比较简单的原点
    const dataList = [
        { 'r': 10, 'x': 80, y: 180, 'color': 'orange' },
        { 'r': 20, 'x': 150, y: 250, 'color': 'blue' },
        { 'r': 30, 'x': 85, y: 250, 'color': 'purple' },
        { 'r': 15, 'x': 323, y: 100, 'color': 'pink' },
        { 'r': 25, 'x': 500, y: 250, 'color': 'green' },
    ]

    // 绘制图形
    const circle = d3.select("svg")
        .selectAll("circle")
        .data(dataList)
        .join("circle")
        .attr("r", (d) => d.r)
        .attr("cx", (d) => d.x)
        .attr("cy", (d) => d.y)
        .attr("fill", (d) => d.color)
    
    // 拖拽事件
	  /* 
    1.我们先使用d3.drag( ) 建立拖曳事件
    2.使用drag.on( ) 设定拖曳不同阶段DOM元素的变化
    start ⇒ 拖曳事件一开始时,让选定的圆点边框变成蓝色
    drag ⇒ 拖曳期间,使用 d3.pointer 去计算目前滑鼠的XY座标,并把这个座标的位置设定给此圆点
    end ⇒ 拖曳结束后,选定的圆点边框变回原本的颜色
    */
    const drag = d3.drag()
        .on('start', function () {
            d3.select(this)
                .style('stroke', 'black')
        })
        .on('drag', function () {
            let pt = d3.pointer(event, this) // 这里pointer事件是获取到当前点击元素,并可以得到对应的坐标
            d3.select(this)
                .attr('cx', pt[0])
                .attr('cy', pt[1])
        })
        .on('end', function () {
            d3.select(this)
                .style('stroke', 'purple')
        });

    circle.call(drag)
    

效果如下:

22.gif

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用D3.js实现生成拓扑图,你可以使用D3.js行为(drag behavior)和力导向图(layout)来实现。首先,你需要创建一个SVG容器来放置你的拓扑图。然后,使用D3.js行为来使节点可。你可以通过调用`d3.drag()`函数来创建一个行为,并将其应用到节点上。在行为的回调函数中,你可以更新节点的位置。接下来,你可以使用D3.js的力导向图布局(layout)来计算节点的位置。你可以使用`d3.forceSimulation()`函数创建一个力导向图布局,并设置力的参数,如引力、斥力等。然后,将节点和边添加到力导向图布局中,并在每一帧更新节点的位置。最后,你可以使用D3.js的选择集(selection)和绑定数据(data binding)来绘制节点和边。你可以使用`d3.select()`函数选择SVG容器,并使用`selection.data()`函数绑定节点和边的数据。然后,使用`selection.enter()`函数创建新的节点和边,并使用`selection.exit()`函数删除不需要的节点和边。通过设置节点和边的位置和样式,你可以绘制出生成的拓扑图。\[2\]\[3\] #### 引用[.reference_title] - *1* [【工具推荐】使用D3.js制作网页版网络拓扑图,可转可跳转链接](https://blog.csdn.net/diandianxiyu/article/details/131003483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [使用 d3.js 绘制资源拓扑图](https://blog.csdn.net/weixin_38625669/article/details/103763186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值