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一统天下之Dojo整合篇
Mar 24 Javascript
基于jQuery图片平滑连续滚动插件
Apr 27 Javascript
jquery select选中的一个小问题
Oct 11 Javascript
Bootstrap树形组件jqTree的简单封装
Jan 25 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
May 17 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
详解js树形控件—zTree使用总结
Dec 28 Javascript
js操作浏览器的参数方法
Jan 21 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
js实现前端图片上传即时预览功能
Aug 02 Javascript
webpack4 从零学习常用配置(小结)
May 28 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 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新手上路(六)
2006/10/09 PHP
ThinkPHP php 框架学习笔记
2009/10/30 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
使用JavaScript判断图片是否加载完成的三种实现方式
2014/05/04 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
2015/12/08 Javascript
Bootstarp风格的toggle效果分享
2016/02/23 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
jQuery实现可拖拽3D万花筒旋转特效
2017/01/03 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
基于Vue的商品主图放大镜方案详解
2019/09/19 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
2017/03/19 Python
python 自定义对象的打印方法
2019/01/12 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python关于变量名的基础知识点
2020/03/03 Python
详解canvas绘制多张图的排列顺序问题
2019/01/21 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
bonprix匈牙利:女士、男士和儿童服装
2019/07/19 全球购物
Mountain Warehouse波兰官方网站:英国户外品牌
2019/08/29 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
股份合作协议书
2014/09/10 职场文书
学位证书委托书
2014/09/30 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
质检员岗位职责范本
2015/04/07 职场文书
python四种出行路线规划的实现
2021/06/23 Python
nginx中封禁ip和允许内网ip访问的实现示例
2022/03/17 Servers
实现GO语言对数组切片去重
2022/04/20 Golang