D3.js 动画 过渡效果 (V3版本)

一 、 过渡的启动

启动过渡效果,与以下四个方法相关:

d3.transition([selection],[name])

//创建一个过渡对象。但是由于每个选择集中都有transition()方法,可用d3.select("rect").transition()的方式来创建过渡,因此一般不直接用d3.transition()。

transition.delay([delay])

//设定延迟的时间。过渡会经过一定时间后才开始发生。单位是毫秒。

transition.duration([duration])

//设定过渡的持续时间(不包括延迟时间),单位是毫秒。如:duration(2000),是持续2000ms。

transition.ease(vlaue[,arguments])

//设定过渡样式,例如线性过渡、在目标处弹跳几次等方式。

接下来制作一个过渡效果:

 1      var width = 600;
 2         var height = 400;
 3
 4         var svg = d3.select("#body")
 5                     .append("svg")
 6                     .attr("width",width)
 7                     .attr("height",height)
 8
 9         svg.append("rect")
10             .attr("fill","yellow")
11             .attr("x",100)
12             .attr("y",100)
13             .attr("width",100)
14             .attr("height",30)
15             .transition()
16             .attr("width",300)

上述代码只使用了transition()。默认情况下,延迟(delay)为0ms,持续时长(duration)为250ms。请注意过渡前后的状态:

过渡前,矩形的宽度(width)为100。

过渡后,矩形的宽度为300。

过渡的前后状态必须是不同的,才能看到变化。不同状态。可以是形状、颜色、位置、透明度等。展示的是矩形在0ms时刻的宽度渐变到250ms时刻的宽度。

如果没有调用transition()append()返回该元素的选择集对象。如果调用了transition(),返回的就不是选择集对象,而是一个过渡对象。选择集对象和过渡对象是完全不同的概念,其成员变量和方法有所不同。关于区别,请看代码:

 1   var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7
 8         //打印rect
 9         console.log(rect)       //rect是选择集
10
11         //启动过渡效果
12         var rectTran = rect.transition()
13
14         //打印rectTran
15         console.log(rectTran)   //rectTran是一个过渡对象

rect是一个选择集对象rectTran是一个过渡对象。控制台输出结果如图:可以看到,它们是不同的两种对象。

如下图所示:左图为选择集对象的方法列表。可以找到data()sort()append()等之前介绍过得方法。右图是过渡对象的方法列表,没有data()datum()等方法。因此,过渡对象是不能绑定数据的。

调用transition(),得到过渡对象。之后,一般会跟着delay()、duration()、ease(),用于设置延迟、过渡时间、过渡样式。举个例子:

 1      var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7         var rectTran = rect.transition()
 8                         .delay(500)         //延迟500ms再开始
 9                         .duration(1000)     //过渡时长为1000ms
10                         .ease("blunce")     //过渡样式
11                         .attr("width",300)  //目标属性

这段代码的过渡效果总时长为1500ms(延迟500ms+过渡时长1000ms),在目标属性处会弹跳几次,这是由于过渡样式被设置为blunce

另外,transition()可多次调用。每一次都会产生一个新的过渡,可以连续使用。请看代码:

 1     var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7
 8
 9         var rectTran = rect.transition()        //开始一个过渡
10                         .attr("width",300)      //目标宽度为300
11                         .transition()           //开始一个过渡
12                         .attr("height",300)     //目标高度为300
13                         .transition()           //开始一个过渡
14                         .attr("width",100)      //目标宽度为100
15                         .transition()           //开始一个过渡
16                         .attr("height",100)     //目标高度为100

这段代码中,第一个过渡是将矩形的宽度转变到300,第二个是将高度转变成300,第三个是将宽度转变到100,第四个是将高度转变到100.由于没有设定延迟和过渡时间,都使用默认值。

二 、 过渡的属性

过渡的属性,是指元素的状态。由于过渡的前后状态不同,因此需要指定过渡前后元素的不同属性。

transition.attr(name,value)

//将属性name过渡到目标值value。value可以是一个函数。

transition.attrTeeen(name,tween)

//将属性name使用插值函数tween()进行过渡。

transition.style(name,value[,priority])

//将css样式的name属性过渡到目标值value。priority是可选参数,表示css样式的优先级,只有null和important两个值。

transition.styleTween(name,tween[,priority])

//将css样式的属性name使用函数tween进行过渡。与attrTween()类似。

transition.text(value)

//过渡开始时,将文本设置为value值

transition.tween(name,factory)

//将属性name按照函数factory进行过渡。attrTween()和StyleTween()都是用此函数实现的。

transition.remove()

//过渡结束后,删除被选择的元素。

transition.attr(name,value) transition.attrTeeen(name,tween)操作的是x、y、width、height这样的属性。

transition.attr(name,value) 的使用很好理解,例如:

1 .attr("width",100)
2 .transition()
3 .attr("width",300)

初始宽度为100,目标宽度为300,过渡会在250ms(默认时间)内将宽度属性从100变为300,属性变化的中间值是由默认的插值函数计算的。

如果要手动设置插值函数,要使用transition.attrTeeen(name,tween),举个例子:

 1     var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7
 8         var rectTran = rect.transition()
 9                         .duration(2000)
10                         .attrTween("width",function(d,i,a){
11                             return function(t){
12                                 return Number(a) + t * 300
13                             }
14                         })

attrTween()的第一个参数是属性名,第二个参数是一个无名函数function(d,i,a)d是被绑定数据,i是索引号,a是属性width的初始值。该函数返回的function(t),就是插值函数。其参数t的范围是[0,1]0表示变化的起始,1表示变化的结束。此处,初始值a等于100,当t等于0时,function(t)返回100。当t等于1时,function(t)返回400.此时,该过渡属性将width属性从100过渡到400,所用时间为2000ms(2s)。

transition.style(name,value[,priority]) transition.styleTween(name,tween[,priority])操作的是style里的样式。举个例子:

1    svg.append("rect")
2             .attr("fill","yellow")
3             .attr("x",100)
4             .attr("y",100)
5             .attr("width",100)
6             .attr("height",30)
7             .transition()
8             .duration(2000)
9             .attr("fill",‘red‘)

这段代码会将style里的fill的值从yellow变成red,过度时间为默认的2000ms。

对文字进行过渡要用到tween()。前面在介绍attrTween()的时候对矩形的宽度实现了过渡,先添加如下要求:

矩形上添加文字,用来标识矩形的宽度。同时,矩形的宽度在变化的时候,文字也要跟着变化。代码:

 1   svg.append("rect")
 2             .attr("fill","yellow")
 3             .attr("x",100)
 4             .attr("y",100)
 5             .attr("width",100)
 6             .attr("height",30)
 7             .transition()
 8             .duration(2000)
 9             .attr("width",300)
10
11         var text = svg.append("text")
12                     .attr("fill","white")
13                     .attr("x",150)
14                     .attr("y",100)
15                     .attr("dy","1.2em")
16                     .attr("text-anchor","end")
17                     .text(100)
18
19
20         var initx = text.attr("x")
21         var initText = text.text()
22
23         var textTran = text.transition()
24                         .duration(2000)
25                         .tween("text",function(){
26                             return function(t){
27                                 d3.select(this)
28                                     .attr("x",Number(initx) + t * 250 )
29                                     .text(Math.floor(Number(initText) + t * 300 ))
30                             }
31                         })

  

tween()的第二个参数返回的是function(t),t的范围也是[0,1] :

1         //当t为0时,函数体力的操作是:
2         d3.select(this)
3             .attr("x",150 + 0 * 250)
4             .text(Math.floor(100 + 0 * 300))
5
6         //当t为1时,函数体里的操作是:
7         d3.select(this)
8             .attr("x",150 + 1 * 250 )
9             .text(Math.floor(100 + 1 * 300))    

过渡的效果图为:随着时间的推移,文字的内容和文字的位置都是变化的。

transition.remove() 当元素淡出的时候需要用到。举个例子:

 1   var rect = svg.append("rect")
 2                     .attr("fill","yellow")
 3                     .attr("x",100)
 4                     .attr("y",100)
 5                     .attr("width",100)
 6                     .attr("height",30)
 7
 8         rect.transition()
 9             .attr("width",0)
10             .remove()

当矩形过渡的目标完成,即width变为0的时候。就删除该元素。此外,还可以据此做成元素颜色慢慢变淡,最后删除。

原文地址:https://www.cnblogs.com/littleSpill/p/10896253.html

时间: 2024-10-09 09:57:53

D3.js 动画 过渡效果 (V3版本)的相关文章

D3.js 线段生成器 (V3版本)

线段生成器 与线段生成器相关的方法: d3.svg.line() //创建一个线段生成器. line(data) //使用线段生成器绘制data数据. line.x([x]) //设置或获取线段x坐标的访问器,即使用什么数据作为线段的x坐标. line.y([y]) //同上.设置或获取y坐标的访问器. line.interpolate([interpolate]) //设置或获取线段的插值模式,共有13种. line.tension([tension]) //设置或获取张力系数,当插值模式为c

D3.js 弧生成器 (V3版本)

弧生成器(Arc Generator) 弧生成器(Arc Generator)可凭借起始角度.终止角度.内半径.外半径等,生成弧线的路径,因此在制作饼状图.弦图等图表时很常用. 有四个访问器需要谨记:内半径访问器innerRadius().外半径访问器outerRadius().起始角度访问器startAngle().终止角度访问器endAngle().各参数的意义如图: startAngle和endAngle的单位是弧度,即:0°要用0,180°要用3.1415926(π).0°的位置在"时钟

D3.js的v5版本入门教程(第十章)

在这一章我们干点有趣的事——让我们上一章绘制的图表动起来,这样岂不是很有意思 为了让图表动起来,我们还是需要以下新的知识点 .attr(xxx) .transition() .attr(xxx),transition()表示添加过渡,也就是从前一个属性过渡到后一个属性.duration(2000),表示过渡时间持续2秒.delay(500),表示延迟0.4秒后再进行过渡.ease(d3.easeElasticInOut)表示过渡方式,注意这里和v3版本的区别    有了上面的基础知识后,现在我们

D3.js的v5版本入门教程(第十二章)—— D3.js中各种精美的图形

D3.js的v5版本入门教程(第十二章) D3中提供了各种制作常见图形的函数,在d3的v3版本中叫布局,通过d3.layout.xxx,来新建,但是到了v5,新建一个d3中基本的图形的方式变了(我也并不知道是不是还叫布局,我觉得也可以这么叫,反正布局指的也是一个绘图函数) 下面是d3中一些常见的部分图形 bubble —— 泡泡图 packing —— 打包图 bundling —— 捆图 force —— 力导向图 chord —— 弦图 pie——饼状图 tree——树状图 中国地图 我们利

D3.js使用过程中的常见问题(D3版本D3V4)

目录 一.学习D3我必须要学习好SVG矢量图码? 二.如何理解D3给Dom节点绑定数据时的Update.Enter和Exit模式 三.D3绑定数据时用datum与data有什么不一样? 四.SVG图中用attr来设置属性和用style来设置样式时,用style来设置样式的权重会更高 五.D3使用链式写法时,写完transition动画后不能链着继续写append添加元素操作 六.如何给path设置缓动? 七.D3普通的缓动动画 八.给节点添加title,鼠标mouseover显示普通提示文本效果

D3.js的v5版本入门教程(第七章)—— 比例尺的使用

D3.js的v5版本入门教程(第七章) 比例尺在D3.js中是一个很重要的东西,我们可以这样理解d3.js中的比例尺——一种映射关系,从domain映射到range域(为什么会是domain和range呢?等一下你就会看到,因为我们在建立比例尺是常常会用到domain()和range()两个函数,当然不是绝对的,D3中有很多类型的比例尺) 下面介绍在本套教程中常用的两种比例尺 线性比例尺序数比例尺        线性比例尺 domain域和range域都可以连续变化 <body> <sc

D3.js的v5版本入门教程(第十三章)—— 饼状图

D3.js的v5版本入门教程(第十三章) 这一章我们来绘制一个简单的饼状图,我们只绘制构成饼状图基本的元素——扇形.文字,从这一章开始,内容可能有点难理解,因为每一章都会引入比较多的难理解知识点,在这里作者本人也只是粗略的讲解每个新知识点的意思!如果不是很理解的话,需要读者自行查看官网API 为了绘制一个饼状图,我们还是需要以下新的知识点 d3.arc( {} ),弧形生成器,用以绘制弧形,需要传入一些用以绘制弧形基本的数据的对象,例如,该对象的属性可以包括(我用官网api的示例) d3.pie

D3.js的v5版本入门教程(第九章)——完整的柱状图

D3.js的v5版本入门教程(第九章) 一个完整的柱状图应该包括的元素有——矩形.文字.坐标轴,现在,我们就来一一绘制它们,这章是前面几章的综合,这一章只有少量新的知识点,它们是 d3.scaleBand():这也是一个坐标轴,可以根据输入的domain的长度,等分rangeRound域(类比range域)d3.range():这个比较复杂,建议去看百度(或者官方API),在这里我只讲一下这个返回一个等差数列    1.得到SVG画布 var marge = {top:60,bottom:60,

D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素

D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有三个<p>,如下 <p>dog</p> <p>cat</p> <p>pig</p> <p>rat</p> 选择第一个元素<p> var p = d3.select("body&qu