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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
Chosen 基于jquery的选择框插件使用方法
May 30 Javascript
js函数调用常用方法详解
Dec 03 Javascript
使用JavaScript实现Java的List功能(实例讲解)
Nov 07 Javascript
Javascript中的call()方法介绍
Mar 15 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
Mar 10 Javascript
js实现精确到毫秒的倒计时效果
Aug 05 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
Sep 27 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
iscroll动态加载数据完美解决方法
Jul 18 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
Aug 24 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php简单统计中文个数的方法
2016/09/30 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
解决laravel session失效的问题
2019/10/14 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
2019/10/21 PHP
Javascript 继承机制实例
2009/08/12 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
jQuery简单实现title提示效果示例
2016/08/01 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
python中关于日期时间处理的问答集锦
2013/03/08 Python
python操作日期和时间的方法
2014/03/11 Python
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
python 截取 取出一部分的字符串方法
2017/03/01 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python集成开发环境配置(pycharm)
2020/02/14 Python
如何使用python切换hosts文件
2020/04/29 Python
详细分析Python垃圾回收机制
2020/07/01 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
英国最大的体育&时尚零售公司:JD Sports
2017/12/13 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
小学教师师德感言
2014/02/10 职场文书
车辆转让协议书
2014/04/15 职场文书
销售岗位职责范本
2014/06/12 职场文书
《别在吃苦的年纪选择安逸》读后感3篇
2019/11/30 职场文书
Nginx 502 bad gateway错误解决的九种方案及原因
2022/08/14 Servers