canvas的代码封装

Posted lewo的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了canvas的代码封装相关的知识,希望对你有一定的参考价值。

(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的代码封装的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

canvas的代码封装

回归 | js实用代码片段的封装与总结(持续更新中...)

自己定义View时,用到Paint Canvas的一些温故,简单的帧动画(动画一 ,&quot;掏粪男孩Gif&quot;顺便再提提onWindowFocusChanged)(代码片段

VsCode 代码片段-提升研发效率

常用Javascript代码片段集锦