D3.js封装文本实现自动换行和旋转平移等功能


Posted in Javascript onOctober 14, 2016

我们下面话不多说,本文主要介绍的是利用D3.js封装文本实现自动换行功能的步骤,下面来一起看看吧。

一、引用 multext.js 文件

multext.js

function appendMultiText(container, str, posX, posY, width, fontsize, fontfamily){
			
			if( arguments.length < 6){
				fontsize = 14;
			}		
			
			if( arguments.length < 7){
				fontfamily = "simsun, arial";
			}
			
			//获取分割后的字符串
			var strs = splitByLine(str,width,fontsize);
			
			var mulText = container.append("text")
				.attr("x",posX)
				.attr("y",posY)
				.style("font-size",fontsize)
				.style("font-family",fontfamily);
				
			mulText.selectAll("tspan")
				.data(strs)
				.enter()
				.append("tspan")
				.attr("x",mulText.attr("x"))
				.attr("dy","1em")
				.text(function(d){
					return d;
				});
				
			return mulText;
			
			function splitByLine(str,max,fontsize){
				var curLen = 0;
				var result = [];
				var start = 0, end = 0;
				for(var i=0;i<str.length;i++){
					var code = str.charCodeAt(i);
					var pixelLen = code > 255 ? fontsize : fontsize/2;
					curLen += pixelLen;
					if(curLen > max){
						end = i;
						result.push(str.substring(start,end));
						start = i;
						curLen = pixelLen;
					}
					if( i === str.length - 1 ){
						end = i;
						result.push(str.substring(start,end+1));
					}
				}
				return result;
			}
}

可以另存为后,在 <script> 标签里引用:

<script src="multext.js" charset="utf-8"></script>

当然,要使用此文件,同时要引用 d3 的库:

<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>

二、函数的参数

文件里只实现了一个函数 appendMultiText() ,其各参数的意义为:

appendMultiText( 
  container,     //文本的容器,可以是<svg>或<g>  
  str,        //字符串 
  posX,        //文本的x坐标 
  posY,        //文本的y坐标 
  width,       //每一行的宽度,单位为像素 
  fontsize,      //文字的大小(可省略),默认为 14 
  fontfamily     //文字的字体(可省略),默认为 simsun, arial 
)

三、添加多行文本

下面添加多行文本试试。首先要添加<svg>元素:

var width = 300; 
var height = 300; 
 
var svg = d3.select("body") 
      .append("svg") 
      .attr("width",width) 
      .attr("height",height);

添加的<svg>元素,保存在变量 svg 中,这个变量要作为 appendMultiText 的参数使用。

接下来添加多行文本:

var str = "青青子衿,悠悠我心,但为君故,沉吟至今。";       
             
appendMultiText(svg,str,30,100,120,20,"simsun");

代码的意思为:在 svg 容器里的坐标(30, 100)处添加指定字符串,每一行的长度为120个像素,超出的部分自动换行,字体大小为20,字体为宋体。

结果如下:

D3.js封装文本实现自动换行和旋转平移等功能

可以看到,添加了四行文字,每行的长度为120个像素。appendMultiText自动为我们添加了<text ><tspan>
appendMultiText()的返回值是被添加的<text>元素的选择集,可以用一个变量保存此值,再做旋转平移之类的操作,当然也可更改字体等,例如:

var str = "青青子衿,悠悠我心,但为君故,沉吟至今。";       
             
var multext = appendMultiText(svg,str,30,100,120,20,"simsun"); 
         
multext.attr("transform","rotate(-20)");

文本逆时针旋转20度。

D3.js封装文本实现自动换行和旋转平移等功能

你还可以将文本放到<g>元素里。

var g = svg.append("g"); 
             
var multext = appendMultiText(g,str,30,100,120);

如此,多行文本的所有元素会置于<g>之下。上面这段代码的 appendMultiText() 省略了最后两个参数,如果省略,默认字体大小为 14px ,字体为 simsun, arial。

总结

以上就是利用D3.js封装文本实现自动换行功能的全部内容,希望这篇文章的内容对大家学习或者使用D3.js能有所帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
JQuery Tips(4) 一些关于提高JQuery性能的Tips
Dec 19 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
jQuery图片滚动图片的效果(另类实现)
Jun 02 Javascript
jQuery控制frames及frame页面JS的方法
Mar 08 Javascript
js canvas仿支付宝芝麻信用分仪表盘
Nov 16 Javascript
整理关于Bootstrap列表组的慕课笔记
Mar 29 Javascript
如何使用bootstrap框架 bootstrap入门必看!
Apr 13 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
解决LayUI表单获取不到data的问题
Aug 20 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
Sep 03 Javascript
读懂CommonJS的模块加载
Apr 19 Javascript
D3.js实现文本的换行详解
Oct 14 #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
You might like
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
不使用 JS 匿名函数理由
2017/11/17 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
ios设备中angularjs无法改变页面title的解决方法
2018/09/13 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
Python continue语句实例用法
2020/02/06 Python
Python读取yaml文件的详细教程
2020/07/21 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
英国计算机商店:Technextday
2019/12/28 全球购物
个人承诺书
2014/03/26 职场文书
授权委托书范文
2014/07/31 职场文书
年度考核表个人总结
2015/03/06 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
2016国培研修心得体会
2016/01/08 职场文书
2019年教师入党申请书
2019/06/27 职场文书
Mysql binlog日志文件过大的解决
2021/10/05 MySQL