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 select操作的日期联动实现代码
Dec 06 Javascript
JS高级笔记
Jul 13 Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 Javascript
基于原生js运动方式关键点的总结(推荐)
Oct 01 Javascript
Vue中v-for的数据分组实例
Mar 07 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
微信小程序实现分享朋友圈的图片功能示例
Jan 18 Javascript
Angular中使用ng-zorro图标库部分图标不能正常显示问题
Apr 22 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
Aug 13 Javascript
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
详解如何使用Node.js实现热重载页面
May 06 Javascript
浅谈Vue的computed计算属性
Mar 21 Vue.js
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
日本因肺炎疫情影响,这几部动漫推延播放!
2020/03/03 日漫
PHP编实现程动态图像的创建代码
2008/09/28 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
php获取CSS文件中图片地址并下载到本地的方法
2014/12/02 PHP
PHP获取访问页面HTTP状态码的实现代码
2016/11/03 PHP
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
2015/10/26 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
详解vue-cli 构建Vue项目遇到的坑
2017/08/30 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
基于js实现抽红包并分配代码实例
2019/09/19 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
Python爬虫包 BeautifulSoup  递归抓取实例详解
2017/01/28 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
基于python OpenCV实现动态人脸检测
2018/05/25 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
Python列表切片常用操作实例解析
2019/12/16 Python
在keras中实现查看其训练loss值
2020/06/16 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
公司新员工的演讲稿注意事项
2014/01/01 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
企业活动策划方案
2014/06/02 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
2014年党委工作总结
2014/11/22 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
文艺演出主持词
2015/07/01 职场文书
学困生转化工作总结
2015/08/13 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python