|
适用于手机端的折线图插件,通过canvas实现。
思路就是得到数据值,时间值,先画出x,y坐标轴,然后均分x轴,将时间点绘制上去,然后根据数据值,再求出x,y坐标点,使用lineTo绘制出连续折线图。注释在代码中。
;(function(window,undefined){
function Charts(defaultParam){
var manyIndoorWd = document.getElementsByClassName('manyIndoor')[0].clientWidth,
can1 = document.getElementById(defaultParam.id);
can1.width = manyIndoorWd,
height = can1.height - 20,
ctx = can1.getContext("2d"),
nums = defaultParam.data,
datas = defaultParam.time,
setDefault = {
styleSet:{
borderColor:'#ff984e',
lineColor:'#ff984e',
pointColor:'#ff7854'
}
}
return new Charts.prototype.init(defaultParam,ctx,nums,datas,can1.width,height);
}
Charts.prototype = {
init: function(defaultParam,ctx,nums,datas,wd,ht){
var wid = wd-24;
var maxPoint = this.maxData(nums) / 0.88;
defaultParam = this.extend(setDefault,defaultParam);
this.drawBorder(defaultParam,ctx,wd,ht)
this.drawLine(defaultParam,ctx,nums,wd,ht,wid,maxPoint)
this.drawPoint(defaultParam,ctx,nums,datas,wd,ht,wid,maxPoint)
return this;
},
drawBorder: function(defaultParam,ctx,wd,ht){
ctx.beginPath();
ctx.translate(0.5, 0.5);
ctx.moveTo(10,10);
ctx.lineTo(10,ht - 1);
ctx.moveTo(10,ht -1);
ctx.lineTo(wd - 10,ht -1);
ctx.closePath();
ctx.strokeStyle = defaultParam.styleSet.borderColor;
ctx.stroke();
},
drawLine: function(defaultParam,ctx,nums,wd,ht,wid,maxPoint){
for (i = 0;i < nums.length-1;i ++){
var axiosY = ht - ht*nums[i]/maxPoint,
averNum= (wid/nums.length-1),
axiosX = i * averNum + 30,
axiosNY = ht - ht*nums[i+1]/maxPoint,
axiosNX = (i+1) * averNum + 30;
ctx.beginPath();
ctx.moveTo(axiosX,axiosY);
ctx.lineTo(axiosNX,axiosNY);
ctx.lineWidth = 2;
ctx.strokeStyle = defaultParam.styleSet.lineColor;
ctx.setLineDash([0]);
ctx.closePath();
ctx.stroke();
ctx.beginPath();
if(i == 0){
ctx.moveTo(axiosX,ht - 2);
ctx.lineTo(axiosX,axiosY);
}
ctx.moveTo(axiosNX,ht - 2);
ctx.lineTo(axiosNX,axiosNY);
ctx.lineWidth = 1;
ctx.setLineDash([2,8]);
ctx.strokeStyle = "#d6d6d6";
ctx.closePath();
ctx.stroke();
}
},
drawPoint:function(defaultParam,ctx,nums,datas,wd,ht,wid,maxPoint){
var len = nums.length;
ctx.lineWidth = 2;
ctx.strokeStyle = '#fff';
for (i = 0;i <= len;i ++){
var numsY = ht - ht*nums[i]/maxPoint,
numsX = i * (wid/nums.length-1) + 30;
ctx.beginPath();
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
ctx.shadowBlur = 4;
ctx.shadowColor = defaultParam.styleSet.pointColor;
ctx.fillStyle = defaultParam.styleSet.pointColor;
ctx.setLineDash([0]);
ctx.arc(numsX , numsY, 5, 0, 2*Math.PI, false);
ctx.stroke();
ctx.fill();
ctx.closePath();
ctx.shadowBlur = 0;
ctx.fillStyle = '#222';
ctx.textAlign = 'center';
ctx.fillText(nums[i],numsX,numsY-10);
if (i < nums.length){
var rowText = ctx.measureText(datas[i]);
ctx.textAlign = 'left';
ctx.fillText(datas[i],numsX-rowText.width/2,ht + 16);
}else if(i == nums.length) {
return;
}
ctx.closePath();
ctx.stroke();
}
},
maxData:function(arr){
return Math.max.apply(null,arr)
},
extend: function(defaults,newObj){
for (var i in newObj) {
defaults[i] = newObj[i];
}
return defaults;
}
}
Charts.prototype.init.prototype = Charts.prototype;
if(!window.Charts){
window.Charts = Charts;
}
})(window,undefined);
var canvas1 = Charts({
id:'can1',
data:[10,30,60,80,90,120,140,60,100],
time:["5-26","5-26","5-26","5-26","5-26","5-26","5-26","5-26","5-26"]
});
var canvas2 = Charts({
id:'can2',
data:[20,60,60,80,100,120,140,60,100],
time:["5-24","5-26","5-26","5-26","5-26","5-26","5-26","5-26","5-26"],
styleSet:{
borderColor:'#a29fff',
lineColor:'#8a93fe',
pointColor:'#747efe'
}
});
<div class=" boxList manyIndoor">
<canvas id="can2" height="180"></canvas>
</div>
|