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 相关文章推荐
实现超用户体验 table排序javascript实现代码
Jun 22 Javascript
jquery trim() 功能源代码
Feb 14 Javascript
纯js实现仿QQ邮箱弹出确认框
Apr 29 Javascript
JS对字符串编码的几种方式使用指南
May 14 Javascript
每天一篇javascript学习小结(Function对象)
Nov 16 Javascript
jquery自定义插件——window的实现【示例代码】
May 06 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
js实现手机发送验证码功能
Mar 13 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
JS实现对json对象排序并删除id相同项功能示例
Apr 18 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
Jun 17 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 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
基于mysql的论坛(3)
2006/10/09 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
Linux Apache PHP Oracle 安装配置(具体操作步骤)
2013/06/17 PHP
php实现水仙花数的4个示例分享
2014/04/08 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
python在linux中输出带颜色的文字的方法
2014/06/19 Python
python之wxPython应用实例
2014/09/28 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python 数据结构之堆栈实例代码
2017/01/22 Python
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
一个可以套路别人的python小程序实例代码
2019/04/09 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
python 安装移动复制第三方库操作
2020/07/13 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
城市规划毕业生求职信
2013/10/10 职场文书
实习自我鉴定
2013/12/15 职场文书
学校安全教育制度
2014/01/31 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
党委班子对照检查材料
2014/08/19 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书