示例基础代码
用canvas画一个9*9的表格
(function(global) { 'use strict'; function _extend(obj1, obj2) { for (var i in obj2) { if (obj2.hasOwnProperty(i)) { obj1[i] = obj2[i]; } } } function GridFunny(options) { this.grid = {}; this.gridOfX = {}; this.gridOfY = {}; this.settings = { container: document.body, gridColor: "#ccc", // 格子的颜色 gridNum: 9, // 格子的数量 canvasSize: { width: 500, height: 500 }, // canvas的尺寸 generateGridKey: function(x, y) { return [x, y].join("-"); }, // 创建每个格子在grid对象中的key onDraw: function() { }, // 提供绘画钩子方法,方便定制绘画 fillGrid: function(keyX, keyY, pixelX, pixelY) { }, // 填充每个格子内容的方法 contextType: "2d", // canvas文本类型(2d或者3d) border: 1 // 表格的边框大小 }; _extend(this.settings, options || {}); return this; } GridFunny.prototype.start = function() { this.canvas = this._initCanvas(); this.context = this.canvas.getContext(this.settings.contextType); this._drawBoard(); } GridFunny.prototype._initCanvas = function() { var canvas = document.createElement("canvas"); canvas.width = this.settings.canvasSize.width; canvas.height = this.settings.canvasSize.height; this.settings.container.appendChild(canvas); return canvas; } GridFunny.prototype._drawBoard = function() { var width = this.settings.canvasSize.width, height = this.settings.canvasSize.height, num = this.settings.gridNum, border = this.settings.border, halfBorder = border / 2, context = this.context, color = this.settings.gridColor, pixelX = (width - border) / (num + 2), pixelY = (height - border) / (num + 2), rectXSize = pixelX * (num + 1), rectYSize = pixelY * (num + 1); context.clearRect(0, 0, width, height); context.beginPath(); /* 垂直线 */ for (var i = 0, x = pixelX; x <= rectXSize; x += pixelX) { i++; var beginCoordinate = halfBorder + x; if (i <= num) this.gridOfX[i] = beginCoordinate; context.moveTo(beginCoordinate, pixelX); context.lineTo(beginCoordinate, rectXSize); } /* 水平线 */ for (var j = 0, y = pixelY; y <= rectYSize; y += pixelY) { j++; var endCoordinate = halfBorder + y; if (j <= num) this.gridOfY[j] = endCoordinate; context.moveTo(pixelY, endCoordinate); context.lineTo(rectYSize, endCoordinate); } this._initGridCoordinate(pixelX, pixelY); context.closePath(); this.settings.onDraw.call(this); /* 开始画 */ context.strokeStyle = color; context.stroke(); } GridFunny.prototype._initGridCoordinate = function(pixelX, pixelY) { var context = this.context, grid = this.grid, gridOfX = this.gridOfX, gridOfY = this.gridOfY; for (var keyX in gridOfX) { for (var keyY in gridOfY) { // 记录每个格子的坐标 var key = this.settings.generateGridKey(keyX, keyY); grid[key] = [gridOfX[keyX], gridOfY[keyY]]; this.settings.fillGrid.call(this, keyX, keyY, pixelX, pixelY); } } } // Export Pig into the global scope. if (typeof define === 'function' && define.amd) { define(function() {return GridFunny;}); } else if (typeof module !== 'undefined' && module.exports) { module.exports = GridFunny; } else { global.GridFunny = GridFunny; } }(this)); var grid = new GridFunny({ gridColor: "green" }); grid.start();
主要用到的方法:
- clearRect(x, y, width, height):清空所选矩形块
- beginPath:开始绘制路径
- moveTo(x, y):将画笔移到坐标为(x, y)的地方
- lineTo(x, y):画一条到坐标(x, y)为止的线
- closePath:结束绘制路径
- strokeStyle:给画笔添加颜色(通俗的说法是给画笔加所给颜色的墨水),示例中默认是灰色#ccc
- stroke:根据绘制的路径以及定义的颜色,绘制图画