当前位置: 首页 > news >正文

【D3.js in Action 3 精译_018】2.4 向选择集添加元素

当前内容所在位置

  • 第一部分 D3.js 基础知识
    • 第一章 D3.js 简介(已完结)
      • 1.1 何为 D3.js?
      • 1.2 D3 生态系统——入门须知
      • 1.3 数据可视化最佳实践(上)
      • 1.3 数据可视化最佳实践(下)
      • 1.4 本章小结
    • 第二章 DOM 的操作方法
      • 2.1 第一个 D3 可视化图表
      • 2.2 环境准备
      • 2.3 用 D3 选中页面元素
      • 2.4 向选择集添加元素 ✔️
      • 2.5 用 D3 设置与修改元素属性
      • 2.6 用 D3 设置与修改元素样式

2.4 向选择集添加元素

选择集虽好,但如果不对其进行任何操作的话也没太多用处。D3 选择集的一个经典用法是先获取一个选择集,进而将另一个元素追加(append)到该选择集内。尽管 JavaScript 已经提供了追加元素的原生接口,但 D3 让这个操作更加简单流畅。

通过 D3 向选择集添加元素的主要方法是 selection.append()append() 方法以新增元素的类型(type)或标签名为参数,并将新元素添加为选择集的最后一个子元素(如图 2.9 所示):

图 2.9 append() 方法
图 2.9 append() 方法

回到之前的虚构 DOM 树示例。如果要给 SVG 容器追加一个矩形元素,则可以先获取 SVG 容器的选择集,然后在该选择集上链式调用 append() 方法,并将目标节点类型(type,即 rect 元素)作为参数传入 append() 方法(如图 2.10 所示)。

d3.select("svg").append("rect");

图 2.10 用 selection.append() 方法将元素添加为选择集的最后一个子元素
图 2.10 用 selection.append() 方法将元素添加为选择集的最后一个子元素

也可以使用 d3.selectAll("div") 来获取包含 DOM 中每个 div 节点的选择集,并将段落元素分别添加到每个节点中,如图 2.11 所示:

d3.selectAll("div").append("p");

图 2.11 与 d3.selectAll() 连用后,append 方法将节点添加到选择集的每个元素中
图 2.11 与 d3.selectAll() 连用后,append 方法将节点添加到选择集的每个元素中

接下来趁热打铁,一起来构建本章前面提到的那个条形图。

首先确认一下,在代码编辑器中打开的仍然是本章源码文件中的 start 文件夹,并且本地 Web 服务器正在运行(关于借助 VS Code 的 Live Server 扩展程序启动 Web 服务器的具体方法,请参考 附录 A)。然后打开 index.html 文件。注意,该文件包含一个类名为 responsive-svg-containerdiv 元素。

正如第一章所述,大多数 D3 可视化项目都是用 SVG 元素构建的,这里的条形图也不例外。为此,需要一个 SVG 容器,并将 SVG 图形放入其中。我们先来添加 SVG 元素。

打开 /js/main.js 文件。使用 d3.select() 方法选中具有 responsive-svg-container 类的 div,并在该 div 中添加一个 SVG 元素,如以下代码所示:

d3.select(".responsive-svg-container").append("svg");

保存 main.js 文件,并在浏览器中查看效果。此时视口中看不到任何变化,但如果打开浏览器检查工具(如图 2.12 所示),则会看到 SVG 元素已经被精确添加到 DOM 树中,正如我们所希望的那样!

图 2.12 向 DOM 树添加 SVG 元素节点效果图
图 2.12 向 DOM 树添加 SVG 元素节点效果图

下一小节,我们将通过设置 viewBox 属性来得到一个响应式的 SVG 容器。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WordPress杂技
  • kotlin get set
  • RabbitMQ发布确认及交换机类型
  • SQL Server分布式查询:跨数据库的无缝数据探索
  • vite+vue3项目初始化搭建
  • 避免6大Python高级陷阱,让你的Python代码更优雅
  • 【React Hooks原理 - forwardRef、useImperativeHandle】
  • 【Apollo学习笔记】—— Cyber RT之创建组件, test ok
  • python Requests库7种主要方法及13个控制参数(实例实验)
  • Linux云计算 |【第一阶段】ENGINEER-DAY5
  • MyBatis-Plus的几种常见用法
  • HTML5大作业三农有机,农产品,农庄,农旅网站源码
  • C语言 | Leetcode C语言题解之第239题滑动窗口最大值
  • 线程安全性问题(一)
  • SQL Server性能监控秘籍:数据库性能计数器阈值设置指南
  • python3.6+scrapy+mysql 爬虫实战
  • @jsonView过滤属性
  • 《剑指offer》分解让复杂问题更简单
  • 4. 路由到控制器 - Laravel从零开始教程
  • co.js - 让异步代码同步化
  • Fabric架构演变之路
  • MySQL数据库运维之数据恢复
  • SSH 免密登录
  • storm drpc实例
  • webpack4 一点通
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 和 || 运算
  • 简单数学运算程序(不定期更新)
  • 开发基于以太坊智能合约的DApp
  • 七牛云假注销小指南
  • 前端面试题总结
  • 如何用vue打造一个移动端音乐播放器
  • 深入浅出webpack学习(1)--核心概念
  • 主流的CSS水平和垂直居中技术大全
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​ssh免密码登录设置及问题总结
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)LINQ之路
  • (转)scrum常见工具列表
  • ****Linux下Mysql的安装和配置
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .net 获取某一天 在当月是 第几周 函数
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @FeignClient注解,fallback和fallbackFactory
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @RequestParam详解