js对象规划
js代码太多,需要复用,相当于类Class。
如:内容组织类/图文组件类(基本类)/图表组件类
效果
使用
var data = [
['javascript',0.4,'#ff7676'],
['java',0.122,'#ff7676'],
['c',0.22,'#ff7676'],
['c#',0.62,'#ff7676'],
['php',0.32,'#ff7676']
] //数据
var cfg = {sortType:'default'}; // 配置
// 构造函数实例化
var c = new ChartBar($('.cb'),data,cfg);
c.init();
c.updateArr(data).init();// 更新数据
c.updateSortType(type).init;// 更新排序
代码
/**
* 柱状图
* @param parent jQuery dom 父元素(生成的柱状图的父元素)
* @param data 镶套arr格式数据 [['javascript',0.4,'#ff7676'],['java',0.6]] (名称,占比,颜色(可忽略))
* @param cfg 配置数据 参考代码中数据
* @constructor
* @mehod init 实例化对象之后需要init初始化,柱状图展示 (视图层)
* @mehod updateArr 更新展示数据,格式同上 (数据层 需init)
* @mehod updateSortType 调整实例的排序方式 max/min/default(数据层 需init)
* @mehod returnMaxFloat 获得最大占比
*/
var ChartBar = function ( parent , data , cfg) {
parent = ( parent instanceof jQuery)?parent:$('body');
data = ( data instanceof Array)?data:[['数据失效',1,'#ff7676']];
cfg = cfg || {};
this.setting = $.extend({},{
css:{
backgroundColor:'#99c0ff', // 默认百分比背景颜色
},
maxPreWidth:200,
sortType:'default',// default/max/min
},cfg)
this.parent = parent;
this.cfg = cfg; // 传入的配置文件
this.id = ('sz_chart_bar_' +Date.now()); // 实例化柱状图的id
console.log(this.setting);
this.updateArr(data);
var $component = $('<ul id="'+this.id+'" class="sz_chart_bar">');
$component.appendTo(this.parent);
$component.on(this.id+'_load',function () {
setTimeout(function () {
$component.find('.bg').css('width','100%');
$component.find('.sz_chart_bar_per').css('opacity','1')
},10)
})
}
ChartBar.prototype = {
// ui结构构造 视图层 绘制图层
init : function () {
var $component = $('#'+this.id).empty();
var setting = this.setting;
var max = this.returnMaxFloat();
max = (max == 0) ? 1 : max;
$.each(this.sortArr,function(idx,item){
var line = $('<li class="sz_chart_bar_item">');
var name = $('<em class="sz_chart_bar_title">');
var rate = $('<div class="sz_chart_bar_percent">');
var per = $('<em class="sz_chart_bar_per">');
var bgStyle = 'style="background-color:'+ ( item[2] || setting.css.backgroundColor) +'"';
rate.html( '<div class="bg" '+bgStyle+'></div>' );
rate.css('width', item[1]/max * setting.maxPreWidth + 'px' );
name.text( item[0]);
per.text( (new Number(item[1]*100)).toFixed(2) + '%');
line.append( name ).append( rate ).append( per );
$component.append(line);
});
$component.trigger(this.id+'_load');
return this;
},
// 数据层 更新数据
updateArr :function( data ){
data = ( data instanceof Array)?data:[['数据失效',1,'#ff7676']];
this.arr = data;
this.sortArr = data;
this.updateSortType();
return this;
},
// 数据层 数据排序
updateSortType:function ( sortType ) {
var type ;
if(sortType){
this.setting.sortType = sortType;
}
type = this.setting.sortType;
if(type == 'default'){
this.sortArr = this.arr;
}else{
var oldArr = this.arr.concat();
this.sortArr = oldArr.sort(function (a,b) {
if( type != 'max' ){
return a[1] - b[1];
}
return b[1] - a[1];
})
}
return this;
},
// 返回最大值
returnMaxFloat :function(){
var max = 0;
this.sortArr.forEach(function (item) {
if(item[1]>max){
max = item[1]
}
})
return max;
}
}
.sz_chart_bar{
margin: 0 auto;
}
.sz_chart_bar_item{
display: block;
vertical-align: middle;
}
.sz_chart_bar_title,.sz_chart_bar_percent,.sz_chart_bar_per{
display: inline-block;
position: relative;
font-size: 12px;
line-height: 32px;
height: 32px;
vertical-align: middle;
}
.sz_chart_bar_title{
width: 80px;
text-align: right;
padding: 0 10px;
}
.sz_chart_bar_percent{
width: 0;
height: 15px;
}
.sz_chart_bar_percent .bg{
width: 0;
height: 15px;
border-radius: 4px;
transition: width 3s;
}
.sz_chart_bar_per{
padding: 0 7px;
opacity: 0;
transition: opacity 0.5s 1.6s;
}