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 相关文章推荐
js 与或运算符 || &amp;&amp; 妙用
Dec 09 Javascript
JQuery对表格进行操作的常用技巧总结
Apr 23 Javascript
JS &amp; JQuery 动态添加 select option
Jun 08 Javascript
AngularJS中的表单简单入门
Jul 28 Javascript
JS两种类型的表单提交方法实例分析
Nov 28 Javascript
任意Json转成无序列表的方法示例
Dec 09 Javascript
Bootstrap Table实现定时刷新数据的方法
Aug 13 Javascript
vue ssr 实现方式(学习笔记)
Jan 18 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
Feb 19 jQuery
JavaScript实现的滚动公告特效【基于jQuery】
Jul 10 jQuery
ES6中定义类和对象的方法示例
Jul 31 Javascript
vue组件传值的实现方式小结【三种方式】
Feb 05 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
用ODBC的分页显示
2006/10/09 PHP
小偷PHP+Html+缓存
2006/12/20 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
Node.js+Express配置入门教程
2016/05/19 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
盘点提高 Python 代码效率的方法
2014/07/03 Python
Python 正则表达式(转义问题)
2014/12/15 Python
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
python实现矩阵打印
2019/03/02 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
JD Sports法国:英国篮球和运动时尚的领导者
2017/09/28 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
办公室主任职责范文
2013/11/08 职场文书
工程管理专业毕业生自荐信
2014/01/24 职场文书
升职演讲稿范文
2014/05/23 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
行风评议整改报告
2014/11/06 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
个人德育工作总结
2015/03/05 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
JUnit5常用注解的使用
2021/07/02 Java/Android