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 相关文章推荐
javascript之学会吝啬 精简代码
Apr 25 Javascript
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
Dec 05 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
JavaScript实现添加及删除事件的方法小结
Aug 04 Javascript
JS使用cookie设置样式的方法
Jun 30 Javascript
js实现点击图片自动提交action的简单方法
Oct 16 Javascript
jQuery.Validate表单验证插件的使用示例详解
Jan 04 Javascript
vue之数据交互实例代码
Jun 16 Javascript
在Vue中获取组件声明时的name属性方法
Sep 12 Javascript
[jQuery] 事件和动画详解
Mar 05 jQuery
JavaScript枚举选择jquery插件代码实例
Nov 17 jQuery
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
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
jQuery+php实现ajax文件即时上传的详解
2013/06/17 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
Add Formatted Text to a Word Document
2007/06/15 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
js获取Get值的方法
2016/09/29 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
vue使用video插件vue-video-player的示例
2020/10/03 Javascript
详解Python中的文本处理
2015/04/11 Python
python3+PyQt5+Qt Designer实现堆叠窗口部件
2018/04/20 Python
python3.4.3下逐行读入txt文本并去重的方法
2018/04/29 Python
python中使用print输出中文的方法
2018/07/16 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
学习Python列表的基础知识汇总
2020/03/10 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
Html5实现如何在两个div元素之间拖放图像
2013/03/29 HTML / CSS
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
ajax是什么及其工作原理
2012/02/08 面试题
销售行政专员职责
2014/01/03 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
2014年行政执法工作总结
2014/12/11 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
研讨会致辞
2015/07/31 职场文书
入党心得体会
2019/06/20 职场文书