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 相关文章推荐
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
浅谈Jquery为元素绑定事件
Apr 27 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
Dec 08 Javascript
web打印小结
Jan 11 Javascript
一次围绕setTimeout的前端面试经验分享
Jun 15 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
AngularJS $http post 传递参数数据的方法
Oct 09 Javascript
Vue中实现权限控制的方法示例
Jun 07 Javascript
js实现开关灯效果
Mar 30 Javascript
vue+高德地图实现地图搜索及点击定位操作
Sep 09 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
php array_merge下进行数组合并的代码
2008/07/22 PHP
php 时间计算问题小结
2009/01/04 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
广告显示判断
2006/08/31 Javascript
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
JS hashMap实例详解
2016/05/26 Javascript
微信浏览器禁止页面下拉查看网址实例详解
2017/06/28 Javascript
Angular 2父子组件之间共享服务通信的实现
2017/07/04 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
个人小程序接入支付解决方案
2019/05/23 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
Vite和Vue CLI的优劣
2021/01/30 Vue.js
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
浅谈python对象数据的读写权限
2016/09/12 Python
Python爬豆瓣电影实例
2018/02/23 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
基于Python解密仿射密码
2019/10/21 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
Pycharm Git 设置方法
2020/09/15 Python
一款利用纯css3实现的超炫3D表单的实例教程
2014/12/01 HTML / CSS
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
金牌葡萄酒俱乐部:Gold Medal Wine Club
2017/11/02 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
服装发布会策划方案
2014/05/22 职场文书
2014优秀党员事迹材料
2014/08/14 职场文书
无房证明范本
2014/09/17 职场文书
python Tkinter模块使用方法详解
2022/04/07 Python