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 相关文章推荐
JavaScript 撑出页面文字换行
Jun 15 Javascript
JavaScript 解析读取XML文档 实例代码
Jul 07 Javascript
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
Jquery颜色选择器ColorPicker实现代码
Nov 14 Javascript
通过javascript获取iframe里的值示例代码
Jun 24 Javascript
JavaScript DOM节点添加示例
Jul 16 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
Mar 21 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
原生JS实现在线问卷调查投票特效
Jan 03 Javascript
vue devtools的安装与使用教程
Aug 08 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
Sep 04 Javascript
vue日历/日程提醒/html5本地缓存功能
Sep 02 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
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
2007/05/03 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
php去除HTML标签实例
2013/11/06 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
jQuery功能函数详解
2015/02/01 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
详解JavaScript树结构
2017/01/09 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
vue-cli webpack 引入swiper的操作方法
2018/09/15 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
Python ljust rjust center输出
2008/09/06 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
Python安装Bs4的多种方法
2020/11/28 Python
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
大学生学年个人总结
2015/02/15 职场文书
简历自荐信范文
2015/03/09 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
2015年度残疾人工作总结
2015/05/14 职场文书