(function(window,document){
var cs2d = function(selector,options){
return new cs2d.fn.init(selector,options);
}; cs2d.fn = cs2d.prototype = {
init : function(selector,options){
var s = this,
// 父容器 dom
p = cs2d.is_el(selector)?selector:document.querySelector(selector),
// canvas dom
c = document.createElement('canvas'),
// 默认配置
config = {
x : 0,
y : 0,
// 元素内容+内边距 大小,不包括边框(IE下实际包括)、外边距、滚动条部分|!+[1,] 是否是ie浏览器 不考虑ie
w : p.clientWidth,
h : p.clientHeight
}; // 重置配置
cs2d.extend(config,options,true); // 添加canvas dom入父容器
p.appendChild(c); // 设置父容器属性
p.style.position = 'relative';
p.style.overflow = 'hidden'; // 设置canvas属性
c.id = 'canvas_canvas_'+(++cs2d.canvasId);
c.width = config.w; // canvas 宽
c.height = config.h; // canvas 高
c.style.position = 'absolute';
c.style.zIndex = cs2d.canvasId; // 父容器dom节点缓存
s.parentNode = p; // canvas dom节点缓存
s.canvasNode = c; // 得到 CanvasRenderingContext2D
s.pen = c.getContext('2d'); // 得到 canvas 的宽和高
s.width = c.width;
s.height = c.height; // 可以显示的对象容器
s.childList = []; /**
* 进行数据 【getter setter】
*/
// s.data = {
// width : c.width,
// height : c.height
// };
// // width
// Object.defineProperty(s,'width',{
// get : function(){
// console.log(this);
// return s.data.width;
// },
// set : function(val){
// c.width = s.data.width = val;
// }
// });
// // height
// Object.defineProperty(s,'height',{
// get : function(){
// return s.data.height;
// },
// set : function(val){
// c.height = s.data.height = val;
// }
// });
},
show : function(){
var s = this, pen = s.pen, k;
pen.clearRect(0,0,s.width,s.height);
for(k in s.childList){
s.childList[k].show(pen);
}
}
}; // 将 cs2d类的this指向cs2d原型init方法 【即: cs2d[this] = cs2d.prototype.init[this]】
cs2d.fn.init.prototype = cs2d.fn; /**
* 静态属性
*/
// canvas 的 id
cs2d.canvasId = 0; /**
*
* @Title type【静态方法】
*
* @Description 得到 变量 类型 字符串。
*
* @param {*} data 需要得到类型的变量
*
* @return {String}
*
* 'abc' return 'string'
* true return 'boolean'
* 123,NaN,Infinity return 'number'
* [] return 'array'
* {} return 'object'
* function(){} return 'function'
* new Date return 'date'
* new RegExp return 'regexp'
* Math return 'math'
* null return 'null'
* undefined return 'undefined'
*
* 变异类型
* querySelector return 'html*element'
* querySelectorAll return 'nodelist'
* document.images return 'htmlcollection'
*
*/
cs2d.type = function(data){
return Object.prototype.toString.call(data).slice(8,-1).toLowerCase();
}; /**
*
* @Title empty【静态方法】
*
* @Description 将变量值转换为布尔值。
* 规定 ''|null|undefined|NaN|0|{}|[] 都为true,其他变量均为false
*
* @param {Object} data 需要判断的变量
*
* @return {Boolean}
*
*/
cs2d.empty = function(data){
var hasProp = true, prop = ''; if ( typeof data === 'object' ) {
for ( prop in data ) {
hasProp = false; // 证明该对象存在属性
break;
}
return hasProp;
}
return !data;
}; // 是否设置【静态方法】
cs2d.isset = function(data){
var type = cs2d.type(data);
return type!=='null'&&type!=='undefined';
};
// 是否是元素【静态方法】
cs2d.is_el = function(el){
return !!(el && el.nodeType == 1);
};
// 是否是null【静态方法】
cs2d.is_null = function(data){
return cs2d.type(data)==='null';
};
// 是否是数组【静态方法】
cs2d.is_array = function(data){
return cs2d.type(data)==='array';
};
/**
*
* @Title extend【静态方法】
*
* @Description 对象合并
*
* @param {Object} des 源对象
*
* @param {Array|Object} src 对象数组
*
* @param {Boolean} override 是否重写源对象
*
* @return {object} 返回源对象的引用
*
*/
cs2d.extend = function(des, src, override){ var i = 0,l = 0,k = null; if ( src instanceof Array ) { for ( i = 0, l = src.length; i < l; i++ ) { cs2d.extend(des, src[i], override); } } else { for ( k in src ) { if ( override || !(k in des) ) { des[k] = src[k];
} } } return des; };
/**
*
* @Title each【静态方法】
*
* @Description 迭代器
*
* @param {Array} obj 待迭代对象数组
*
* @param {Function} callback 迭代回调方法
*
* @param {Object} context 环境变量,用作回调函数中this的对象
*
* @param {*} arg 传入迭代回调函数的参数
*
* @throws {jsonstringify} 缺少参数
*
*/
cs2d.each = function(obj, callback, context, arg){ var k = null for ( k in obj ) { callback.call( context||null, k, obj[k], arg ); }
}; // 动态扩展方法
cs2d.fn.extend = function(src, override){
cs2d.extend(this,src,override);
}; /**
*
* @Title requestAnimFrame
*
* @Description 做动画的方法,即requestAnimationFrame(),而且基于浏览器的层面也能更好的进行优化
*
*/
var lastTime = 0,vendors = ['ms','moz','webkit','o'],x = 0,xl = vendors.length;
for(;x<xl && !window.requestAnimationFrame;x++){
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
}
// 兼容不支持 requestAnimationFrame 的浏览器
// if(!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element){
// var currTime = new Date().getTime();
// var timeToCall = Math.max(0,16 - (currTime - lastTime));
// var id = window.setTimeout(function(){
// callback(currTime + timeToCall);
// },timeToCall);
// lastTime = currTime+timeToCall;
// return id;
// };
// if(!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id){
// window.clearTimeout(id);
// }; window.c = window.cs2d = cs2d;
})(window,document); cs2d.fn.extend({
// getPen : function(){
// var s = this, pen = s.pen;
// return pen;
// }
});

canvas的代码封装的更多相关文章

  1. Canvas学习:封装Canvas绘制基本图形API

    Canvas学习:封装Canvas绘制基本图形API Canvas Canvas学习   从前面的文章中我们了解到,通过Canvas中的CanvasRenderingContext2D对象中的属性和方 ...

  2. java代码封装与编译

    代码封装: 在这个java程序内调用另一个类 在arrayTool中把这两个函数封装起来. 编译顺序:(由下文可知应该是先进行语法检查再进行编译) 先编译ArrayTool再编译ArrayOperat ...

  3. 将PL/SQL代码封装在机灵的包中

    将代码封装在机灵的包中 http://www.oracle.com/technetwork/issue-archive/2013/13-jan/o13plsql-1872456.html 绝大多数基于 ...

  4. 【转】利用Boost.Python将C++代码封装为Python模块

    用Boost.Python将C++代码封装为Python模块 一.     基础篇 借助Boost.Python库可以将C/C++代码方便.快捷地移植到python模块当中,实现对python模块的扩 ...

  5. 将自己写的HDL代码封装成带AXI总线的IP

    将自己写的HDL代码封装成带AXI总线的IP 1.Tools->create and package IP 2.create AXI4总线的IP 3.新建block design 4.点击右键, ...

  6. MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包括新闻、图片、视频3个大模块,代码封装良好

    练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的.代码量还是有的,里面做了大量封装,总体代码整理得非常干净,这个我已经尽力整理了. 不管是文件(java.xm ...

  7. android:Android 6.0权限控制代码封装

    新建的Activity类可以继承这个Activity,这个类封装了关于新版的权限处理相关的代码 使用方法: package com.glsite.phone; import android.conte ...

  8. 【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第五篇博 ...

  9. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

随机推荐

  1. SQL Server访问MySql

    使用环境:操作系统:window7数据库:SQL Server2005.MySql5.01.在安装了SQL Server的服务器上安装MySql的ODBC驱动:下载链接:http://dev.mysq ...

  2. twitter storm源码走读之7 -- trident topology可靠性分析

    欢迎转载,转载请注明出处,徽沪一郎. 本文详细分析TridentTopology的可靠性实现, TridentTopology通过transactional spout与transactional s ...

  3. directX学习系列8 颜色融合(转)

    1, Multipass(多通道)    将一个任务划分成几个阶段,由多个pass处理不同阶段,后续pass总是处理前一个pass的结果.例如复杂的光照方程可以分成几个pass来计算.    用不同的 ...

  4. img base64

    <?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = './429 ...

  5. ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了

    ubuntu 工作区中拖动一个窗体到另一个工作区就卡住回不到桌面了 解决方法: 按 alt + 回车  键直接就返回去了

  6. Java笔试面试题二(常考问答)转

    1.说出ArrayList,Vector, LinkedList的存储性能和特性 ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允 ...

  7. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  8. 【转】PHP框架性能测试报告 - ThinkPHP 3.2.3 Laravel 5.2 Yii2.0.5

    作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情. 用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情.不 ...

  9. Jetbrains phpstorm pycharm 免费授权注册码

    通过授权服务器授权 jetbrains是一家专门做IDE的软件公司,软件也非常好用,但是授权特别贵,下面就说说免费的方式,就是使用授权服务器,地址:http://idea.qinxi1992.cn 自 ...

  10. CC2540 USB DONGLE 使用 BTool 调试BLE 说明

    一.Btool软件界面介绍 首先您要将USBDONGLE插入电脑的USB口,然后打开双击打开Btool软件,打开后如下图所示: 在安装驱动的教程中,我们已经记住了我们的USB DONGLE的串口号,在 ...