&l..._"">
赞
踩
代码片段如下:
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <title>canvas基础</title> <script type="text/javascript" src="jquery-3.2.1.min.js"></script> <link href="css/monokai_sublime.min.css" rel="stylesheet" /> <link href="css/style.css" rel="stylesheet" /> <link href="codemirror/lib/codemirror.css" rel="stylesheet" type="text/css"> <link href="codemirror/theme/monokai.css" rel="stylesheet" type="text/css"> <link href="codemirror/addon/display/fullscreen.css" rel="stylesheet" type="text/css"></head> <body class="example"> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <textarea id="joldy"> <script type="text/javascript" class="joldy"> var c = document.getElementById("myCanvas"); var cxt = c.getContext("2d"); cxt.moveTo(10, 10); cxt.lineTo(150, 50); cxt.lineTo(10, 50); cxt.stroke(); </script> </textarea> <script type="text/javascript" class="joldy"> var c = document.getElementById("myCanvas"); var cxt = c.getContext("2d"); cxt.moveTo(10, 10); cxt.lineTo(150, 50); cxt.lineTo(10, 50); cxt.stroke(); </script> <!-- 2 --> <canvas id="myCanvas1" width="200" height="100" style="border:1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <p>在canvas中绘制圆形, 我们将使用以下方法:</p> <p>arc(x,y,r,start,stop)</p> <textarea id="myCanvas1"> <script type="text/javascript"> var c = document.getElementById("myCanvas1"); var cxt = c.getContext("2d"); cxt.fillStyle = "#FF0000"; cxt.beginPath(); cxt.arc(70, 18, 15, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); </script> </textarea> <script type="text/javascript"> var c = document.getElementById("myCanvas1"); var cxt = c.getContext("2d"); cxt.fillStyle = "#FF0000"; cxt.beginPath(); cxt.arc(70, 18, 15, 0, Math.PI * 2, true); cxt.closePath(); cxt.fill(); </script> <!-- 3 --> <canvas id="myCanvas3" width="200" height="100" style="border:1px solid #c3c3c3;"> Your browser does not support the canvas element. </canvas> <img src="eg_flower.png" style="display: none"> <textarea> <script type="text/javascript"> var c = document.getElementById("myCanvas3"); var cxt = c.getContext("2d"); var img = new Image() img.src = "eg_flower.png" cxt.drawImage(img, 0, 0); </script> </textarea> <script type="text/javascript" class="joldy"> var c = document.getElementById("myCanvas3"); var cxt = c.getContext("2d"); var img = new Image() img.src = "eg_flower.png" cxt.drawImage(img, 0, 0); </script> <!-- 4 --> <p> 使用 canvas 绘制文本,重要的属性和方法如下: </p> <p>font - 定义字体</p> <p>fillText(text,x,y) - 在 canvas 上绘制实心的文本</p> <p>strokeText(text,x,y) - 在 canvas 上绘制空心的文本</p> <canvas id="myCanvas4" width="300" height="200" style="border:1px solid #d3d3d3;"> 您的浏览器不支持 HTML5 canvas 标签。</canvas> <script type="text/javascript"> var c = document.getElementById("myCanvas4"); var ctx = c.getContext("2d"); ctx.font = "30px YaHei"; ctx.fillStyle = "red"; ctx.fillText("Hello World", 10, 50); /* fillText(text,x,y,maxWidth); text 规定在画布上输出的文本。 x 开始绘制文本的 x 坐标位置(相对于画布)。 y 开始绘制文本的 y 坐标位置(相对于画布)。 maxWidth 可选。允许的最大文本宽度,以像素计。 */ ctx.strokeStyle = "red"; ctx.strokeText("Hello World", 20, 100); </script> <!-- 5 --> <pre> Canvas - 渐变 渐变可以填充在矩形, 圆形, 线条, 文本等等, 各种形状可以自己定义不同的颜色。 以下有两种不同的方式来设置Canvas渐变: createLinearGradient(x,y,x1,y1) - 创建线条渐变 createRadialGradient(x,y,r,x1,y1,r1) - 创建一个径向/圆渐变 当我们使用渐变对象,必须使用两种或两种以上的停止颜色。 addColorStop()方法指定颜色停止,参数使用坐标来描述,可以是0至1. 使用渐变,设置fillStyle或strokeStyle的值为 渐变,然后绘制形状,如矩形,文本,或一条线。 使用 createLinearGradient(): </pre> <canvas id="myCanvas5" width="300" height="200" style="border:1px solid #d3d3d3;"></canvas> <script type="text/javascript"> var c = document.getElementById("myCanvas5"); var ctx = c.getContext("2d"); // 创建渐变 /* addColorStop(stop,color); 方法规定 gradient 对象中的颜色和位置。 stop: 介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置 color: 在结束位置显示的 CSS 颜色值 */ var grd = ctx.createLinearGradient(0, 0, 200, 0); grd.addColorStop(0, "red"); grd.addColorStop(1, "white"); // 填充渐变 ctx.fillStyle = grd; ctx.fillRect(10, 10, 150, 80); // 创建渐变 var grd1 = ctx.createRadialGradient(75, 140, 5, 90, 150, 100); grd1.addColorStop(0, "red"); grd1.addColorStop(1, "white"); // 填充渐变 ctx.fillStyle = grd1; ctx.fillRect(10, 100, 150, 80); // fillRect(x,y,width,height); 矩形左上角的 x 坐标; 矩形左上角的 y 坐标; 矩形的宽度,以像素计; 矩形的高度,以像素计 </script> <!-- 6 --> <p>canvas渐变文字</p> <canvas id="canvas6" width="600" height="200"></canvas> <script type="text/javascript"> var canvas = document.getElementById('canvas6'), ctx = canvas.getContext('2d'), gradient = ctx.createLinearGradient(0, 0, canvas.width, 0); // 渐变开始点的 x 坐标; 渐变开始点的 y 坐标; 渐变结束点的 x 坐标; 渐变结束点的 y 坐标 gradient.addColorStop('0', 'black'); gradient.addColorStop('0.3', 'green'); gradient.addColorStop('0.6', 'yellow'); gradient.addColorStop('1', 'red'); /* addColorStop(stop,color); 方法规定 gradient 对象中的颜色和位置。 stop: 介于 0.0 与 1.0 之间的值,表示渐变中开始与结束之间的位置 color: 在结束位置显示的 CSS 颜色值 */ ctx.font = '40px yahei'; ctx.fillStyle = gradient ctx.fillText('hello world', 100, 100); </script> <!-- canvas7 绘制一个带有黑色阴影的蓝色矩形: --> <p>绘制一个带有黑色阴影的蓝色矩形:</p> <canvas id="canvas7" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas> <pre> <code> var c=document.getElementById("canvas7"); var ctx=c.getContext("2d"); ctx.shadowBlur=20; ctx.fillStyle="blue"; ctx.shadowColor="black"; ctx.fillRect(20,20,100,80); ctx.shadowColor="red"; ctx.fillRect(140,20,100,80); </code> </pre> <script type="text/javascript"> var c = document.getElementById("canvas7"); var ctx = c.getContext("2d"); ctx.shadowBlur = 20; // 返回阴影的模糊级数 ctx.shadowOffsetX = 20; // 正值或负值,定义阴影与形状的水平距离。 ctx.shadowOffsetY = 20; // 正值或负值,定义阴影与形状的垂直距离。 ctx.fillStyle = "blue"; ctx.shadowColor = "black"; ctx.fillRect(20, 20, 100, 80); ctx.shadowColor = "red"; ctx.fillRect(140, 20, 100, 80); </script> <!-- canvas 8 canvas lineCap lineJoin lineWidth 属性 --> <p>canvas lineCap 属性</p> <canvas id="canvas8" width="300" height="300" style="border:1px solid #d3d3d3;"></canvas> <script> var c = document.getElementById("canvas8"); var ctx = c.getContext("2d"); ctx.beginPath(); ctx.lineWidth = 10; // 属性设置或返回当前线条的宽度,以像素计。 ctx.lineCap = "butt"; // 向线条的每个末端添加平直的边缘。 ctx.moveTo(20, 20); ctx.lineTo(200, 20); ctx.stroke(); ctx.beginPath(); ctx.lineCap = "round"; // 向线条的每个末端添加圆形线帽。 ctx.moveTo(20, 40); ctx.lineTo(200, 40); ctx.stroke(); ctx.beginPath(); ctx.lineCap = "square"; // 向线条的每个末端添加正方形线帽。 ctx.moveTo(20, 60); ctx.lineTo(200, 60); ctx.stroke(); // lineJoin 属性设置或返回所创建边角的类型,当两条线交汇时。 ctx.beginPath(); ctx.lineJoin = "round"; ctx.moveTo(80, 80); ctx.lineTo(150, 110); ctx.lineTo(80, 160); ctx.stroke(); /* miterLimit 属性设置或返回最大斜接长度。 斜接长度指的是在两条线交汇处内角和外角之间的距离。 提示:只有当 lineJoin 属性为 "miter" 时,miterLimit 才有效。 边角的角度越小,斜接长度就会越大。 为了避免斜接长度过长,我们可以使用 miterLimit 属性。 */ ctx.beginPath(); ctx.lineJoin = "miter"; ctx.miterLimit = 50; ctx.moveTo(160, 160); ctx.lineTo(200, 167); ctx.lineTo(160, 174); ctx.stroke(); </script> <!-- canvas9 转换 --> <p>转换</p> <pre> 定义和用法 scale() 方法缩放当前绘图,更大或更小。 注释:如果您对绘图进行缩放,所有之后的绘图也会被缩放。定位也会被缩放。如果您 scale(2,2),那么绘图将定位于距离画布左上角两倍远的位置。 JavaScript 语法: context.scale(scalewidth,scaleheight); 参数值 参数 描述 scalewidth 缩放当前绘图的宽度 (1=100%, 0.5=50%, 2=200%, 依次类推) scaleheight 缩放当前绘图的高度 (1=100%, 0.5=50%, 2=200%, etc.) </pre> <canvas id="canvas9" width="1000" height="250" style="border:1px solid #d3d3d3;"></canvas> <script type="text/javascript"> var c = document.getElementById("canvas9"); var ctx = c.getContext("2d"); ctx.strokeRect(5, 5, 25, 15); ctx.scale(2, 2); // 放大200% ctx.strokeRect(5, 5, 25, 15); ctx.scale(2, 2); ctx.strokeRect(5, 5, 25, 15); ctx.scale(2, 2); ctx.strokeRect(5, 5, 25, 15); // rotate ctx.scale(0.1, 0.1); ctx.rotate(20 * Math.PI / 180); ctx.fillRect(400, 20, 100, 50); </script> <p>canvas transform()</p> <pre> 绘制一个矩形;通过 transform() 添加一个新的变换矩阵,再次绘制矩形;添加一个新的变换矩阵,然后再次绘制矩形。 请注意,每当您调用 transform() 时,它都会在前一个变换矩阵上构建: JavaScript 语法: context.transform(a,b,c,d,e,f); 参数值 参数 描述 a 水平缩放绘图 b 水平倾斜绘图 c 垂直倾斜绘图 d 垂直缩放绘图 e 水平移动绘图 f 垂直移动绘图 </pre> <canvas id="canvas10" width="1000" height="250" style="border:1px solid #d3d3d3;"></canvas> <script> var c = document.getElementById("canvas10"); var ctx = c.getContext("2d"); ctx.fillStyle = "yellow"; ctx.fillRect(0, 0, 250, 100) ctx.transform(1, 0.5, -0.5, 1, 30, 10); ctx.fillStyle = "red"; ctx.fillRect(0, 0, 250, 100); ctx.transform(1, 0.5, -0.5, 1, 30, 10); ctx.fillStyle = "blue"; ctx.fillRect(0, 0, 250, 100); </script> <p>canvas setTransform() 方法</p> <pre> 绘制一个矩形,通过 setTransform() 重置并创建新的变换矩阵,再次绘制矩形,重置并创建新的变换矩阵,然后再次绘制矩形。 请注意,每当您调用 setTransform() 时,它都会重置前一个变换矩阵然后构建新的矩阵,因此在下面的例子中,不会显示红色矩形,因为它在蓝色矩形下面: </pre> <canvas id="canvas11" width="1000" height="250" style="border:1px solid #d3d3d3;"></canvas> <script> var c = document.getElementById("canvas11"); var ctx = c.getContext("2d"); ctx.fillStyle = "yellow"; ctx.fillRect(0, 0, 250, 100) ctx.setTransform(1, 0.5, -0.5, 1, 30, 10); ctx.fillStyle = "red"; ctx.fillRect(0, 0, 250, 100); ctx.setTransform(1, 0.5, -0.5, 1, 30, 10); ctx.fillStyle = "blue"; ctx.fillRect(0, 0, 250, 100); </script> <!-- canvas --> <p>canvas星空背景</p> <canvas id="starrynight"></canvas> <script> function drawing() { var c = document.getElementById('starrynight'); var ctx = c.getContext('2d'); var xMax = c.width = 700; //获取浏览器的屏幕的可用宽度 var yMax = c.height = 300; //获取浏览器的屏幕的可用高度 var hmTimes = Math.round(xMax + yMax); //获得 int 四舍五入(绘制星星数量) for (var i = 0; i <= hmTimes; i++) { var randomX = Math.floor((Math.random() * xMax) + 1); //绘制矩形的X坐标(1-xMax的随机数) var randomY = Math.floor((Math.random() * yMax) + 1); //绘制矩形的Y坐标(1-yMax的随机数) var randomSize = Math.floor((Math.random() * 2) + 1); //星星大小(1-2随机数) var randomOpacityOne = Math.floor((Math.random() * 9) + 1); //随机1-9透明度值 var randomOpacityTwo = Math.floor((Math.random() * 9) + 1); //随机1-9透明度值 var randomHue = Math.floor((Math.random() * 360) + 1); //随机1-360颜色值 //大于1添加阴影 if (randomSize > 1) { ctx.shadowBlur = Math.floor((Math.random() * 15) + 5); //阴影,随机5-15 ctx.shadowColor = "white"; //阴影颜色,白色 } ctx.fillStyle = "hsla(" + randomHue + ", 30%, 80%, ." + randomOpacityOne + randomOpacityTwo + ")"; //hsla 颜色设置(a是透明度) ctx.fillRect(randomX, randomY, randomSize, randomSize); //绘制矩形 } } drawing(); </script> <!-- canvas --> <p>canvas动画</p> <canvas id="canvas_1"></canvas> <script type="text/javascript" src="common.js"></script> <p>想继续学习的同学可以登录 <a href="http://canvas.migong.org">migong</a> 进行学习</p> <!-- 引入CodeMirror核心文件 --> <script type="text/javascript" src="codemirror.js"></script> <!-- CodeMirror支持不同语言,根据需要引入JS文件 --> <!-- 因为HTML混合语言依赖Javascript、XML、CSS语言支持,所以都要引入 --> <script type="text/javascript" src="codemirror/mode/javascript/javascript.js"></script> <script type="text/javascript" src="codemirror/mode/xml/xml.js"></script> <script type="text/javascript" src="codemirror/mode/css/css.js"></script> <script type="text/javascript" src="codemirror/mode/htmlmixed/htmlmixed.js"></script> <!-- 下面分别为显示行数、括号匹配和全屏插件 --> <script type="text/javascript" src="codemirror/addon/selection/active-line.js"></script> <script type="text/javascript" src="codemirror/addon/edit/matchbrackets.js"></script> <script type="text/javascript" src="codemirror/addon/display/fullscreen.js"></script> <script type="text/javascript"> /*$(document).ready(function() { $('pre code').each(function(i, block) { hljs.highlightBlock(block); }); });*/ (function($) { var ele = document.getElementsByTagName('textarea'); /*var arr = []; for ( var i = 0; i < ele.length; i++) { arr.push(` editor${i} = CodeMirror.fromTextArea(ele[${i}], { lineNumbers: true, // 显示行数 indentUnit: 4, // 缩进单位为4 styleActiveLine: true, // 当前行背景高亮 matchBrackets: true, // 括号匹配 mode: 'htmlmixed', // HMTL混合模式 lineWrapping: true, // 自动换行 theme: 'monokai', // 使用monokai模版 }); editor${i}.on("change", function (edt, changes) { console.log(edt.getValue()); //eval('(' + edt.getValue() + ')'); $('.joldy').remove(); var c=$("#myCanvas"); c.attr('width', c.width()); c.attr('height', c.height()); $('body').append(edt.getValue()); editor.refresh(); }); ` ) } for(var i = 0; i < arr.length; i++) { eval(arr[i]); }*/ var id1 = CodeMirror.fromTextArea(document.getElementById('joldy'), { lineNumbers: true, // 显示行数 indentUnit: 4, // 缩进单位为4 styleActiveLine: true, // 当前行背景高亮 matchBrackets: true, // 括号匹配 mode: 'htmlmixed', // HMTL混合模式 lineWrapping: true, // 自动换行 theme: 'monokai', // 使用monokai模版 }); id1.setOption("extraKeys", { // Tab键换成4个空格 Tab: function(cm) { var spaces = Array(cm.getOption("indentUnit") + 1).join(" "); cm.replaceSelection(spaces); }, // F11键切换全屏 "F11": function(cm) { cm.setOption("fullScreen", !cm.getOption("fullScreen")); }, // Esc键退出全屏 "Esc": function(cm) { if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false); } }); id1.on("change", function (edt, changes) { console.log(edt.getValue()); //eval('(' + edt.getValue() + ')'); $('.joldy').remove(); var c=$("#myCanvas"); c.attr('width', c.width()); c.attr('height', c.height()); $('body').append(edt.getValue()); editor.refresh(); }); })(jQuery); </script></body> </html>
var canvas = document.querySelector('#canvas_1'), ctx = canvas.getContext('2d'), //获取该canvas的2D绘图环境对象 particles = [], patriclesNum = 10, w = 500, h = 500, colors = ['#f35d4f', '#f36849', '#c0d988', '#6ddaf1', '#f1e85b']; canvas.width = 500;canvas.height = 500;// canvas.style.left = (window.innerWidth - 500)/2+'px'; /*if(window.innerHeight>500)canvas.style.top = (window.innerHeight - 500)/2+'px';*/ function Factory() { this.x = Math.round(Math.random() * w); // x轴随机坐标 this.y = Math.round(Math.random() * h); // y轴随机坐标 this.rad = Math.round(Math.random() * 1) + 1; this.rgba = colors[Math.round(Math.random() * 3)]; // 随机选取color颜色 this.vx = Math.round(Math.random() * 3) - 1.5; // x轴正负加减1.5 this.vy = Math.round(Math.random() * 3) - 1.5; // y轴正负加减1.5} function draw() { ctx.clearRect(0, 0, w, h); //通过clearRect来擦除画布 ctx.globalCompositeOperation = 'lighter'; for (var i = 0; i < patriclesNum; i++) { var temp = particles[i]; var factor = 1; for (var j = 0; j < patriclesNum; j++) { var temp2 = particles[j]; ctx.linewidth = 0.5; if (temp.rgba == temp2.rgba && findDistance(temp, temp2) < 50) { ctx.strokeStyle = temp.rgba; ctx.beginPath(); ctx.moveTo(temp.x, temp.y); ctx.lineTo(temp2.x, temp2.y); ctx.stroke(); factor++; } } ctx.fillStyle = temp.rgba; ctx.strokeStyle = temp.rgba; ctx.beginPath(); // 重置画笔,避免污染 ctx.arc(temp.x, temp.y, temp.rad * factor, 0, Math.PI * 2, true); ctx.fill(); // 填充 ctx.closePath(); ctx.beginPath(); // 重置画笔,避免污染 ctx.arc(temp.x, temp.y, (temp.rad + 10) * factor, 0, Math.PI * 2, true); ctx.stroke(); //描边 ctx.closePath(); temp.x += temp.vx; // x轴正负加减1.5 temp.y += temp.vy; // y轴正负加减1.5 if (temp.x > w) temp.x = 0; if (temp.x < 0) temp.x = w; if (temp.y > h) temp.y = 0; if (temp.y < 0) temp.y = h; }} function findDistance(p1, p2) { return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));} window.requestAnimFrame = (function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60); };})(); (function init() { for (var i = 0; i < patriclesNum; i++) { particles.push(new Factory); }})(); (function loop() { draw(); requestAnimFrame(loop);})();
转载于:https://my.oschina.net/joldy/blog/1574957