D3.js及实例应用

news/2025/1/18 15:59:07/

文章目录

    • D3.js
    • d3.js 应用实例
      • 图标展示
      • 点击选择
      • 拖拉拽应用

D3.js

D3.js是一个功能强大的JavaScript库,除了图标展示,还能实现多种类型的交互效果:

  • 数据可视化交互
    • 动态更新图表:根据用户操作(如点击按钮、选择下拉菜单等)实时更新数据,并相应地更新图表展示。例如,在柱状图中,用户可以切换不同的数据集,柱状图会动态调整柱子的高度和数量 。
    • 数据过滤与筛选:提供交互手段让用户根据特定条件过滤或筛选数据,从而在图表中仅展示符合要求的数据子集。比如,在一个包含多个城市销售数据的折线图中,用户可以通过勾选城市名称的复选框,只显示特定城市的销售数据变化趋势。
    • 数据排序:允许用户对数据进行排序,使图表按照新的顺序展示数据。以柱状图为例,用户可以点击一个按钮,让柱子按照从高到低或从低到高的顺序排列,从而更直观地比较数据大小。
  • 图形元素交互
    • 元素突出显示:当用户鼠标悬停在某个图形元素(如柱状图中的柱子、饼图中的扇区等)上时,该元素可以通过改变颜色、大小、透明度等属性来突出显示,以提供更多关于该元素的信息。例如,在一个地图上,当鼠标悬停在某个城市的图标上时,该城市的名称和相关统计数据会显示出来,同时图标的颜色会变亮。
    • 元素选择与取消选择:用户可以通过点击等操作选择图形元素,被选中的元素可以呈现出特定的样式(如添加边框、改变填充颜色等),以表示其处于选中状态。再次点击该元素或执行其他特定操作,可以取消选择,元素恢复到原始样式。这种交互在处理多个图形元素时非常有用,例如在一个包含多个数据点的散点图中,用户可以选择特定的数据点,然后对这些选中的数据点进行进一步的分析或操作。
    • 元素移动、缩放与旋转:通过交互操作,用户可以对图形元素进行移动、缩放或旋转。例如,在一个流程图中,用户可以拖动某个流程节点到新的位置,以调整流程图的布局;在一个地图应用中,用户可以通过缩放操作(如滚动鼠标滚轮或使用双指缩放手势)来放大或缩小地图,以便查看更详细的地理信息或更广阔的区域;在一个三维模型展示中,用户可以通过旋转操作(如拖动鼠标或使用特定的旋转按钮)来改变三维模型的视角,从不同角度观察模型的细节 。
  • 导航与控制交互
    • 菜单与选项卡:创建菜单或选项卡界面,用户可以通过点击菜单项或切换选项卡来执行不同的操作或查看不同的内容。例如,在一个数据可视化应用中,菜单可以包含“导入数据”“导出图表”“设置图表样式”等菜单项,用户通过点击相应的菜单项来完成特定的操作;选项卡界面可以用于展示不同类型的图表或数据视图,用户通过切换选项卡来快速查看和比较不同的数据展示方式。
    • 按钮与滑块:按钮是一种常见的交互元素,用户通过点击按钮来触发特定的操作,如提交表单、执行数据分析、刷新图表等。例如,在一个调查表单页面中,用户填写完所有的调查问题后,点击“提交”按钮,表单数据会被发送到服务器进行处理;滑块则常用于调整数值参数,用户可以通过拖动滑块来改变某个数值的大小,例如在一个图表的动画展示中,用户可以通过拖动滑块来控制动画的播放速度,或者在一个地图应用中,用户可以通过拖动滑块来调整地图的亮度或对比度。
    • 导航栏与面包屑导航:导航栏通常位于页面的顶部或侧边栏,用于展示网站或应用的主要功能模块或页面链接,用户可以通过点击导航栏中的链接来快速跳转到不同的页面或执行不同的操作。例如,在一个电商网站中,导航栏可能包含“首页”“商品分类”“购物车”“我的订单”等链接,用户通过点击这些链接来浏览商品、管理购物车和查看订单状态等;面包屑导航则是一种辅助导航方式,通常显示在页面的顶部,用于展示用户当前所在页面在网站结构中的位置路径,用户可以通过点击面包屑导航中的链接来快速返回上级页面或跳转到其他相关页面。例如,在一个新闻网站中,当用户点击进入一篇具体的新闻文章页面时,面包屑导航可能会显示“首页 > 新闻分类 > 具体新闻文章”,用户通过点击“新闻分类”或“首页”等链接,可以方便地在网站的不同页面之间进行导航。

d3.js 应用实例

以下是一个使用D3.js实现的包括图标展示、点击选择和拖拉拽应用的综合实例:

图标展示

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>D3.js SVG Example</title><script src="https://d3js.org/d3.v7.min.js"></script><style>svg {border: 1px solid #ccc;}</style>
</head><body><svg width="500" height="300"></svg><script>javascript">// 创建SVG元素const svg = d3.select('svg');// 定义一些图标数据,这里以简单的圆形和矩形为例const data = [{ shape: 'circle', cx: 50, cy: 50, r: 30, fill: 'red' },{ shape: 'rect', x: 150, y: 20, width: 60, height: 40, fill: 'blue' },{ shape: 'circle', cx: 250, cy: 100, r: 20, fill: 'green' },{ shape: 'rect', x: 350, y: 50, width: 40, height: 60, fill: 'orange' }];// 根据数据绘制图标svg.selectAll('g').data(data).enter().append('g').each(function (d) {const g = d3.select(this);if (d.shape === 'circle') {g.append('circle').attr('cx', d.cx).attr('cy', d.cy).attr('r', d.r).attr('fill', d.fill);} else if (d.shape === 'rect') {g.append('rect').attr('x', d.x).attr('y', d.y).attr('width', d.width).attr('height', d.height).attr('fill', d.fill);}});</script>
</body></html>

点击选择

在上述代码基础上,添加点击事件处理:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>D3.js SVG Example</title><script src="https://d3js.org/d3.v7.min.js"></script><style>svg {border: 1px solid #ccc;}.selected {stroke: black;stroke-width: 2;}</style>
</head><body><svg width="500" height="300"></svg><script>javascript">// 创建SVG元素const svg = d3.select('svg');// 定义一些图标数据,这里以简单的圆形和矩形为例const data = [{ shape: 'circle', cx: 50, cy: 50, r: 30, fill: 'red' },{ shape: 'rect', x: 150, y: 20, width: 60, height: 40, fill: 'blue' },{ shape: 'circle', cx: 250, cy: 100, r: 20, fill: 'green' },{ shape: 'rect', x: 350, y: 50, width: 40, height: 60, fill: 'orange' }];// 根据数据绘制图标const groups = svg.selectAll('g').data(data).enter().append('g').each(function (d) {const g = d3.select(this);if (d.shape === 'circle') {g.append('circle').attr('cx', d.cx).attr('cy', d.cy).attr('r', d.r).attr('fill', d.fill);} else if (d.shape === 'rect') {g.append('rect').attr('x', d.x).attr('y', d.y).attr('width', d.width).attr('height', d.height).attr('fill', d.fill);}// 为每个图标添加点击事件g.on('click', function () {// 清除之前选中的图标样式svg.selectAll('.selected').classed('selected', false);// 为当前点击的图标添加选中样式d3.select(this).classed('selected', true);});});</script>
</body></html>

拖拉拽应用

继续在上述代码基础上,添加拖拉拽功能:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>D3.js SVG Example</title><script src="https://d3js.org/d3.v7.min.js"></script><style>svg {border: 1px solid #ccc;}.selected {stroke: black;stroke-width: 2;}</style>
</head><body><svg width="500" height="300"></svg><script>javascript">// 创建SVG元素const svg = d3.select('svg');// 定义一些图标数据,这里以简单的圆形和矩形为例const data = [{ shape: 'circle', cx: 50, cy: 50, r: 30, fill: 'red' },{ shape: 'rect', x: 150, y: 20, width: 60, height: 40, fill: 'blue' },{ shape: 'circle', cx: 250, cy: 100, r: 20, fill: 'green' },{ shape: 'rect', x: 350, y: 50, width: 40, height: 60, fill: 'orange' }];// 根据数据绘制图标const groups = svg.selectAll('g').data(data).enter().append('g').each(function (d) {const g = d3.select(this);if (d.shape === 'circle') {g.append('circle').attr('cx', d.cx).attr('cy', d.cy).attr('r', d.r).attr('fill', d.fill);} else if (d.shape === 'rect') {g.append('rect').attr('x', d.x).attr('y', d.y).attr('width', d.width).attr('height', d.height).attr('fill', d.fill);}// 为每个图标添加点击事件g.on('click', function () {// 清除之前选中的图标样式svg.selectAll('.selected').classed('selected', false);// 为当前点击的图标添加选中样式d3.select(this).classed('selected', true);});});// 创建拖拽行为const drag = d3.drag().on('start', dragstarted).on('drag', dragged).on('end', dragended);// 将拖拽行为应用到所有图标组上groups.call(drag);function dragstarted(event, d) {d3.select(this).raise().classed('selected', true);}function dragged(event, d) {const dx = event.x - d3.select(this).attr('x');const dy = event.y - d3.select(this).attr('y');d3.select(this).attr('transform', `translate(${dx},${dy})`);}function dragended(event, d) {d3.select(this).classed('selected', false);}</script>
</body></html>

在上述代码中,首先创建了SVG元素并绘制了一些简单的圆形和矩形图标。然后,为每个图标添加了点击事件,点击时会选中该图标并添加特定样式。最后,创建了拖拽行为并应用到所有图标上,实现了图标可以被拖拉拽的功能。


http://www.ppmy.cn/news/1564186.html

相关文章

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成&#xff08;F1&#xff09; FLASH读写过程&#xff08;F1&#xff09; 闪存的读取 闪存的写入 内部FLASH构成&#xff08;F4 / F7 / H7&#xff09; FLASH读写过程&#xff08;F4 / F7 / H7&#xff09; 闪存的读取 闪存的写入 …

图像识别opencv翻转

运行界面 以下是代码&#xff1a; import cv2 import numpy #读取图像 img cv2.imread("../image/cat.jpg") #1,0,-1代表不一样的翻转效果 flipped cv2.flip(img, 1) #显示结果 cv2.imshow("Flip", flipped) cv2.imshow("original", img) cv2…

【C++ 类和对象 进阶篇】—— 逻辑森林的灵动精灵,舞动类与对象的奇幻圆舞曲

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

4、dockerfile实现lnmp

dockerfile实现lnmp&#xff1a; nginx centos7 172.111.0.10 mysql centos7 172.111.0.20 php centos7 172.111.0.30 自定义镜像来实现整个架构 nginx dockerfile配置文件 nginx配置文件 创建镜像 声明网段 创建…

MYSQL的第一次作业

目录 前情提要 题目解析 连接并使用数据库 创建employees表 创建orders表 创建invoices表 ​查看建立的表 前情提要 需要下载mysql并进行配置&#xff0c;建议下载8.0.37&#xff0c;详情可见MySQL超详细安装配置教程(亲测有效)_mysql安装教程-CSDN博客 题目解析 …

SpringBoot开发——使用ObjectMapper处理JSON数据

文章目录 1. 基本对象到JSON的转换2. 基本JSON到对象的转换3. 使用注解自定义JSON字段名称4. 序列化时忽略字段5. 处理未知的JSON字段6. 将对象列表转换为JSON7. 在Spring Boot控制器中使用ObjectMapper8. 将JSON文件转换为对象9. 美化打印JSON输出10. 自定义ObjectMapper配置本…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的&#xff0c;关于类与对象不才在前面笔记中有详细的介绍&#xff1a;点我…

深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术

深入了解卷积神经网络&#xff08;CNN&#xff09;&#xff1a;图像处理与深度学习的革命性技术 导语 卷积神经网络&#xff08;CNN&#xff09;是现代深度学习领域中最重要的模型之一&#xff0c;特别在计算机视觉&#xff08;CV&#xff09;领域具有革命性的影响。无论是图…