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面向对象编程 for Cookie
Sep 19 Javascript
自己整理的一个javascript日期处理函数
Oct 16 Javascript
始终在屏幕中间显示Div的代码(css+js)
Mar 10 Javascript
JQuery 图片的展开和伸缩实例讲解
Apr 18 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
Jul 28 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
Sep 10 Javascript
Javascript中的迭代、归并方法详解
Jun 14 Javascript
Bootstrap table右键功能实现方法
Feb 20 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
May 21 Javascript
layer.open弹层查看缩略图的原图,自适应大小的实例
Sep 05 Javascript
JavaScript中的this基本问题实例小结
Mar 09 Javascript
three.js 实现露珠滴落动画效果的示例代码
Mar 01 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
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP 简单数组排序实现代码
2009/08/05 PHP
php编程每天必学之表单验证
2016/03/01 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
js实现适用于素材网站的黑色多级菜单导航条效果
2015/08/24 Javascript
JS+CSS实现带小三角指引的滑动门效果
2015/09/22 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
JS实现问卷星自动填问卷脚本并在两秒自动提交功能
2020/06/17 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
移动端图片上传旋转、压缩问题的方法
2018/10/16 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
使用Python求解最大公约数的实现方法
2015/08/20 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
关于Python3 lambda函数的深入浅出
2019/11/27 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
jupyter notebook中新建cell的方法与快捷键操作
2020/04/22 Python
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
办理退休介绍信
2014/01/09 职场文书
企业文化标语大全
2014/06/10 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
鲁迅故里导游词
2015/02/05 职场文书
2016年优秀少先队辅导员事迹材料
2016/02/26 职场文书