创建一个可拖动的圆展示d3.drag的使用

首先创建svg容器和一个circle元素:

const width = window.innerWidth
const height = window.innerHeightconst svg = d3.select('body').append('svg').attr('width', width).attr('height', height).append('g').attr('transform', `translate(${ width / 2 }, ${ height / 2 })`)const circle = svg.append('circle').attr('r', 40).attr('fill', 'red')

监听拖动事件需要先使用d3.drag模块创建一个拖动事件,然后绑定到特定的元素上。

const drag = d3.drag()
// 调用 call是手动调用函数并将选择集作为第一个参数
selection.call(drag)
// 或者
drag( selection )

一次拖动事件你可以定义三个阶段的监听函数:

d3.drag().on('start', dragStart) // 拖动开始,触发一次.on('drag', draged) // 拖动中,触发多次.on('end', dragEnd) // 拖动结束,触发一次

我们通过draged函数设置circle元素的cx,cy属性实现拖动:

const drag = d3.drag().on('start', () => {}).on('end', () => {}).on('drag', draged)circle.call(drag) // 绑定function draged() {const {x,y} = d3.eventd3.select(this).attr('cx', x).attr('cy', y)
}

鼠标位置通过d3.event对象访问到,完整的d3.event属性:

{"type": "drag", // 分别是三个阶段对应的 start drag end"subject": { "x":12.5, "y":-11.5 },"identifier": "mouse","active": 1, // start,end为0  drag阶段为1"x": -30.5, // 鼠标位置"y": -42.5,"dx": -6, // 相对于上次drag的x,y坐标变化"dy": -6,"sourceEvent": MouseEvent(...) // 浏览器原生事件
}

鼠标位置x,y的相对元素可以通过drag.container修改,默认是事件源的父元素:

drag.container(function container() {return this.parentNode
})

d3.event.subject则表示拖拽的主体,默认是事件源上绑定的数据,否则为start阶段的x,y坐标,它的作用是利用它在拖动期间访问主体和指针的相对位置,所以它应该是不可变的。

完整代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body><script src="https://d3js.org/d3.v5.min.js"></script><script>const width = window.innerWidthconst height = window.innerHeightconst svg = d3.select('body').append('svg').attr('width', width).attr('height', height).append('g').attr('transform', `translate(${ width / 2 }, ${ height / 2 })`)svg.attr('stroke', 'red')const circle = svg.append('circle').attr('r', 40).attr('fill', 'red').call(d3.drag().on('start', () => {}).on('end', () => {}).on('drag', draged))function draged() {const {x,y} = d3.eventd3.select(this).attr('cx', x).attr('cy', y)}</script>
</body>
</html>

d3.drag使用指南相关推荐

  1. d3.js 入门指南 - 仪表盘

    D3的全称是Data-Driven Documents(数据驱动的文档),是一个用来做数据可视化的JavaScript函数库,而JavaScript文件的后缀通常为.js,所以D3被称为D3.js. ...

  2. d3.js 入门指南

    说到数据可视化,我们会行到很多优秀的框架,像echarts.highcharts,这些框架很优雅,健壮,能满足我们对可视化的大部分需求,但是缺点也很明显,就是这些框架几乎是不可定制化的,当遇到特殊的需 ...

  3. D3、EChart、HighChart绘图demol

    1.echarts:   <!DOCTYPE html>   <html>   <head>   <meta charset="utf-8" ...

  4. [知识图谱实战篇] 七.HTML+D3实现关系图谱搜索功能

    前面作者讲解了很多知识图谱原理知识,包括知识图谱相关技术.Neo4j绘制关系图谱等,但仍缺少一个系统全面的实例.为了加深自己对知识图谱构建的认识,为后续创建贵州旅游知识图谱打下基础,作者深入学习了张宏 ...

  5. [知识图谱实战篇] 六.HTML+D3实现点击节点显示相关属性及属性值

    前面作者讲解了很多知识图谱原理知识,包括知识图谱相关技术.Neo4j绘制关系图谱等,但仍缺少一个系统全面的实例.为了加深自己对知识图谱构建的认识,为后续创建贵州旅游知识图谱打下基础,作者深入学习了张宏 ...

  6. d3代码如何改造成update结构(恰当处理enter和exit)

    d3的enter和exit 网上有很多blog讲解.说的还凑合的见:https://blog.csdn.net/nicolecc/article/details/50786661 如何把自己的rude ...

  7. svg操纵方案 基于 D3 还是 angular?

    之前还是想简单了, 现在重新写这篇.把逻辑拆分粒度的辨析,放到外面去. 问题提出:svg控制方案 基于 D3 还是 angular 根据这个,html 4种展现样式:普通的html,svg,2D ca ...

  8. D3.js in action 笔记

    因为本书是英文版的,没有中文版,所以基本上这个笔记是为了代码留用,加之其代码格式和内容都比较简洁,然后又提出了很多问题,值得学习. 其中代码的位置:https://github.com/emeeks/ ...

  9. react 数据可视化_使用d3创建数据可视化并在2020年做出React

    react 数据可视化 Data visualisation and application technologies have evolved greatly over the past decad ...

  10. 知识图谱可视化vue.js + d3.js

    Github 前端 vue.js + d3.js. 需求 上部区域 展示所有的概念类别.以及画布内他们的个数 展示所有关系类别,以及画布内他们的个数 显示所有的概念场景(scenes 字段).关系场景 ...

最新文章

  1. AngularJs+bootstrap搭载前台框架——准备工作
  2. android技术下载
  3. spring事务提交回滚原理mybatis版
  4. C语言字符串左右排序交换
  5. nssl1337-矩形统计【单调栈】
  6. 关于Java和Scala同步的五件事你不知道
  7. django模型查询_如何在Django中编写有效的视图,模型和查询
  8. linux adc是什么设备,Linux 驱动--ADC驱动
  9. 创建一个简单的ASP.NET Web应用程序
  10. solidworks迈迪设计宝_机械入门|那些看起来很牛X的机械结构,是如何设计的?...
  11. su室内插件_sketchup模型库+SU组件+插件+风格库集+模型 建筑 室内 园林景观
  12. LCD1602显示程序理解
  13. 求5的阶乘和1-5的阶乘和
  14. 即时聊天软件开发体会
  15. 【C语言】输出“*”菱形图案
  16. Understanding Vertica Epochs
  17. Linux:根文件系统构建
  18. 机器学习经典书籍和论文集合
  19. 年前人间尤物,年后惨不忍睹
  20. 里程碑:SpaceX首次成功实现海上回收火箭

热门文章

  1. 截图工具-picpick绿色破解版免安装
  2. python 发送邮件正文字体设置_python 发送邮件
  3. 工作说明书SOW(Statement Of Work)
  4. 脚本精灵for+android,脚本精灵 v3.0.8
  5. Ubuntu中USB端口与外设绑定,ROS读取IMU模块数据
  6. python泰坦尼克号数据预测_Python机器学习预测泰坦尼克号乘客生存率(kaggle项目)...
  7. kali linux启动盘工具,白话kali linux USB启动盘的制作(快捷版)
  8. SQLite3数据库
  9. 什么是TrustedInstaller管理权限?
  10. java mybatisplus Error parsing time stamp