原生js實現輪播圖生成器

DIV原型添加輪播圖生成器方法,固定寬高的div調用該方法自動生成一個封裝好的輪播圖框架,只須要傳入輪播圖有效圖片路徑的數組便可。
注意:該div必須有寬高!!!
使用:
將下面js代碼放入一個js文件,使用的時候引入便可。
例如:
var odiv = document.getElementById('#divId');
odiv.createTurnPage([''1.png,'2.png']);
 
/*原生js實現輪播圖生成器 */
HTMLDivElement.prototype.createTurnPage = function (imageArray) {
    if (!imageArray{
        return;
    }
    /* 輪播圖展現圖片數量 */
    var sliderNum = imageArray.length;
    /* 輪播圖展現寬度 */
    var sliderWidth = this.offsetWidth;
    /* 輪播圖展現高度 */
    var sliderHeight = this.offsetHeight;
    /* 輪播圖按鈕寬高 */
    var btnLen = 40;
    /* 輪播圖圓點寬高 */
    var dotLen = 10;
    /* 建立dom及樣式 start */
    /* 給該div添加所需屬性 */
    this.style.position = "relative";
    this.style.overflow = "hidden";
    /* div裏面建立ul */
    var newUl = document.createElement('ul');
    newUl.style.position = "absolute";
    newUl.style.width = (sliderNum + 1* sliderWidth + 'px';
    newUl.style.height = sliderHeight + 'px';
    this.appendChild(newUl);
    /* ul裏面建立li */
    for (var i = 0; i < sliderNum + 1; i++{
        var newLi = document.createElement('li');
        newLi.style.width = sliderWidth + 'px';
        newLi.style.height = sliderHeight + 'px';
        newLi.style.cssFloat = 'left';
        newUl.appendChild(newLi);
        /* li裏面建立img */
        var newImg = document.createElement('img');
        newImg.style.width = '100%';
        newImg.style.height = '100%';
        if (i == sliderNum{
            newImg.src = imageArray[0];
        } else {
            newImg.src = imageArray[i];
        }
        newLi.appendChild(newImg);
    }
    /* div裏面建立左右按鈕 */
    for (var i = 0; i < 2; i++{
        var newBtn = document.createElement('div');
        newBtn.style.width = btnLen + 'px';
        newBtn.style.height = btnLen + 'px';
        newBtn.style.lineHeight = btnLen + 'px';
        newBtn.style.color = '#ffffff';
        newBtn.style.backgroundColor = '#000000';
        newBtn.style.opacity = 0.2;
        newBtn.style.textAlign = 'center';
        newBtn.style.top = '50%';
        newBtn.style.marginTop = -btnLen/2 + 'px';
        newBtn.style.cursor = 'pointer';
        newBtn.style.position = 'absolute';
        if (i == 0{
            newBtn.innerText = '<';
            newBtn.style.left = 10 + 'px';
            newBtn.className = 'turnPageLeftBtn';
        } else {
            newBtn.innerText = '>';
            newBtn.style.right = 10 + 'px';
            newBtn.className = 'turnPageRightBtn';
        }
        this.appendChild(newBtn);
    }
    /* 鼠標移入div 按鈕背景色變深 */
    var leftBtnDiv = this.getEleByClassName('turnPageLeftBtn')[0];
    var rightBtnDiv = this.getEleByClassName('turnPageRightBtn')[0];
    this.onmouseover = function () {
        leftBtnDiv.style.opacity = 0.7;
        rightBtnDiv.style.opacity = 0.7;
    }
    /* 鼠標移出div 按鈕背景色變深 */
    this.onmouseout = function () {
        leftBtnDiv.style.opacity = 0.2;
        rightBtnDiv.style.opacity = 0.2;
    }
    /* 建立變色小點 */
    var newDotDiv = document.createElement('div');
    newDotDiv.style.width = '100%';
    newDotDiv.style.position = 'absolute';
    newDotDiv.style.bottom = 10 + 'px';
    newDotDiv.style.textAlign = 'center';
    this.appendChild(newDotDiv);
    for (var i = 0; i < sliderNum; i++{
        var newSpan = document.createElement('span');
        newSpan.style.display = "inline-block";
        newSpan.style.backgroundColor = "#ffffff";
        newSpan.style.width = dotLen + 'px';
        newSpan.style.height = dotLen + 'px';
        newSpan.style.borderRadius = '50%';
        newSpan.style.cursor = 'pointer';
        newSpan.style.marginLeft = 5 + 'px';
        newSpan.style.marginRight = 5 + 'px';
        if (i == 0{
            newSpan.style.backgroundColor = "#f40";
        } else {
            newSpan.style.backgroundColor = "#ffffff";
        }
        newDotDiv.appendChild(newSpan);
    }
    /* 建立dom及樣式 end */
    /* 建立事件 start */
    var sliderUl = this.getElementsByTagName('ul')[0];
    /* 自動輪播定時器 */
    var timer = setInterval(function () {
        sliderMove(sliderUl);
    }, 1000);
    /* 左側按鈕點擊切換輪播圖事件 */
    leftBtnDiv.onclick = function () {
        sliderMove(sliderUl, 'left');
    }
    /* 右側按鈕點擊切換輪播圖事件 */
    rightBtnDiv.onclick = function () {
        sliderMove(sliderUl, 'right');
    }
    /* 變色小點點擊切換輪播圖事件 */
    var sliderSpanArray = newDotDiv.getElementsByTagName('span');
    for (var i = 0; i < sliderSpanArray.length; i++{
        (function(index){
            sliderSpanArray[index].onclick = function () {
                lock = true;
                clearInterval(timer);
                startMove(sliderUl, { left: -sliderWidth * index }, function () {
                    timer = setInterval(function () {
                        sliderMove(sliderUl);
                    }, 1500);
                    lock = false;
                    sliderIndex = index;
                    changeIndex(sliderIndex);
                })
            }
        }(i))
    }
    /*輪播移動事件 direction left:向左輪播 right:向右輪播  默認:向左*/
    var lock = false;
    var sliderIndex = 0;
    function sliderMove(dom, direction) {
        // debugger;
        if (!lock{
            lock = true;
            clearInterval(timer);
            if (!direction || direction == 'left'{
                sliderIndex++;
                startMove(dom, { left: dom.offsetLeft - sliderWidth }, function () {
                    if (dom.offsetLeft == -sliderNum * sliderWidth{
                        dom.style.left = '0px';
                        sliderIndex = 0;
                    }
                    timer = setInterval(function () {
                        sliderMove(sliderUl);
                    }, 1500);
                    lock = false;
                    changeIndex(sliderIndex);
                })
            } else if (direction == 'right'{
                if (dom.offsetLeft == 0{
                    dom.style.left = -sliderNum * sliderWidth + 'px';
                    sliderIndex = sliderNum;
                }
                sliderIndex--;
                startMove(dom, { left: dom.offsetLeft + sliderWidth }, function () {
                    timer = setInterval(function () {
                        sliderMove(sliderUl);
                    }, 1500);
                    lock = false;
                    changeIndex(sliderIndex);
                })
            }
        }
    }
    /* 改變變色小點方法 */
    function changeIndex(index) {
        for (var i = 0; i < sliderSpanArray.length; i++{
            sliderSpanArray[i].style.backgroundColor = "#ffffff";
        }
        sliderSpanArray[index].style.backgroundColor = "#f40";
    }
    /* 建立事件 end */

    /* 多物體不一樣值運動 */
    function startMove(dom, attrObj, callback) {
        clearInterval(dom.timer);
        var speed = null;
        var currentValue = null;
        dom.timer = setInterval(function () {
            var bStop = true;
            for (attr in attrObj{
                if (attr == 'opacity'{
                    currentValue = parseFloat(getStyle(dom, attr)) * 100;
                } else {
                    currentValue = parseInt(getStyle(dom, attr));
                }
                speed = (attrObj[attr- currentValue/ 5;
                speed = speed > 0 ? Math.ceil(speed: Math.floor(speed);
                if (attr == 'opacity'{
                    dom.style[attr= (currentValue + speed/ 100;
                } else {
                    dom.style[attr= currentValue + speed + 'px';
                }
                if (currentValue != attrObj[attr]) {
                    bStop = false;
                }
            }
            if (bStop{
                clearInterval(dom.timer);
                if (typeof (callback== "function"{
                    callback();
                }
            }
        }, 30);
    }
    /* 獲取樣式 */
    function getStyle(dom, attr) {
        if (window.getComputedStyle{
            return window.getComputedStyle(dom, null)[attr];
        } else {
            return dom.currentStyle[attr];
        }
    }
}
/* 封裝兼容性根據類名獲取dom */
Element.prototype.getEleByClassName = Document.prototype.getEleByClassName = function (_className) {
    var tagArray = [].slice.call(this.getElementsByTagName('*'), 0);
    var resultArray = [];
    function trimSpace(str) {
        var reg = /\s+/g;
        return str.replace(reg, ' ');
    }
    // debugger;
    tagArray.forEach(element => {
        var targetStr = trimSpace(element.className).trim();
        var strArray = targetStr.split(' ');
        console.log(strArray);
        strArray.forEach(element1 => {
            if (element1 == _className{
                resultArray.push(element);
                return false;
            }
        })
    });
    return resultArray;
}
相關文章
相關標籤/搜索