D3.js之折线图动画
2016-11-28 23:13
190 查看
主要实现的效果一个折线图,然后线条可以从头到尾的出现。
折线图的代码基本上是别人的(本人也是正在学习的),自己只是在这上面基础上添加动画和一些文字和circle
参考:参考折线图的博客 参考SVG动画博客
效果图如下:
![](http://img.my.csdn.net/uploads/201612/18/1482062976_6889.gif)
这样的折线动画是不是很有意思,让线慢慢移动着。所用到的知识点也没有太难的。
只是在折线图上使用了两个属性: stroke-dasharray和stroke-dashoffset。
第一个属性设置虚线的间隔长度,让它等于自己本身,就是隐藏本身,在通过第二个属性(线段的偏移量),
通过不断增加和减少这个属性,使得线段慢慢出来。从而有了动画的效果。
然后就是使用CSS3中animate的动画属性来执行上面的过程。
这样的折线动画是不是很有意思,让线慢慢移动着。
折线图的代码基本上是别人的(本人也是正在学习的),自己只是在这上面基础上添加动画和一些文字和circle
参考:参考折线图的博客 参考SVG动画博客
效果图如下:
![](http://img.my.csdn.net/uploads/201612/18/1482062976_6889.gif)
这样的折线动画是不是很有意思,让线慢慢移动着。所用到的知识点也没有太难的。
只是在折线图上使用了两个属性: stroke-dasharray和stroke-dashoffset。
第一个属性设置虚线的间隔长度,让它等于自己本身,就是隐藏本身,在通过第二个属性(线段的偏移量),
通过不断增加和减少这个属性,使得线段慢慢出来。从而有了动画的效果。
然后就是使用CSS3中animate的动画属性来执行上面的过程。
<!DOCTYPE html > <html> <head> <meta charset="utf-8"> <title></title> <style> .axis path, .axis line{ fill:none; stroke:black; shape-rendering:crispEdges; /* //设置线条的样式 */ } .line:nth-child(2){ stroke-dasharray: 397; /* //设置虚线的间隔长度 */ stroke-dashoffset: 397; /* 设置线段偏移长度 */ animation: dash 40s infinite; } /*添加动画的效果,具体想怎么动,可以修改这里面的东西*/ @keyframes dash { 0%{ stroke-dashoffset: 397; } 25%{ stroke-dashoffset: 0; } 50%{ stroke-dashoffset: -397; }75%{ stroke-dashoffset: 0; } 100%{ stroke-dashoffset: 397; } } </style> </head> <body> <script src="../js/d3.js"></script> <script > var width=500; var height=500; var dataset=[ { country:"china", gdp:[[2000,11920],[2001,13170],[2002,14550], [2003,16500],[2004,19440],[2005,22870], [2006,27930],[2007,35040],[2008,45470], [2009,51050],[2010,59490],[2011,73140], [2012,83860],[2013,103550]] }, { country:"japan", gdp:[[2000,47310],[2001,41590],[2002,39800], [2003,43020],[2004,46550],[2005,45710], [2006,43560],[2007,43560],[2008,48490], [2009,50350],[2010,54950],[2011,59050], [2012,59370],[2013,48980]] } ]; var padding={top:70, right:70, bottom: 70, left:70}; var gdpmax=0; //找出两组GDP中的最大值 for(var i=0;i<dataset.length;i++){ var currGdp=d3.max(dataset[i].gdp,function(d){ return d[1]; }); if(currGdp>gdpmax) gdpmax=currGdp; } console.log(gdpmax); //定义x、y轴的比例尺 var xScale=d3.scale.linear() .domain([2000,2013]) .range([0,width-padding.left-padding.right]); var yScale=d3.scale.linear() .domain([0,gdpmax*1.1]) .range([height-padding.bottom-padding.top,0]); var linePath=d3.svg.line()//创建一个直线生成器 .x(function(d){ return xScale(d[0]); }) .y(function(d){ return yScale(d[1]); }) .interpolate("basic")//插值模式,让线段变得更加圆滑 ; //定义两个颜色 var colors=[d3.rgb(0,0,255),d3.rgb(0,255,0)]; var svg=d3.select("body") .append("svg") .attr("width",width) .attr("height",height); svg.selectAll("path") .data(dataset) .enter() .append("path") .attr("transform","translate("+padding.left+","+padding.top+")") .attr("class","line") .attr("fill","none") .attr("stroke-width",3) .attr("stroke",function(d,i){ return colors[i]; }) .attr("d",function(d){ return linePath(d.gdp); }) ; var dataset1 = []; for (var i = 0; i < dataset.length; i++) { for (var j = 0; j < dataset[i].gdp.length; j++) { dataset1.push(dataset[i].gdp[j]); } } svg.selectAll("circle") .data(dataset1) .enter() .append("circle") .attr("transform", "translate(" + padding.left + "," + padding.top + ")") .style('fill',"white") .style("stroke","black") .style("stroke-width","2px") .attr("cx", function(d, i) { return xScale(d[0]); }) .attr("cy", function(d, i) { return yScale(d[1]); }) .attr('r', function() { return 3; }); var xAxis=d3.svg.axis() .scale(xScale) .ticks(5) .tickFormat(d3.format("d")) .orient("bottom"); var yAxis=d3.svg.axis() .scale(yScale) .orient("left"); //添加一个g用于放x轴 svg.append("g") .attr("class","axis") .attr("transform","translate("+padding.left+","+(height-padding.top)+")") .call(xAxis); svg.append("g") .attr("class","axis") .attr("transform","translate("+padding.left+","+padding.top+")") .call(yAxis); svg.append('g').selectAll('text') .data(dataset) .enter() .append('text') .style('fill',function(d,i){ return colors[i]; }) .style('font-size',"1.3em") .attr('x',function(d,i){ return xScale(2013)+10; }) .attr("y",function(d,i){ console.log(d); return yScale(d.gdp[13][1]); }) .attr('dy','.3em') .text(function(d,i){ return d.country; }) .attr('transform',"translate("+padding.left+","+padding.top+")") ; //在不知道折线的具体长度的时候可以动态添加动画属性。 // var path = document.getElementsByClassName('line'); 获取class标签为line的元素 // var length = path[0].getTotalLength(); //获取第一个折线的总共的长度 // d3.select('.line') // .style('stroke-dasharray', length) //根据上面获取的值来设置stroke-dasharray值 // .style('stroke-dashoffset', length); // var rule = "@keyframes dash {0%{stroke-dashoffset:" + length + ";}100%{ stroke-dashoffset: 0;} }"; // var style = document.createElement('style'); // style.type = 'text/css'; // style.innerHTML = rule; // document.getElementsByTagName('head')[0].appendChild(style); // path[0].style.animation = "dash 10s 1"; </script> </body> </html>
这样的折线动画是不是很有意思,让线慢慢移动着。
相关文章推荐
- 才发现的超链接js导致网页中GIF动画停止的解决方法
- 原创:利用JS制作GIF动画图(及图片轮转显示效果)
- js模拟动画之 商品展示效果
- 【转载】 用JS实现google首页动画
- JS 仿Flash动画放大/缩小容器
- 非常基础的JS动画演示
- google的首页动画效果[JS]
- 用纯JS修改了网上的一个用PHP作的画折线图的代码
- JS+CSS实现Google首页的动画效果
- js动画——图片轮播
- JS动画效果代码2
- 谈谈scriptaculous动画效果库effect.js(原理和使用)
- 晚上不睡觉,搞的一个例子《JS实现动画》
- JS动画效果代码2
- 用一段js程序来实现动画功能
- js动画——图片轮播
- JS动画效果代码3
- 出差总结1:利用js制作小人在自己画的多条折线上动态移动
- JS 仿Flash动画放大/缩小容器
- 超链接js导致网页中GIF动画停止的解决方法