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的可用于选项卡及幻灯的切换插件
Mar 28 Javascript
JS 进度条效果实现代码整理
May 21 Javascript
js实现倒计时时钟的示例代码
Dec 17 Javascript
node.js中的fs.mkdir方法使用说明
Dec 17 Javascript
举例讲解AngularJS中的模块
Jun 17 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
Bootstrap3.0学习教程之JS折叠插件
May 27 Javascript
浅谈JavaScript的函数及作用域
Dec 30 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
Aug 24 Javascript
package.json配置文件构成详解
Aug 27 Javascript
vue实现数字动态翻牌的效果(开箱即用)
Dec 08 Javascript
JavaScript实现淘宝商品图切换效果
Apr 29 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
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
AngularJS 过滤器(自带和自建)详解
2016/09/19 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
AngularJS读取JSON及XML文件的方法示例
2017/05/25 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
Javascript实现秒表计时游戏
2020/05/27 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
python ip正则式
2009/05/07 Python
python创建和删除目录的方法
2015/04/29 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
python3获取当前文件的上一级目录实例
2018/04/26 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
python动态进度条的实现代码
2019/07/03 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
介绍一下内联、左联、右联
2013/12/31 面试题
后勤人员自我鉴定
2013/10/20 职场文书
毕业生求职信的经典写法
2014/01/31 职场文书
一分钟演讲稿
2014/04/30 职场文书
运动会加油稿20字
2014/11/15 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
教师学习心得体会范文
2016/01/21 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis
Go使用协程交替打印字符
2021/04/29 Golang
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
MySQL 如何设计统计数据表
2021/06/15 MySQL