html5---svg(图表圆饼篇)

哈哈哈,好久没写博客了,最近比较忙,气死了我。今天又是周末,把前两天放前面的有些东西还没写完,下午把他写了。嘿嘿,废话少说,我们来研究研究svg.本来我以前学的是canvas.当时学canvas.感觉那家伙各种牛逼。但是我还是发现那东西比较复杂。写着繁琐。全部都需要用js控制。于是最近去看一了下svg.其实原动力不在于此。对我等渣渣而言学撒都一样。性能,适用性撒的。撒都不用管。好了,我们先来看这个效果。各位看官请移步。http://data.auto.sina.com.cn/car_comment/395。这里有个这个效果;技术分享

(别说我给新浪汽车打广告啊。嘿嘿。但是别人确实做得好,我很喜欢新浪)好了,这个是带交互的一个图(暂且叫图).我们考虑一下。图片肯定没有这个效果。canvas估计也不会有。除非有几个画布拼接。这样的话,我还不如不要是吧。

我们今天就做这个东西。

基础的知识点。应该没有什么吧。里面有个标签叫path不会的东西自己查一下。上代码。哈哈哈

(function(){    
    function svg(option){
        this.config = this.extend(this.config,option);
        this.create();
        this.handhold();
        this.errtest();
    }

    svg.prototype = {
        constructor:svg,
        /*The basic configuration*/
        config:{
            datatype:"pie",    //The default for the pie chart
            data:[],    //The default data is empty
            color:[],    //The default color is empty
            parentnode:document.createDocumentFragment(),//ocument fragment was inserted into the
            startdeg:0,  //By default, the starting point for the X axis (0 starts)
            r:100,     //The default radius is 100
            centerx:150,    //The default center axis is 150 x
            centery:150,     //The default y center shaft 150 y
            tempdeg : 0,     //deg temp preserve
            target:"",       //The target node
        },
        /*Object extension*/
        extend:function(config,option){
            for(var i in option){
                config[i] = option[i]
            }
            return config;
        },
        create:function(){
          var data = this.config.data, that = this, testnumber=0,check = true;
          var r = this.config.r;
          this.config.centerx = this.config.centery = r;
          /*Parameter detection*/
          for(var i =0 ; i<data.length;i++){
              for(var obj in data[i]){
                  if(typeof data[i][obj]=="number"){
                      testnumber+=data[i][obj]
                  }
                  else{
                      check=false;
                      return;
                  }
              }
          }
          if(!check||testnumber>100){
              return;
          }

          for(var i =0 ; i<data.length;i++){
              that.calculate.call(that,data[i],i)
          }
          document.getElementById(this.config.target).appendChild(this.config.parentnode)
        },
        calculate:function(obj,i){
            var path = document.createElementNS("http://www.w3.org/2000/svg", "path"),deg;
            /*get base paramate and loacl preserve*/
            var startdeg = this.config.startdeg, 
                r = this.config.r, 
                centerx = this.config.centerx, 
                centery = this.config.centery;
            /*get data*/
            for(var nub in obj){
                deg = Number(obj[nub])
            }
            this.config.tempdeg += deg;
            var degend = this.config.tempdeg
            /*The design of path*/
            var startx = r*Math.cos(Math.PI*2*startdeg/100)+centerx;
            var starty = r*Math.sin(Math.PI*2*startdeg/100)+centery;
            var endx = r*Math.cos(Math.PI*2*degend/100)+centerx;
            var endy = r*Math.sin(Math.PI*2*degend/100)+centery;
            path.setAttribute("d","M"+centerx+" "+centery+" L"+startx+" "+starty+" A"+r+" "+r+", 0 0 1 "+endx+" "+endy+" Z ");
            if(!this.config.color[i]){
                this.config.color[i]="#"+parseInt(Math.random()*1000000)
            }
            path.setAttribute(‘fill‘,this.config.color[i]);
            path.style.opacity=0.7;
            this.config.parentnode.appendChild(path);
            this.config.startdeg+=deg;
        },
        handhold:function(){
            var target = document.getElementById(this.config.target)
            target.onmouseover=function(event){
                event = event?event:window.event;
                var target = event.target;
                if(target.nodeName==‘path‘){
                    target.style.opacity=1
                }
            }
            target.onmouseout=function(event){
                event = event?event:window.event;
                var target = event.target;
                if(target.nodeName==‘path‘){
                    target.style.opacity=0.7
                }
            }
        },

        /*test erro function*/
        errtest:function(){
            console.log(this.config)
        },
    }

    function _svg(option){
         new svg(option)
    }
    this._svg = _svg
}).call(this)

调用方法:

_svg({
    data:[{"title":15},{"title":35},{"title":5},{"title":12},{"title":1}],
    target:"pie1",
    color:["#FF6666","#99CC00","#FFFF99","#CCCCCC","#FF9933"],
    r:60   //圆饼半径
    })

html代码:

<svg width=300 height=300 id="pie1">
                
</svg>

别问我注释那些英文是撒,或者读不通,请移步谷歌翻译。我是中文翻译到英文的,你再翻译回来应该就对了.(英语不好的人,大家就将就点吧)。好了。代码上了,结果是个撒。

请大家狠戳这里http://fengchuantao.github.io/svg/web/pie.html;如果你出现的和我不一样。那直接去github拷代码吧。不想写的童鞋也可以直接拷(我经常这么干,哈哈哈);

一会再把怎么做折线图也发了。

以上全部手写个人原创不加防腐剂。哈哈哈,如果您看到这里了,跪求留个言。哪怕批评一下也好。嘿嘿。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。