D3.js实现文本的换行详解


Posted in Javascript onOctober 14, 2016

一、文字换行是什么问题?

现有一字符串:

var str = "云中谁寄锦书来,雁字回时,月满西楼";

李清照的一剪梅,读过吗?

body 里添加一个 svg 元素,大小如下:

var width = 300; 
var height = 300; 
   
var svg = d3.select("body") 
  .append("svg") 
  .attr("width",width) 
  .attr("height",height);

然后添加文字,用 text 元素,这样的代码我们很熟悉了:

var text = svg.append("text") 
  .attr("x",30) 
  .attr("y",100) 
  .attr("font-size",30) 
  .attr("font-family","simsun") 
  .text(str);

结果如下:

D3.js实现文本的换行详解

可以看到,虽然 text 元素标签的内容有整个字符串,但是由于 svg 的宽度只有 300,显示不了这么长的字符串,因此多余的部分看不到。

怎么办?自然是要换行。

二、在 text 中添加 tspan 子元素

SVG 中的文本不支持自动换行,需要手动实现。其中一种方法就是使用 tspan 标签。

tspan 是写在 text 中的,作为其子元素存在。设置文本属性的时候,有一个 dy 属性,表示 y 轴的相对位移,dy 的值通常用 10px、1em 这样的值,其中 em 是以行为单位的。

这样,我们就可以在 text 中添加多个 tspan ,每个代表一行。每一个 tspan 属性都赋予一个 1em 值(即一行)。如此,文本就会一行一行地显示了。

svg代码为:

<text x="30" y="100" font-size="30" font-family="simsun"> 
<tspan x="30" dy="1em">夜来幽梦忽还乡</tspan> 
<tspan x="30" dy="1em">小轩窗</tspan> 
<tspan x="30" dy="1em">正梳妆</tspan> 
</text>

要注意,tspan 中的 x 属性是必要的,表示下一行也从 x = 30 处开始显示。

三、D3 的代码怎么写

对于第一节的字符串,先在 svg 中添加一个 text 元素,但是不设定其内容。

var str = "云中谁寄锦书来,雁字回时,月满西楼";   
  
var text = svg.append("text") 
    .attr("x",30) 
    .attr("y",100) 
    .attr("font-size",30) 
    .attr("font-family","simsun");

使用 JavaScript 字符串的 split str 分段:

var strs = str.split(",") ;

用逗号作为分隔符,分为几段。输出结果为一个数组,数组中的各项是各子字符串。则 strs 的值为:

["云中谁寄锦书来", "雁字回时", "月满西楼"]

好,接下来是重点,在 text 元素上绑定数据,并添加与 strs 长度相同的 tspan 元素。然后,为其 xdy 属性赋值,再指定字符串内容即可。

代码如下:

text.selectAll("tspan") 
  .data(strs) 
  .enter() 
  .append("tspan") 
  .attr("x",text.attr("x")) 
  .attr("dy","1em") 
  .text(function(d){ 
   return d; 
  });

结果如下:

D3.js实现文本的换行详解

到这我们就基本完成了,下面给大家奉上完整的示例代码,有需要的可以参考。

完整实例代码如下

<html>
 <head>
  <meta charset="utf-8"> 
  <title>文字换行</title> 
 </head> 
 <body> 
 <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> 
  <script>  
 
 var width = 300;
 var height = 300;
 
 var svg = d3.select("body")
  .append("svg")
  .attr("width",width)
  .attr("height",height);

 var str = "云中谁寄锦书来,雁字回时,月满西楼"; 
 
 var text = svg.append("text")
  .attr("x",30)
  .attr("y",100)
  .attr("font-size",30)
  .attr("font-family","simsun");
  
 var strs = str.split(",") ;
 
 console.log(strs);
  
 text.selectAll("tspan")
 .data(strs)
 .enter()
 .append("tspan")
 .attr("x",text.attr("x"))
 .attr("dy","1em")
 .text(function(d){
  return d;
 });
 
  
  </script> 
 
 </body> 
</html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用D3.js能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
科讯商业版中用到的ajax空间与分页函数
Sep 02 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
Nov 20 Javascript
JS实现往下不断流动网页背景的方法
Feb 27 Javascript
jQuery实现网页抖动的菜单抖动效果
Aug 07 Javascript
js仿苹果iwatch外观的计时器代码分享
Aug 26 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
简单谈谈Vue 模板各类数据绑定
Sep 25 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
Oct 21 Javascript
Bootstrap常用组件学习(整理)
Mar 24 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
Oct 25 Javascript
深入理解Vue Computed计算属性原理
May 29 Javascript
Bootstrap企业网站实战项目4
Oct 14 #Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 #Javascript
纯JS打造网页中checkbox和radio的美化效果
Oct 13 #Javascript
angularjs 中$apply,$digest,$watch详解
Oct 13 #Javascript
jQuery鼠标事件总结
Oct 13 #Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
Oct 13 #Javascript
jQuery中delegate()方法的用法详解
Oct 13 #Javascript
You might like
桌面中心(一)创建数据库
2006/10/09 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP 访问数据库配置通用方法(json)
2018/05/20 PHP
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
NodeJs 文件系统操作模块fs使用方法详解
2018/11/26 NodeJs
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
Python实现多线程抓取妹子图
2015/08/08 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python实现常见的回文字符串算法
2018/11/14 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python实现代码块儿折叠
2020/04/15 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
2020/05/18 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
Ajax的工作原理
2015/12/04 面试题
运动会邀请函范文
2014/01/31 职场文书
个人公开承诺书
2014/03/28 职场文书
应届生求职信
2014/05/31 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
React实现动效弹窗组件
2021/06/21 Javascript
Elasticsearch 聚合查询和排序
2022/04/19 Python