zoukankan      html  css  js  c++  java
  • 关于JavaScript组件化的探索

    Loaders

    先放出项目地址:https://github.com/j20041426/Loaders

    这是一个可以动态选择加载动画的样式和颜色的插件。这个项目仅仅是作为对js组件化的一个探索,不太建议用在生产环境中

    原理

    通过动态渲染页面元素的方式,实现加载动画的样式选择;再通过less的客户端插件,动态改变css样式中的背景颜色,从而实现加载动画的颜色选择。

    讲解

    1. 结构

    var Loader = (function(){
    
    	var _instance;	//私有属性,对外界隐藏
    
    	var LoadingFun = function(config){
    		...
    	}
    	
    	LoadingFun.prototype.show = function(){
    		...
    	}
    	
    	LoadingFun.prototype.hide = function(){
    		...
    	}
    	
    	return LoadingFun;
    })();
    

    这是这个插件的大体结构。在IIFE(立即执行函数)中,返回一个函数结构LoadingFun,并且在原型链中增加show和hide两个方法,这样对外界就只暴露了Loader这个构造函数,以及show和hide这两个成员函数。而_instance这个属性,就作为私有成员存在,而不被外界所知。

    2. 构造方法

    var LoadingFun = function(config){
    	_adaptParams(config);				//参数的适配器
    	_init();							//初始化动画
    	_render();							//渲染动画到页面中
    	_instance.style.display = "none";	//默认隐藏
    }
    
    2.1 适配器

    其中_adaptParams这个函数的作用是适配参数。不管调用者是否传递参数,或者以随机顺序传递参数,都可以让loaders正确接收到相应的参数。

    var _config = {				//默认参数
    	type : "ball-pulse",
    	color : "#fff"
    }
    var _adaptParams = function(config){	//适配器
    	if(config){
    		for(var param in _config){
    			if(config[param]){
    				_config[param] = config[param];
    			}
    		}
    	}
    }
    
    2.2 初始化动画

    这个函数的作用是动态加载需要的less文件,并设置less文件中的全局参数@color为参数中的颜色值,然后动态引用less客户端插件进行less文件的预编译,最终得到需要的css样式代码。

    var _init = function(){
    	var head = document.getElementsByTagName('HEAD').item(0);
    	var style = document.createElement('link');
    	style.href = 'css/loaders.less';
    	style.rel = 'stylesheet/less';
    	style.type = 'text/css';
    	head.appendChild(style);
    	var options = document.createElement('script');
    	options.innerHTML = "less = {globalVars:{color:'" + _config.color + "'}};";
    	head.appendChild(options);
    	var script = document.createElement('script');
    	script.type = 'text/javascript';
    	script.src = 'js/less.min.js';
    	head.appendChild(script);
    }
    

    2.3 渲染

    根据不同加载动画的DOM结构,动态生成对应的DOM元素,然后append到body元素中。

    var divs= {
    	"ball-pulse" : 3,
    	...
    };
    
    var loader = document.createElement("div");
    loader.className = "loader";
    var loader_inner = document.createElement("div");
    loader_inner.className = "loader-inner " + _config.type;
    for(var i = 0; i < divs[_config.type]; i++){
    	var div = document.createElement("div");
    	loader_inner.appendChild(div);
    }
    loader.appendChild(loader_inner);
    document.body.appendChild(loader);
    _instance = loader;		//将渲染的DOM元素存到私有成员_instance中,便于后续的显示控制
    

    3. 显示控制

    因为渲染时得到了加载动画的DOM对象_instance,所以可以通过_instance来控制元素的显示与隐藏。

    _instance.style.display = "flex" 这里设置成flex是因为加载动画是用flexbox来控制居中显示的。

    return this 返回this对象可以实现链式调用。

    LoadingFun.prototype.show = function(){
    	_instance.style.display = "flex";
    	return this;
    }
    
    LoadingFun.prototype.hide = function(){
    	_instance.style.display = "none";
    	return this;
    }
    

    4. 结语

    由于在加载和渲染动画时,使用了less的预编译功能,所以加载会有时间损耗。不太建议用在生产环境中,如果一定要使用的话,尽量在页面首次加载时,调用var loaders = new Loaders(),然后在需要显示和隐藏时,再分别调用loaders.show()loaders.hide()

    由于自己在前端方面也是个新手,欢迎大家的指正。

  • 相关阅读:
    redis你要知道的事
    Nginx七层负载均衡的几种调度算法
    JQuery的父、子、兄弟节点选择器
    laravel通用和万能路由
    jquery竖向企业组织结构图
    phpexcel功能操作
    animatext.js使用介绍
    Centos firewalld开放端口
    获取微信accesstoken并文件缓存方式
    css处理文字不换行、换行截断、溢出省略号
  • 原文地址:https://www.cnblogs.com/MrEgg1013/p/7016505.html
Copyright © 2011-2022 走看看