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 相关文章推荐
原生javascript实现简单的datagrid数据表格
Jan 02 Javascript
小议JavaScript中Generator和Iterator的使用
Jul 29 Javascript
基于jquery实现省市联动特效
Dec 17 Javascript
BootStrapTable服务器分页实例解析
Dec 20 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
Mar 24 Javascript
使用Javascript简单计算器
Nov 17 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 Javascript
vue如何获取自定义元素属性参数值的方法
May 14 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
Jun 11 Javascript
jQuery实现鼠标放置名字上显示详细内容气泡提示框效果的方法分析
Apr 04 jQuery
Openlayers实现扩散的动态点(水纹效果)
Aug 17 Javascript
JS数组去重详情
Nov 07 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 中文乱码解决办法总结分析
2009/07/30 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
jQuery实现带分组数据的Table表头排序实例分析
2015/11/24 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
学习 NodeJS 第八天:Socket 通讯实例
2016/12/21 NodeJs
js实现五星评价功能
2017/03/08 Javascript
angularjs2 ng2 密码隐藏显示的实例代码
2017/08/01 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
详解es6新增数组方法简便了哪些操作
2019/05/09 Javascript
vue页面跳转实现页面缓存操作
2020/07/22 Javascript
教你安装python Django(图文)
2013/11/04 Python
Python列表推导式的使用方法
2013/11/21 Python
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
深入解析Python中的上下文管理器
2016/06/28 Python
在Python中字典根据多项规则排序的方法
2019/01/21 Python
Django模板语言 Tags使用详解
2019/09/09 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
Python中random模块常用方法的使用教程
2020/10/04 Python
30岁生日感言
2014/01/25 职场文书
2014年学习全国道德模范事迹思想汇报
2014/09/15 职场文书
群众路线专项整治方案
2014/10/27 职场文书
主持人开幕词
2015/01/29 职场文书
龙门石窟导游词
2015/02/02 职场文书
绿色环保倡议书
2015/04/28 职场文书
详解如何用Python实现感知器算法
2021/06/18 Python