第一个JS插件——轮播图

开发插件,本人这里采用的是模块化开发方式(Module),确保内存中只有一个对象引用,这样可以节省内存,也可以使代码简洁高效。

// 这里采用()()这种自调用函数,形成闭包,内部函数是一个匿名函数,防止插件用户定义函数与插件冲突。
(function(){
	"use strict";
	var _options = {
			name: '白云',
			age: '18'
	};
	var sliderPlugin = {
		
		myFunc: function(){
			console.log('黑土');
			return this;	
		},
		mySec: function(str = _options.name){
			console.log(str);
			return this;
		}
	}
	this.sliderPlugin = sliderPlugin;	
})();
//这种方式的调用方式就是window.sliderPlugin.myFunc();

还有一种方式,是要考虑不同环境:

(function(definition){
	"use strict";
	
	if(typeof exports === "object" && typeof module === "object"){
	//如果是 commonJS环境里面
        module.exports = definition();
	}else if(typeof define === "function" && define.amd){
	// requireJS环境里面
        define(definition);
	}else if(typeof window !== "undefined" || typeof self !== "undefined"){
	// 正常window环境里面
		var global = typeof window !== "undefined" ? window : self;
        global.sliderPlugin= definition();
        
	}else{
		throw new Error("This environment was not anticipated by plugin,Please file a bug.")
    }
    
	})(function(){
		function sliderPlugin(){
            // 返回一些参数和api
			return {
                name: 'image silder plugin',
				createEelement: createEelement
			};
        }
        // 判断是否是HTMLElement
        function isHtmlControl(obj) { 
            var d = document.createElement("div");
            try{
                d.appendChild(obj.cloneNode(true));
                return obj.nodeType==1 ? true : false;
            }catch(e){
                return obj == window || obj == document;
            }
        }
        // 创建dom
		function createEelement(options){
            if(isHtmlControl(options.wrapper)){
                createStyle();

                // 创建轮播图骨架
                var dom = '<ul class="image-slider">',
                    dotDom = `<div class="dot">`,
                    imageArray = options.imageArray,
                    wrapper = options.wrapper,
                    time = options.time;
                if((imageArray instanceof Array) && imageArray.length > 0 ){
                    length = imageArray.length;
                    for(var i = 0; i < length; i++){
                        dom += `<li class="image-slider-item">
                            <img src="` + imageArray[i] + `">
                            </li>`;
                        dotDom += `<span class="dot-item"></span>`;
                    }
                    //将第一张图片多插入一次
                    dom += `<li class="image-slider-item">
                            <img src="` + imageArray[0] + `">
                            </li>`
                    dom += '</ul>';
                    dotDom += '</div>';

                    wrapper.innerHTML = dom + dotDom;
                    wrapper.style = "position: relative;overflow:hidden;";//?此时如果外面wrapper没有设置高度,这里面的就是0。
                    
                    var doc = document,
                        domUL = doc.getElementsByTagName('ul')[0],
                        domLi = doc.getElementsByTagName('li'),
                        domImg = doc.getElementsByTagName('img'),
                        domDot = doc.getElementsByTagName('span'),
                        _width = wrapper.offsetWidth,
                        _height =  wrapper.offsetHeight;

                    // 设置下面点的样式,默认选中第一个
                    domDot[0].style.background = '#e0c6c6';
                
                

                    // 自动轮播,每隔2秒播放一张图
                    var index = 0, moveDistance = _width;
                    var timer = setInterval(function(){
                        autoMove(domUL, length);
                    },time || '2000')
                    
                    // 事件冒泡,滑动的是li
                    wrapper.onmouseenter = function(){
                        // 当鼠标放上去的时候,清除自动滚动(也就是清除计时器)
                        clearInterval(timer);
                    }
                    
                    wrapper.onmouseleave = function(){
                        timer = setInterval(function(){
                            autoMove(domUL,length);
                        },time || '2000')
                    }
                }else{
                    throw new Error('请提供图片数组!');
                }
                // 图片开始轮播
                function autoMove(element,length){
                    if(isHtmlControl(element)){
                        var json = { left: element.offsetLeft - moveDistance };
                        index++;
                        
                        // 移动图片
                        move(element,json,function(){
                            if(index == length){
                                // 当翻到最后一张之后,循环重新来
                                index = 0;
                                element.style.left = '0px';
                            }
                            // 还原其他圆点的样式
                            // 改变下面的圆点样式
                            for(var d of domDot){
                                d.style.background = '#959090';
                            }
                            domDot[index].style.background = '#e0c6c6';
                        });
                    }
                }
                // 每张图片具体移动方式
                function move(elem, json,callback){
                    var speed ,cur;// speed表示移动的步长,cur表示现在距离左边的距离
                    elem.timer = setInterval(function(){
                        var bStop = true;
                        for(var prop in json){
                            cur = parseInt(getStyle(elem, prop));
                            // 滑动速度
                            speed = (json[prop]-cur)/7;
                            speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                            elem.style[prop] = cur+ speed + 'px';
                            json[prop] !== cur ? bStop = false : bStop = true;
                            if(bStop){
                                // 一张图片翻过去之后触发
                                clearInterval(elem.timer);
                                typeof callback == 'function'? callback() : '';
                            }
                        }
                    },30);
                }
                // 返回当前元素的style样式
                function getStyle(elem, prop) {
                    if(elem.currentStyle){
                        return elem.currentStyle[prop];
                    }else{
                        return window.getComputedStyle(elem, null)[prop];
                    }
                }
                // 创建样式表
                function createStyle(){
                    var doc = document, style = doc.createElement('style');
                    style.type = 'text/css';
                    style.innerHTML = `*{
                        margin: 0;
                        padding: 0;
                    }
                    .image-slider{
                        display: table;
                        word-break: keep-all;
                        white-space:nowrap;
                        height: 100%;
                        list-style: none;
                        position: relative;
                    }
                    .image-slider-item,.image-slider-item img{
                        width: 100%;
                    }
                    .image-slider-item{
                        display: inline-block;
                    }
                    .dot{
                        position: absolute;
                        left: 0;
                        bottom: 0;
                        width: 100%;
                        height: 20px;
                        text-align: center;
                    }
                    .dot-item{
                        display: inline-block;
                        width:  8px;
                        height:  8px;
                        background: #959090;
                        border-radius: 100%;
                        margin: 5px;
                    }`;
                    doc.getElementsByTagName('head')[0].appendChild(style);
                }
            }else {
                throw new Error('error!HTMLElement is need!');
            }
        }
		return sliderPlugin();
});


用法如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>测试js</title>
    <script type="text/javascript" src="./sliderPlugin.js"></script>
</head>
<body>
    <div class="wrapper"></div>
    <script type="text/javascript">
        var imageArray = ['./img/1.jpg','./img/2.jpg','./img/3.jpg'];
        if(window.sliderPlugin){
            var doc = document, wrapper = doc.querySelector('.wrapper');
            sliderPlugin.createEelement({wrapper:wrapper,imageArray:imageArray});
        }
        
	</script>
</body>
</html>

github和npm上面都有,可自行下载安装。
github上面js-slider-plugin

npm上面的js-slider-plugin

猜你喜欢

转载自blog.csdn.net/m0_37792830/article/details/84937113