因为近期,项目用到了JS画图,从网上搜了下,有用DIV一个一个联接成的直线图,那个当行数超过五百以上的时候,就会出现效率问题。
后又找到了适合IE 的 VML 不适合FIREFOX的。。但是互联网是强大的。。从高人处知道了一个 excanvas。google开源的,可以在IE中模拟出来。。也就是说一些基本的都可以模拟出来。。OK。这就是要我要的了。。
首先,当然需要下载环境了。。
现在我们再来画个简单的HTML页面,里面有一张表格,表格里面大概有几行数据。。这数据就是我们要画直线的了。。
样式:
body {
margin:0px;padding:0px;
}
body,td,th{
font-size:12px;
}
div{
width:960px;
}
table{
color:#464646;
font-family:Arial;
}
tr{
background:#dddffd;
}
td{
width:18px;height:18px;height:18px;text-align:center;
}
.gray{
}
.blue{
background:blue
}
.red{
background:red
}
.gray_a{
background:gray;
}
.tdback{
background:#DBDBDB none repeat scroll 0 0;
height:3px;
}
HTML页面
<div>
<table>
<tbody>
<tr><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td></tr>
<tr><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td></tr>
<tr><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td></tr>
<tr><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td><td class="gray">2</td></tr>
<tr class="tdback"><td colspan="17"></td></tr>
<tr><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td><td class="gray">2</td></tr>
<tr><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td></tr>
<tr><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td></tr>
<tr><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td><td class="gray">2</td></tr>
<tr><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td><td class="gray">2</td></tr>
<tr class="tdback"><td colspan="17"></td></tr>
<tr><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">1</td><td class="blue">1</td><td class="gray">1</td><td class="gray">1</td><td class="gray">2</td><td class="gray">2</td><td class="gray" >2</td><td>2</td><td class="gray">2</td><td class="gray">2</td><td class="red">2</td><td class="gray">2</td></tr>
</tbody>
</table>
</div>
js 代码:
<script>
<!--
/**
画布初始化。
以表格行总数-1 即为需要生成的画布。
id 表格需要呈现的id 或class
*/
function paintDiv(id){
var ary = $(id).get();
var size = $(ary).size();
var pre= null;//上一个坐标点
if(size > 1) pre = $(ary).get(0);
var str ="";//定义画布字符串
var w = 20;//定义宽度20px
var h = 20;//定义高度20px
var curId = id;
curId = id.replace(/\./g,'');
for(var i=1;i<size;i++){
var next = $(ary).get(i);
//得到上一X,Y坐标点。
var x0 = parseInt(pre.offsetLeft);//宽
var y0 = parseInt(pre.offsetTop);//高
var x1 = parseInt(next.offsetLeft);//宽
var y1 = parseInt(next.offsetTop);//高
//画布左上角坐标。。如果点在起点在左,那么第一个坐标的X点《第二点的X点。反之,在右,第二个坐标的X点》第一个坐标X点。
//如果是同一列,那么二者X坐标点应该是相同的。。
var w0 =0;//宽
var h0 = 0;//高
var width = 0;
var height = h;
var left = -1;
if((x0 - x1)>0) left = -1;//第二个坐标点位于左,第一个坐标位于右。
else if((x0-x1)==0) left = 0;//第二个坐标点与第一个坐标点,在同一列。
else if((x0-x1)<0) left =1;//第二个坐标点位于右。第一个坐标位于左。
if(left == 1){
w0 = x0 +w/2 ;//宽度 2
h0 = y0+h/2;//2
width = (x1 - x0) ;
height = (y1-y0);
}else if(left == 0){
h0 = y0 +h/2;//2
w0 = x0;
width = w;
height = (y1 - y0) ;
}else if(left == -1){
w0 = x1+w/2;//2
h0 = y0 +h/2;//2
width = x0 - x1 ;
height = (y1-y0);
}
document.write("<canvas id="+curId+i+" width="+width+" height="+height+" class=n"+curId+" style='position:absolute;top:"+h0+"px;left:"+w0+"px;'></canvas>");
x0=0;y0=0;x1=0;y1=0;
//把下一坐标对象赋给上一个坐标
pre = null;
pre = next;
}
}
paintDiv('.blue');
paintDiv('.red');
//
//-->
</script>
上面的JS代码用于根据表格中的 小格,生成多少个 canvas
下面这个才是真正用于画线的。
<script>
/**
x0 起点坐标 X
Y0 起点坐标 Y
X1 终点坐标 X
Y1 终点坐标 Y
ID 画布ID
COLOR 线颜色 默认为 green
lineWidth 线大小。默认为1
**/
function drawLine(x0,y0,x1,y1,id,color,lineWidth){
var ctxt = document.getElementById(id).getContext('2d');
ctxt.save();
ctxt.strokeStyle =color==null?"green":color;
ctxt.lineWidth = lineWidth==null?1:lineWidth;
ctxt.beginPath();
ctxt.moveTo(x0 , y0);
ctxt.lineTo(x1, y1);
ctxt.closePath();
ctxt.stroke();
ctxt.restore();
}
/**
画布
*/
function canvasLine(pointId){
var cavs = $(pointId).get();
//var size = $(canvasId).size();//画布
//$("#size").text(size);
var ary = $(pointId).get();//坐标点样式
var size = $(ary).size();
var pre= null;//上一个坐标点
if(size > 1) pre = $(ary).get(0);
var str ="";//定义画布字符串
var w = 20;//定义宽度20px
var h = 20;//定义高度20px
for(var i=1;i<size;i++){
var next = $(ary).get(i);
//得到上一X,Y坐标点。
var x0 = parseInt(pre.offsetLeft);//宽
var y0 = parseInt(pre.offsetTop);//高
var x1 = parseInt(next.offsetLeft);//宽
var y1 = parseInt(next.offsetTop);//高
//画布左上角坐标。。如果点在起点在左,那么第一个坐标的X点《第二点的X点。反之,在右,第二个坐标的X点》第一个坐标X点。
//如果是同一列,那么二者X坐标点应该是相同的。。
var w0 =0;//宽
var h0 = 0;//高
var width = 0;
var height = h;
var left = -1;
if((x0 - x1)>0) left = -1;//第二个坐标点位于左,第一个坐标位于右。
else if((x0-x1)==0) left = 0;//第二个坐标点与第一个坐标点,在同一列。
else if((x0-x1)<0) left =1;//第二个坐标点位于右。第一个坐标位于左。
var pontId = pointId.replace(/\./g,'');
if(left == 1){
w0 = 0 ;//高度
h0 = 0;
width = (x1 - x0);
height = y1-y0;
drawLine(w0,h0,width,height,pontId+i);
}else if(left == 0){
w0 = w/2;
h0 = 0 ;
width = w/2;
height = (y1 - y0) ;
drawLine(w0,h0,width,height,pontId+i);
}else if(left == -1){
w0 = x0-x1;
h0 = 0 ;
width = 0;
height = (y1-y0);
drawLine(w0,h0,width,height,pontId+i);
}
x0=0;y0=0;x1=0;y1=0;
//把下一坐标对象赋给上一个坐标
pre = null;
pre = next;
}
}
基本上所有的代码都在这里了。。如果哪位需要其他的代码可以与我联系. wrong1111@126.com 或者 343886028 QQ 注明 js
下面是所有的代码源码
964

被折叠的 条评论
为什么被折叠?



