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 相关文章推荐
prototype与jquery下Ajax实现的差别
Sep 13 Javascript
显示js对象所有属性和方法的函数
Oct 16 Javascript
JavaScript入门之事件、cookie、定时等
Oct 21 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
Jun 15 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
探讨AngularJs中ui.route的简单应用
Nov 16 Javascript
vue axios post发送复杂对象问题
Jun 04 Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
Mar 06 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
如何使JavaScript休眠或等待
Apr 27 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
PHP HTML代码串 截取实现代码
2009/06/29 PHP
php程序总是提示验证码输入有误解决方案
2015/01/07 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
javascript编程起步(第四课)
2007/01/10 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
BootStrap select2 动态改变值的方法
2017/02/10 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
js中作用域的实例解析
2017/03/16 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
JavaScript实现更换背景图片
2019/10/18 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python切片工具pillow用法示例
2018/03/30 Python
Servlet如何得到服务器的信息
2015/12/22 面试题
《狮子和兔子》教学反思
2014/03/02 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
生活部的活动方案
2014/08/19 职场文书
教师节倡议书
2014/08/30 职场文书
2014年教育工作总结
2014/11/26 职场文书
python基础之文件处理知识总结
2021/05/23 Python