javascript - 请教下 关于轮播的问题 困惑中
迷茫
迷茫 2017-04-11 12:15:54
[JavaScript讨论组]

现在实现了ul的width跟随li的length变化,现在我想li的width用100%表示,就是用ul的width / li 的个数,怎么弄都不行,是不是卡在了一些神奇的地方,求各位dalao看下~

var Effect = (function() {

var Slider = function(o) {
    this.setting      = typeof o === 'object' ? o : {};
    this.target       = this.setting.target || 'slider';
    this.showMarkers  = this.setting.showMarkers || false;
    this.showControls = this.setting.showControls || false;
    this.timer        = null;
    this.currentTime  = null;
    this.ms           = 35;
    this.autoMs       = 5000;
    this.iTarget      = 0;
    this.nextTarget   = 0;
    this.speed        = 0;
    this.init();
    this.handleEvent();
};

Slider.prototype = {
    init: function() {
        this.obj      = document.getElementById(this.target);
        this.oUl      = this.obj.getElementsByTagName('ul')[0];
        this.aUlLis   = this.oUl.getElementsByTagName('li');
        this.width    = this.aUlLis[0].offsetWidth;
        this.number   = this.aUlLis.length;

        this.oUl.style.width = this.width * this.number + 'px';
        this.aUlLis.style.width = this.ulwidth / this.number + '%';

        if(this.showMarkers) {
            var op = document.createElement('p');
            var aLis = [];
            for(var i = 0; i < this.number; i++) {
                aLis.push('<li>'+ '<span>' + (i+1) + '<span>' + '<\/li>');
            };
            op.innerHTML = '<ol>'+ aLis.join('') +'<\/ol>';
            this.obj.appendChild(op.firstChild);
            this.aLis = this.obj.getElementsByTagName('ol')[0].getElementsByTagName('li');
            this.aLis[0].className = 'active';
            op = null;
        };

        if(this.showControls) {
            this.oPrev = document.createElement('p');
            this.oNext = document.createElement('p');
            this.oPrev.className = 'prev';
            this.oPrev.innerHTML = '&laquo;';
            this.oNext.className = 'next';
            this.oNext.innerHTML = '&raquo;';
            this.obj.appendChild(this.oPrev);
            this.obj.appendChild(this.oNext);

        };

    },

    handleEvent: function() {
        var that = this;

        this.currentTime = setInterval(function() {
            that.autoPlay();
        }, this.autoMs);

        this.addEvent(this.obj, 'mouseover', function() {
            clearInterval(that.currentTime);
        });

        this.addEvent(this.obj, 'mouseout', function() {
            that.currentTime = setInterval(function() {
                that.autoPlay();
            }, that.autoMs);
        });

        if(this.showMarkers) {
            for(var i = 0; i < this.number; i++) {
                var el = this.aLis[i];
                (function(index) {
                    that.addEvent(el, 'mouseover', function() {
                        that.goTime(index);
                    });
                })(i);
            };
        };

        if(this.showControls) {
            this.addEvent(this.oPrev, 'click', function() {
                that.fnPrev();
            });
            this.addEvent(this.oNext, 'click', function() {
                that.autoPlay();
            });
        };

    },

    addEvent: function(el, type, fn) {
        if(window.addEventListener) {
            el.addEventListener(type, fn, false);
        }
        else if(window.attachEvent) {
            el.attachEvent('on' + type, fn);
        };
    },

    fnPrev: function() {
        this.nextTarget--;
        if(this.nextTarget < 0) {
            this.nextTarget = this.number - 1;
        };
        this.goTime(this.nextTarget);
    },

    autoPlay: function() {
        this.nextTarget++;
        if(this.nextTarget >= this.number) {
            this.nextTarget = 0;
        };
        this.goTime(this.nextTarget);
    },

    goTime: function(index) {
        var that = this;

        if(this.showMarkers) {
            for(var i = 0; i < this.number; i++) {
                i == index ? this.aLis[i].className = 'active' : this.aLis[i].className = '';
            };
        };

        this.iTarget = -index * this.width;
        if(this.timer) {
            clearInterval(this.timer);
        };
        this.timer = setInterval(function() {
            that.doMove(that.iTarget);
        }, this.ms);
    },

    doMove: function(target) {
        this.oUl.style.left = this.speed + 'px';
        this.speed += (target - this.oUl.offsetLeft) / 3;
        if(Math.abs(target - this.oUl.offsetLeft) === 0) {
            this.oUl.style.left = target + 'px';
            clearInterval(this.timer);
            this.timer = null;
        };
    }

};

return {

    slider: function(o) {
        var tt = new Slider(o);
    }
};

})();

// 调用语句
Effect.slider({

'targetElement': 'slider',
'showMarkers': true,
'showControls': true

});

代码有点多,辛苦各位大佬了~~~

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
大家讲道理

光这么一个init看不出问题

阿神

ul宽度=li宽度,ul {overflow:hidden}

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号