您的位置:首页 > Web前端 > HTML5

HTML5 canvas画板

2012-01-05 17:13 183 查看


我弄运行代码老是弄不好。烦。

大家点这个链接看吧,在我的博客

如果有同好html5 canvas的朋友,可以加我建的canvas群:184858197
可以讨论canvas或node.js

源代码如下:(你可以直接复制到本地)

<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>画图</title>
<script type="text/javascript">
window.onload = function() {
$("yanse").value = "#000";
$("hSize").value = "10";
$("hStyle").value = "round";
$("hjoin").value = "miter";
$("liu").value="0";
$("touming").value="100";
/***********全局变量********************/
var Xtemp = $("temp"),
main = $("main"),
//图层容器
//临时绘图区
Xbox = $("box"),
//画形状区
mapWidth = Xtemp.getAttribute("width"),
//区宽
mapHeight = Xtemp.getAttribute("height"),
//区高
temp = Xtemp.getContext("2d"),
box = Xbox.getContext("2d"),
Mx,
//鼠标移动的坐标X
My,
//Y
Cx,
//鼠标按下的坐标X
Yx,
//Y
suoyin = "画笔",
pan = false,
//判断鼠标是否弹起,如果是,绘画结束
yanse = $("yanse").value,
//绘制的颜色
hSize = $("hSize").value,
//流量
liu=$("liu").value,
//透明
touming=$("touming").value/100,
//画线的时候粗细
hStyle = $("hStyle").value,
//画线的时候样式
hJoin = $("hjoin").value,
yidong = false,
TuCeng,
deng,
guna = $("guna");
/************选项设置*****************************/
$("yanse").oninput = function() {
yanse = $("yanse").value; //改变颜色
$("sYanse").style.background = yanse;
}
$("hSize").oninput = function() {

hSize = $("hSize").value; //改变画笔大小
}
guna.onfocus = function() {
var dingshi=setInterval(gung, 100);
}
guna.onblur=function(){
clearInterval(dingshi)
}
function gung() {
hSize = $("hSize").value; //改变画笔大小
}
$("hStyle").onchange = function() {
hStyle = $("hStyle").value; //改变画笔样式
}
$("hjoin").onchange = function() {
hJoin = $("hjoin").value; //改变画笔样式
}
$("liu").oninput=function(){
liu=$("liu").value;//流量
}
$("touming").oninput=function(){
touming=$("touming").value/100;//流量
}
/*******************画图**************************/
var player = {
name: temp,
fill: function() {
this.name.globalAlpha=touming;
this.name.shadowBlur = liu; //模糊程度
this.name.shadowColor = yanse; //模糊颜色
this.name.fillStyle = yanse;
this.name.fillRect(Cx, Cy, Mx - Cx, My - Cy);
},
stroke: function() {
this.name.globalAlpha=touming;
this.name.lineWidth = hSize;
this.name.shadowBlur = liu; //模糊程度
this.name.shadowColor = yanse; //模糊颜色
this.name.strokeStyle = yanse;
this.name.strokeRect(Cx, Cy, Mx - Cx, My - Cy);
},
arc:function(){
this.name.beginPath();
this.name.globalAlpha=touming;
this.name.lineWidth = hSize;
this.name.shadowBlur = liu; //模糊程度
this.name.shadowColor = yanse; //模糊颜色
this.name.strokeStyle = yanse;
this.name.arc(Cx, Cy, Mx - Cx, 0,Math.PI*2, true);
this.name.fill();
}
}
/****************画布容器位置*****************************/
var can = $("canvas");
Tleft(can, 80);
Ttop(can, 45);
var Xleft = parseInt(can.style.left);
var Xtop = parseInt(can.style.top);
var top = $("top");
tuodong(top, can);
/******************导航***************************************/
var dd = $("Xtop").getElementsByTagName("li")[0].getElementsByTagName("h1")[0];
Del_space($("leftnav")); //处理空格
Del_space($("leftnav").childNodes[1]); //处理空格
var index = $("leftnav").childNodes[1].childNodes; //得到样式索引
index[0].style.fontSize = "18px"; //导航铅笔大小
index[0].style.color = "#ff0000"; //导航铅笔颜色
for (var i = 0; i < index.length; i++) {
index[i].onclick = function() {
//这里是左边的导航切换样式
var suoyou = this.parentNode.childNodes;
for (var j = 0; j < suoyou.length; j++) {
suoyou[j].style.fontSize = "12px";
suoyou[j].style.color = "#000";
}
this.style.fontSize = "18px";
this.style.color = "#ff0000";
dd.innerHTML = this.innerHTML; //顶部的
suoyin = this.innerHTML; //索引
}
}
/*****************临时画布事件*****************************/
var linshi=hSize/(Math.PI*2);
main.onmousemove = function(event) {
if (pan == false) {
return false;
}
Mx = event.clientX - (Xleft + 30);
My = event.clientY - (Xtop + 30);
temp.clearRect(0, 0, mapWidth, mapHeight);
Xplayer = player;
Xplayer.name = temp;
//temp.fillRect(0, 0, mapWidth, mapHeight);
switch (suoyin) {
case "画笔":
box.lineTo(Mx, My);
box.stroke();
break;
case "铅笔":
box.lineTo(Mx, My);
box.stroke();
break;
case "矩形":
Xplayer.fill();
break;
case "边框":
Xplayer.stroke();
break;
case "圆":
Xplayer.arc();
break;
case "擦除":
box.clearRect(Mx, My, hSize, hSize);
break;

}

}
main.onmousedown = function(event) {
pan = true;
Cx = event.clientX - (Xleft + 30);
Cy = event.clientY - (Xtop + 30);
switch (suoyin) {
case "画笔":
box.strokeStyle = yanse;
box.lineWidth = hSize;
box.lineCap = hStyle;
box.linejoin = hJoin;
box.shadowBlur = 10; //模糊程度
box.shadowColor = yanse; //模糊颜色
box.beginPath();
box.moveTo(Cx, Cy);
box.lineTo(Cx,Cy)
box.stroke();
break;
case "铅笔":
box.strokeStyle = yanse;
box.lineWidth = hSize;
box.lineCap = hStyle;
box.linejoin = hJoin;
box.shadowBlur = 0; //模糊程度
box.shadowColor = yanse; //模糊颜色
box.beginPath();
box.moveTo(Cx, Cy);
box.lineTo(Cx,Cy)
box.stroke();
break;
case "擦除":
box.clearRect(Cx, Cy, hSize, hSize);
break;
}
}
main.onmouseup = function() {
pan = false;
var bPlayer = player;
bPlayer.name = box;
switch (suoyin) {
case "矩形":
bPlayer.fill();
break;
case "圆":
bPlayer.arc();
break;
case "边框":
bPlayer.stroke();
break;
case "填充":
box.fillRect(0, 0, mapWidth, mapHeight)
break;
}
}
/********************新建图层***************/
var num = 1; //图层面板新建索引
var tucengSuoyin = $("tuceng"); //图层面板
Del_space(tucengSuoyin) //图层面板
var tucesuo = tucengSuoyin.childNodes; //图层面板单击索引
tucesuo[0].style.backgroundColor = "#003CFF";
$("xinjian").onclick = function() {
//图层
var tuceng = document.createElement("canvas");
var diyi = main.getElementsByTagName("canvas")[0];
tuceng.setAttribute("width", 500);
tuceng.setAttribute("height", 500);
tuceng.setAttribute("id", "tuceng" + num);
main.insertBefore(tuceng, diyi);
//图层面板
var tnew = document.createElement("li");
var tucengno1 = tucengSuoyin.getElementsByTagName("li")[0];
tnew.setAttribute("id", num);
tucengSuoyin.insertBefore(tnew, tucengno1);
$(num).innerHTML = "图层" + num;
num++;
/********切换变换样式**********/
for (var i = 0; i < num; i++) {
tucesuo[i].onclick = function() {
var suoyou = this.parentNode.childNodes;
for (var j = 0; j < suoyou.length; j++) {
suoyou[j].style.backgroundColor = "";
}
this.style.backgroundColor = "#003CFF";
//alert(num)
var iid = this.getAttribute("id");
// Xbox=$("tuceng"+iid);
// box = Xbox.getContext("2d");
}
}
}
//(tuce.innerHTML)
/*********************移动图形事件**************************/

//var mainX, mainY, kongX, kongY;
/*********************拾色器************************************/
var shiseqi = $("shiseqi");
var shiseT = shiseqi.childNodes[0];
Tleft(shiseqi, 150);
Ttop(shiseqi, 150);
$("sYanse").onclick = function() {
shiseqi.style.display = "block";
}
$("ok").onclick = function() {
shiseqi.style.display = "none";
}
tuodong(shiseT, shiseqi)
/***************背景画布*************************************/
var bg = $("bg");
var bgColor = bg.getContext("2d");
var gd = bgColor.createLinearGradient(0, 0, mapWidth, mapHeight);
gd.addColorStop(0, "#333");
gd.addColorStop(1, "#000");
bgColor.fillStyle = gd;
bgColor.fillRect(0, 0, mapWidth, mapHeight);
/****************工具箱******************************/
var leftnav = $("leftnav");
var leftTuo = leftnav.getElementsByTagName("h1")[0];
Tleft(leftnav, 10);
Ttop(leftnav, 45);
tuodong(leftTuo, leftnav);
/*****************面板**************************/
var xx = $("xuanxiang");
Tleft(xx, 700);
Ttop(xx, 45);
tuodong(xx, xx);
/*******保存******/
var save = $("save");
save.onmousedown = function() {
window.location.href = $("box").toDataURL()
}
/**********************拖动条*****************************/
Tleft(guna, 10);
Ttop(guna, - 5);
tuodong(guna, guna, "left");
$("gunBg").style.width = guna.style.left; //初始背景

}
/**************拖动***************************/
function tuodong(tuo, dong, fangxiang) {
var tuoX, tuoY, yiX, yiY;
var tuoPan = false;
var xiang = fangxiang;
tuo.onmousedown = function(event) {
//捕获鼠标事件
if (this.setCapture) {
this.setCapture();
} else if (window.captureEvents) {
window.captureEvents(EVEND.MOUSEMOVE)
}
//鼠标按下的时候记下坐标
// switch (xiang) {
var canX = parseInt(dong.style.left);
var canY = parseInt(dong.style.top);
tuoPan = true;
tuoX = event.clientX - canX; //现在鼠标坐标减去对象坐标=鼠标相对对象的坐标
tuoY = event.clientY - canY;
}
tuo.onmousemove = function(event) {
//鼠标移动的时候
if (tuoPan == false) {
return false;
}
if (xiang == "left") {
yiX = event.clientX;
yiX = yiX - tuoX; //现在坐标减去鼠标按下的时候的相对坐标=目的坐标
if (yiX > 100 || yiX < 1) {
return false;
}
$("hSize").value = yiX;
hSize = 100; //改变画笔大小
$("gunBg").style.width = yiX + "px"; //滚动条的背景
dong.style.left = yiX + "px";
} else {
yiX = event.clientX;
yiY = event.clientY;
yiX = yiX - tuoX; //现在坐标减去鼠标按下的时候的相对坐标=目的坐标
yiY = yiY - tuoY;
dong.style.left = yiX + "px";
dong.style.top = yiY + "px";
}
}
tuo.onmouseup = function() {
//取消鼠标捕获
if (this.releaseCapture) {
this.releaseCapture();
} else if (window.captureEvents) {
window.captureEvents(Event.MOUSEMOVE);
}
tuoPan = false;
if (dong.getAttribute("id") == "canvas") {
Xleft = parseInt(can.style.left);
Xtop = parseInt(can.style.top);

}
}
}
/****************获取id**************************/
function $(name) {
return document.getElementById(name);
}
/****************过滤空格***********************/
function Del_space(elem) {
var elem_child = elem.childNodes; //获取所有子元素
for (var i = 0; i < elem_child.length; i++) {
//如果是文本节点,并且内容只包含空格则删除该节点
if (elem_child[i].nodeName == "#text" && ! /\S/.test(elem_child[i].nodeValue)) {
elem.removeChild(elem_child[i]); //如果该元素为空格则删除
}
}
}
/*****************对象的left&&top***********************/
function Tleft(name, x) {
name.style.left = x + "px";
}
function Ttop(name, y) {
name.style.top = y + "px";
}
</script>
<style type="text/css">
body,nav,ul,li,h1{margin:0px auto;padding:0px;}
body{background-color:#C0C0C0;font-size:12px;font-family:'宋体';position:relative;width:100%;}
/**/
li{list-style-type:none;display:inline;}
.bor{height:1px;background-color:#ACA899;border:1px #fff solid;}
nav#topnav{position:absolute;left:10px;top:10px;}
/*工具箱*/
nav#leftnav{position:absolute;left:10px;top:15px;width:60px;background-color:#ECE9D8;border:3px solid #0017C1;border-color:#0017C1 #0427BC #0532C0;text-align:center;z-index:1;}/*导航*/
#leftnav li{display:block;margin-top:10px;cursor:pointer;}
#leftnav div{background-color:#808080;line-height:24px;text-align:center;}
/*画布*/
#canvas{width:560px;height:560px;position:absolute;left:80px;top:55px;background-color:#808080;border:1px solid #000;z-index:0;}
#cursor{position:absolute;top:100px;left:800px;border:1px solid #333;}
#main canvas{position:absolute;left:0px;top:0px;}
#bg{z-index:0;}
#temp{z-index:1;}
#box{z-index:2;}
/*top*/
#top{width:560px;height:30px;text-align:center;line-height:30px;}
#left{width:30px;height:500px;float:left;}
#main{position:relative;width:500px;height:500px;background-image:url(../img/bg.gif);cursor:crosshair;float:left;}//画布容器
#right{width:30px;height:500px;float:left;}
#bottom{width:560px;height:30px;float:left;}
/*选项板*/
#Xtop{height:40px;line-height:40px;padding-left:20px;background-color:#ECE9D8;z-index:9;}
#Xtop h1{display:inline;background-color:#ECE9D8;font-size:14px;}
/*选项*/
#xuanxiang{position:absolute;left:650px;top:15px;border:3px solid #0017C1;border-color:#0017C1 #0427BC #0532C0;z-index:1;}
#xuanxiang li{display:block;line-height:30px;}

#zuobiao{position:absolute;right:50px;}

#sYanse{width:20px;height:20px;float:left;background-color:#000;margin-top:4px;}
h1{background-color:#808080;cursor:move;}
/*保存*/
#save{cursor:pointer;line-height:30px;}
/*背景色面板*/
#shiseqi{display:none;position:absolute;left:700px;top:700px;width:100px;height:100px;z-index:99;}
/*滚动条*/
#gun{position:absolute;z-index:999;width:110px;height:10px;background-color:#333;}
#guna{width:10px;position:absolute;top:-5px;left:0px;}
#gunBg{height:10px;;background-color:#ff0000;}

</style>
</head>
<body>
<div id="shiseqi"><h1>拾色器</h1><input type="text" id="yanse" size="6"><input type="button" value="^_^" id="ok"/></div>
<ul id="Xtop">
<li><h1>画笔:</h1></li>
<li>粗细<input type="text" id="hSize" size="6"></li>
<li>笔头方式<select id="hStyle">
<option value="butt">粗</option>
<option value="round">圆</option>
<option value="squere">平</option>
</select>
</li>
<li>画笔头<select id="hjoin">
<option value="round">round</option>
<option value="round">bevel</option>
<option value="squere">miter</option>
</select>
</li>
<li>流量<input type="text" id="liu" size="6"></li>
<li>不透明度<input type="text" id="touming" size="6"></li>
<li id="save">
保存
</li>
<li>到我的<a href="http://www.shenmimi.com/blog" target="_blank">博客</a>或<a href="http:www.shenmimi.com" target="_blank">论坛</a>上看看还有啥</li>

</ul>
<div id="gun">
<div id="gunBg"></div>
<input type="button" id="guna"/>
</div>
<nav id="leftnav">
<h1>工具箱</h1>
<ul>
<li>画笔</li>
<li>铅笔</li>
<li>矩形</li>
<li>边框</li>
<li>圆</li>
<li></li>
<li>擦除</li>
<li>填充</li>
</ul>
<div><span id="sYanse"></span></div>
<div id="rongqi"></div>
</nav>
<div id="canvas">
<div id="top"><h1>画布<h1></div>
<div id="left"></div>
<div id="main">
<canvas id="box" width="500" height="500"></canvas>
<canvas id="temp" width="500" height="500"></canvas>
<canvas id="bg" width="500" height="500"></canvas>
</div>
<div id="right"></div>
<div id="bottom"></div>
</div>
<div id="xuanxiang">
<h1>图层</h1>
<ul id="tuceng">
<li>默认</li>
</ul>
<ul>
<li id="xinjian">新建</li>
</ul>
</div>

</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: