zoukankan      html  css  js  c++  java
  • H5柱状图2D小插件

    H5柱状图2D小插件

    1 概述

    前端技术在代码的世界里是不可或缺的,而在里面有个东西是经常使用的那便是 js插件,作为一个小白本章节学习如何封装插件,分享下自己的小东西:如何纯js去自己去封装一个柱状图2D小插件?

    2 有点low的效果图如下:

     

    3 主要功能

    支持超简单使用

    支持数据类型json对象

    支持设置左右边距

    支持设置柱状图宽度

    支持柱状图的颜色

    支持动画过渡

    当然也可以自己增加背景图片功能使其看起来好看一点

    。。。后续功能可以自己酌情添加

    4实现方式

      首先 ,我们需要一个容器,在这里只需要一个div就可以了,通过divid就可以识别该容器,代码如下

    <div id="tt"></div>当然css样式需要自己设置

    #tt{
        width: 500px;
        height: 300px;
        border: 1px solid green;
        -webkit-transition: all 1s;
    }

    然后我们约定数据类型,这里我们的数据类接收json对象数组,如下所示模拟四组数据

    var json="[

    {label:'山东',value:50},

    {label:'陕西',value:30},

    {label:'河北',value:25},

    {label:'江苏',value:60}]";

    接着就是为用户提供接口,下面我们约定接口的方法名,以及需要用户传递的数据如下:

    init2DCharts({
        dataUrl:json,//传入json数值对象
        id:"tt",//传入容器的id;
        color:"green",//设置颜色
        title:"各省数据",//设置标题
        margin:"50px",//左右边距
        padding:"30px"//柱状图相邻的间距
    });

    Ok了,到此为止我们的准备工作已经完成了,下面需要开始封装方法了。首先新建一个js文件,这里取名chart.js,创建方法init2DCharts(),并初始化所有数据

    //1***********************初始化所有数据***********************
    //1初始化全局容器
    g_dom=document.getElementById(obj.id);
    g_dom.style.position="relative";
    //2获取标题
    var title=obj.title||"";
    //3获取颜色
    var color=obj.color||"orange";
    //4获取数据
    var dataObj=eval('('+obj.dataUrl+')');
    //5获取左右边距
    var margin=parseFloat(obj.margin||30);
    //6获取柱状图相邻的间距
    var padding=parseFloat(obj.padding||30);

    获取到这些信息数据后,下一步就是根据传递过来的数据拼接柱状图。这里我们的思路是在用户创建的容器里面依次添加一个div容器,让该容器作为我们生成的柱状图,(生成3D的话,我还在研究,这里不再讲述),通过设置该div来实现柱状图效果,如下图所示

     

    下面上代码:


    //2***********************循环数据生成表***********************
    var cstrs="";//用于拼接innerHTML
    //计算每个柱状图的宽度
    var width=

    (g_dom.offsetWidth-margin*2-padding*(dataObj.length-1))

    /dataObj.length;
    //计算每个柱子的高度
    var maxValue=getMax(dataObj);//柱状图最重要的是计算height那么这里我们使用里面数据最大值的占比来就算

    ============链接getMax(obj)============================

    function getMax(obj){
        var max=obj[0].value;
        for(var i=0;i<obj.length;i++){
                if(obj[i].value>max){
                    max=obj[i].value
                }
        }
        return max;
    }

    =====================================
    //用数组来存放所有的高度
    var heightArray=[];
    for(var i=0;i<dataObj.length;i++){
        var tem=dataObj[i];
        //计算每个的x坐标
        var left=margin+i*(width+padding);
        //计算每个的高度
        //1>计算当前在高度值所占据的百分比
        var per=tem.value/maxValue;
        //2>根据百分比计算其实际高度
        var height=per*(g_dom.offsetHeight-50);
        heightArray.push(height);//存放高度

    接下来就需要拼接了:

    //拼接字符串创建div,当然也可以使用创建节点的方法
        cstrs+="<div  style='-webkit-transition:all 1s;position:absolute;left:"+left+"px;bottom:0;background:"+color+"; "+width+"px;height:"+0+"px'>";
        cstrs+="<span style='position:absolute;top: -20px;left:40%;'>"+tem.value+"</span>";
        cstrs+="<lable style='position:absolute;bottom: -20px;left: 40%;'>"+tem.label+"</lable>"
        cstrs+="</div>";
    }

    到目前为止,所有需要的标签都已经就绪了,紧接着就是渲染到html中了:

    g_dom.innerHTML=//渲染的方法

    //下面的代码是为了背景的刻度和线和标题,刻度使用div来创建出来只显示border-bottom由于之前的柱状图都已经定位脱离文档流,所以这些线会在柱状图的后面,形成刻度线的样式。
    g_dom.innerHTML=cstrs+"<div><div style=' border-bottom: 1px solid black;height:"+parseFloat(getComputedStyle(g_dom).height)/4+"px;'></div>" +
        "<div style=' border-bottom: 1px solid black;height:"+parseFloat(getComputedStyle(g_dom).height)/4+"px;'>75%</div>" +
        "<div style=' border-bottom: 1px solid black;height:"+parseFloat(getComputedStyle(g_dom).height)/4+"px;'>50%</div>" +
        "<div style='height:"+parseFloat(getComputedStyle(g_dom).height)/4+"px;'>25%</div></div>" +"<span style='position: absolute;left: 0;top: 0;'>"+title+"</span>";

    当然为了做出点动态生成的效果我们增加了点过渡属性

    cstrs+="<div  style='-webkit-transition:all 1s;

    那么我们需要先使其的height为0px之后在变高,加入一个延时定时器这样刚开始的高度为0px,1ms后变为设置的高度,而其的过渡属性为1s也就是说完成变化所需要的时间为1s加上1ms;

    //遍历设置高度
    setTimeout(function(){
        var divs=g_dom.children;
        for(var i=0;i<divs.length;i++){
            divs[i].style.height=heightArray[i]+"px";
        }
    },1);

    以上就是我们的制作柱状图2D小插件的小心得,希望大家喜欢,先分享到这,大家也可以增加自己喜欢的功能,也可以进一步制作出3D效果。后续还会有更多的分享给大家,敬请期待。

    同时希望与大家的讨论与学习,共同进步!

  • 相关阅读:
    红黑树的修正过程
    配置文件elasticsearch.yml详解
    HEAD插件安装
    css reset.css
    vue-router之router-link
    vue2.0 代码功能片段
    vue2.0的常用功能简介
    electron 的中文文档的地址 以及 窗口改变的步骤
    ph 的使用步骤
    git 提交的步骤
  • 原文地址:https://www.cnblogs.com/wb1608102257/p/7355424.html
Copyright © 2011-2022 走看看