纯js网页画板(Graphics)类简介及实现代码


Posted in Javascript onDecember 24, 2012

今天需要在网页上画一个图谱,想到用JS,经过学习,和网上搜索,经过整理优化得到下面代码,注意不是用HTML5的canvas,而是用的纯js

/* 以下画点,画线,画圆的方法,都不是用HTML5的canvas,而是用的纯js 
用到了一些数学的三角函数方法 
以下代码是课堂随机写出,没有做更多优化 
*/ 
/* 
面向对象封装,添加绘制矩形 
进一步优化代码 
*/ 
var Graphics = function(divId, color){ 
this.divId = divId; 
this.color = color; //'#000000'或'black' 
this.drawPoint= function(x,y){ 
//画点 
var oDiv=document.createElement('div'); 
oDiv.style.position='absolute'; 
oDiv.style.height='2px'; 
oDiv.style.width='2px'; 
oDiv.style.backgroundColor=this.color; 
oDiv.style.left=x+'px'; 
oDiv.style.top=y+'px'; 
//document.body.appendChild(oDiv); 
return oDiv;//注意:返回的值是一个dom节点,但并未追加到文档中 
}; 
this.drawLine = function(x1,y1,x2,y2){ 
//画一条线段的方法。(x1,y1),(x2,y2)分别是线段的起点终点 
var x=x2-x1;//宽 
var y=y2-y1;//高 
var frag=document.createDocumentFragment(); 
if(Math.abs(y)>Math.abs(x)){//那个边更长,用那边来做画点的依据(就是下面那个循环),如果不这样,当是一条垂直线或水平线的时候,会画不出来 
if(y>0)//正着画线是这样的 
for(var i=0;i<y;i++){ 
var width=x/y*i //x/y是直角两个边长的比,根据这个比例,求出新坐标的位置 
{ frag.appendChild(drawPoint(width+x1,i+y1)); 
} 
} 
if(y<0){//有时候是倒着画线的 
for(var i=0;i>y;i--){ 
var width=x/y*i 
{ 
frag.appendChild(drawPoint(width+x1,i+y1)); 
} 
} 
} 
}//end if 
else { 
if(x>0)//正着画线是这样的 
for(var i=0;i<x;i++){ 
var height=y/x*i 
{ 
frag.appendChild(drawPoint(i+x1,height+y1)); 
} 
} 
if(x<0){//有时候是倒着画线的 
for(var i=0;i>x;i--){ 
var height=y/x*i 
{ 
frag.appendChild(this.drawPoint(i+x1,height+y1)); 
} 
} 
}//end if 
} 
document.getElementById(this.divId).appendChild(frag); 
}; 
this.drawCircle = function(r, x, y){ 
//画个圆。x,原点横坐标;y,原点纵坐标;r,半径 
var frag=document.createDocumentFragment(); 
for(var degree=0;degree<360;degree+=2){ 
var x1=r*Math.sin(degree*Math.PI/180); 
var y1=r*Math.cos(degree*Math.PI/180); 
frag.appendChild(drawPoint(x+x1,y+y1)); 
} 
document.body.appendChild(frag); 
}; 
this.dragCircle = function(x1,y1,x2,y2){ 
//拖出一个圆来 
var r=Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));//求出半径的长 直角三角形中 斜边的平方=两个直边的平方之和 
var frag=document.createDocumentFragment(); 
for(var degree=0;degree<360;degree+=2){//每隔2度画一个点 
var x2=r*Math.sin(degree*Math.PI/180); 
var y2=r*Math.cos(degree*Math.PI/180); 
frag.appendChild(drawPoint(x1+x2,y1+y2)); 
} 
document.getElementById(this.divId).appendChild(frag); 
}; 
this.drawRect = function(startX, startY, lengthX, lengthY, newId, text){ 
//(startX, startY)起点坐标,lengthX,长 lengthY,宽 newId,新创建的div的Id text,div内容 
var myDiv=document.createElement('div'); 
if(newId){ 
myDiv.id=newId; 
} 
myDiv.style.width= lengthX + 'px'; 
myDiv.style.height= lengthY + 'px'; 
myDiv.style.backgroundColor = this.color; 
myDiv.style.left=startX + 'px'; 
myDiv.style.top=startY + 'px'; 
myDiv.style.textAlign= 'center'; 
if(text){ 
myDiv.innerHTML = text; 
} 
document.getElementById(this.divId).appendChild(myDiv); 
}; 
}; 
window.onload=function(){ 
var g = new Graphics('div1', 'red'); 
g.drawLine(500,30,0,30); 
g.color = '#CDC9C9'; 
g.drawRect(10,10,200,200, '', '测试'); 
}
Javascript 相关文章推荐
JQuery 表单中textarea字数限制实现代码
Dec 07 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
Jquery.Form 异步提交表单的简单实例
Mar 03 Javascript
JS中artdialog弹出框控件之提交表单思路详解
Apr 18 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
Sep 05 Javascript
Vue.js中extend选项和delimiters选项的比较
Jul 17 Javascript
javascript如何用递归写一个简单的树形结构示例
Sep 06 Javascript
webpack4的迁移的使用方法
May 25 Javascript
在vue中v-bind使用三目运算符绑定class的实例
Sep 29 Javascript
详解ES6实现类的私有变量的几种写法
Feb 10 Javascript
Knockoutjs快速入门(经典)
Dec 24 #Javascript
Underscore.js 的模板功能介绍与应用
Dec 24 #Javascript
javascript 星级评分效果(手写)
Dec 24 #Javascript
Jquery写一个鼠标拖动效果实现原理与代码
Dec 24 #Javascript
jquery限制输入字数,并提示剩余字数实现代码
Dec 24 #Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
Dec 23 #Javascript
ajax中get和post的说明及使用与区别
Dec 23 #Javascript
You might like
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
JS倒计时代码汇总
2014/11/25 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
2017/11/28 Javascript
Vue的实例、生命周期与Vue脚手架(vue-cli)实例详解
2017/12/27 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
elementUI同一页面展示多个Dialog的实现
2020/11/19 Javascript
[02:55]DOTA2英雄基础教程 发条技师
2013/12/04 DOTA
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
深入讲解Java编程中类的生命周期
2016/02/05 Python
python实现杨氏矩阵查找
2019/03/02 Python
Python数据类型之List列表实例详解
2019/05/08 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
python计算auc的方法
2020/09/09 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
你常见到的runtime exception
2016/09/05 面试题
商场中秋节活动方案
2014/02/07 职场文书
2014年最新学习全国两会精神心得
2014/03/17 职场文书
作风转变心得体会
2014/09/02 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
python中使用redis用法详解
2022/12/24 Redis