zoukankan      html  css  js  c++  java
  • yali项目的slider

    // 调用        
    var s41 = new slider({
        target : '#slider411',
        titleActiveClass : 'j-active',
        itemActiveClass : 'j-active',
        btn : '.sbtn',
    });
    
    // 声明方法
    var slider = function(element){
        if(!element.target)return false;
        // 判断设备是否支持touch事件
        var me = this;
        this.touch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
        this.target = element.target;
        this.parent = element.parent||false;
        this.slider = document.querySelector(this.target) || document.getElementById('slider');
        this.count = $(element.target).children().size();
        this.titleId = element.titleId || !1;            
        this.next = element.nextClass,
        this.prev = element.prevClass,
        this.animateClass = element.animateClass || 'f-anim';
        this.scaleAnimateClass = element.scaleAnimateClass || 'f-slow',
        this.control = element.control,
        this.titleActiveClass = element.titleActiveClass||'j-active',
        this.itemActiveClass = element.itemActiveClass||'j-active',
        this.scale = element.scale-1;
        this.btn = element.btn;
        this.sImg = element.sImg; 
        this.page = element.page;
        this.sImgActiveClass = element.sImgActiveClass||'on';
        console.log(this.target+', '+this.titleId+', '+this.scrollWidth);
        //console.log(this.target);
        // 点击缩略图滚动对象
        (function(){
            var t = me.sImg;
            var activeClass = 'on';
            
            if(!($(t).size()>0))return false;                
            var c = $(t).children();
            c.eq(0).addClass(activeClass);
            c.on('click', function(){
                var i = $(this).index();
                me.scrollTo(i);
                c.removeClass(activeClass).eq(i).addClass(activeClass);
            });        
        })();
        
        this.first=true;
        this.last=false;
        var item = $(element.target).children().eq(0);
        this.itemWidth = item.width()+parseInt(item.css('marginLeft'))+parseInt(item.css('marginRight'))+parseInt(item.css('paddingLeft'))+parseInt(item.css('paddingRight'))+parseInt(item.css('border-left-width'))+parseInt(item.css('border-right-width'));
        
        item.addClass(this.itemActiveClass);
        $(element.target).children().eq(1).addClass('j-next');
        $(element.target).width(this.itemWidth*this.count);
        var titlechildren = $('#'+this.titleId).children();
        titlechildren.eq(0).addClass(me.titleActiveClass);
        this.scrollWidth = this.itemWidth || element.scrollwidth || window.innerWidth;
        this.scrollPage = function(p){            // 缩略图翻页
            var l = p*me.page; // itemCount
            var item = $(me.sImg).children().eq(0);
            var w = item.width()+parseInt(item.css('marginLeft'))+parseInt(item.css('marginRight'))+parseInt(item.css('paddingLeft'))+parseInt(item.css('paddingRight'))+parseInt(item.css('border-left-width'))+parseInt(item.css('border-right-width'))
            $(me.sImg).parent().animate({scrollLeft: l*w},500);
            console.log(w+', '+l+', ');
        };
    
    
        this.scrollTo = function(page,sliderTips){
            titlechildren.removeClass(me.titleActiveClass);
            var i = page;
            this.events.index = i;
            titlechildren.eq(i).addClass(me.titleActiveClass);
            $(element.target).addClass(me.animateClass);
            this.slider.style.webkitTransform = "translate3d(" + (-i * this.scrollWidth ) + "px,0 ,0)";
            me.class();
            // window.lacation.href参数导致滑动时执行
            me.first=false;
            me.last=false;
                            
            if(sliderTips){
                if(page==0){
                    me.first=true;
                    me.last=false;
                }else if(page==me.count-1){
                    me.first=false;
                    me.last=true;                        
                };
            };                
            if($(me.sImg).size()>0){ // 判断缩略图翻页[0]
                var i = me.events.index*1+1;
                var p = Math.ceil(i/me.page)-1;
                me.scrollPage(p);
                $(me.sImg).children().removeClass(me.sImgActiveClass).eq(me.events.index).addClass(me.sImgActiveClass);
            };    
            
            
            // 缩放结束
            if(me.scale>0){
                var active = '.'+me.itemActiveClass;                        
                $(active, me.target).css({'webkitTransform':'scale('+(me.scale+1)+')'});
                $('.j-prev', me.target).add('.j-next', me.target).css('webkitTransform', 'scale(1)');
                $(me.target).children().addClass('f-slow');                        
            };
        };
        
        // 标题跳转事件
        if(this.titleId){
            var d = document.querySelector("#"+this.titleId);
            d.onclick = function(event){
                me.scrollTo($(event.target).index());
            };
        };
        
        var first, last, started=false;
        
        // 事件
        this.events = {
            index: 0,                                       // 显示元素的索引                
            slider: me.slider,                            // this为slider对象
            icons: document.getElementById(me.titleId),
            icon:  document.querySelectorAll('#'+me.titleId+' *'),
            handleEvent: function(event) {
                // this指events对象
                var self = this;
                if (event.type == 'touchstart') {
                    self.start(event);
                } else if(event.type == 'touchmove') {
                    self.move(event);
                } else if(event.type == 'touchend') {
                    self.end(event);
                }
            },
    
            // 滑动开始
            start: function(event) {
                started = true;
                //console.log('start '+me.first+', '+me.last);
                //event.preventDefault();
                if (event.touches.length > 1 || event.scale && event.scale !== 1) return;
                
                var touch = event.touches[0];                // touches数组对象获得屏幕上所有的touch,取第一个touch
                startPos = {                                 // 取第一个touch的坐标值
                    x: touch.pageX,
                    y: touch.pageY,
                    time: +new Date
                };
                endPos = {
                    x: touch.pageX - startPos.x,
                    y: touch.pageY - startPos.y
                };
                
                
            
                
                // 缩放开始                    
                if(me.scale) $(me.target).children().removeClass(me.scaleAnimateClass);
                
                this.slider.addEventListener('touchmove', this, false);
                this.slider.addEventListener('touchend', this, false);
    
                //自定义touchstart事件
                if(element.start){
                    element.start.call(me, event);
                };
            },
    
            // 移动
            move: function(event) {
                // 当屏幕有多个touch或者页面被缩放过,就不执行move操作
                if (event.touches.length > 1 || event.scale && event.scale !== 1) return;
                var touch = event.touches[0];
                endPos = {
                    x: touch.pageX - startPos.x,
                    y: touch.pageY - startPos.y
                };
                
                var o = $(event.target).closest('._target'); // czy
                if(o.length){
                    if(o.hasClass('_left')){ // 锁定左
                        if(endPos.x>0){ // 往右
                            event.preventDefault(); // 执行动画
                        }else if(endPos.x<0){ // 往左
                            event.stopPropagation(); // 执行原生滚动
                            return ;
                        }
                    }else if(o.hasClass('_right')){ // 锁定右
                        if(endPos.x>0){ // 往右
                            event.stopPropagation(); // 执行原生滚动
                            return ;
                        }else if(endPos.x<0){ // 往左
                            event.preventDefault(); // 执行动画
                        }
                    }else{
                        // 中间
                        event.stopPropagation(); // 执行原生滚动
                        return ;
                    }
                }
                
                // 系统滚动条事件
                /*
                    var sx =  $(event.target).closest('.scrollx');
                    var sy =  $(event.target).closest('.scrolly');                    
                    if((sx.size()>0)||(sy.size()>0)){
                        me.parent = true;
                        if(sx.size()>0){
                                me.first = false;
                                me.last = false;
                                // 判断水平滚动条是否first或next                                
                                var x={
                                    pl : parseInt(sx.css('paddingLeft')),
                                    pr : parseInt(sx.css('paddingRight')),
                                    pw : sx.width()*1,
                                    l : Math.abs(sx.children().position().left),
                                    w : sx.children().width()*1,
                                    r : parseInt(sx.children().css('paddingLeft')),
                                };
                                if(x.pl==x.l&&endPos.x>0){
                                    me.first = true;
                                    me.last = false;
                                }else if(((x.l+x.pr+x.pl+x.pw)-(x.w+x.r)==0)&&endPos.x<0){                                        
                                    me.first = false;
                                    me.last = true;
                                }else{
                                    me.first = false;
                                    me.last = false;
                                    return false;
                                };
                            if(me.first||me.last){
                                event.preventDefault();
                            }else{
                                event.stopPropagation();
                                return false;
                            };
                            
                        }else if(sy.size()>0){
                            // 垂直滚动事件                                
                            if(scrollY || (!scrollX && Math.abs(endPos.y)>=Math.abs(endPos.x))){
                                // 阻止冒泡
                                event.stopPropagation();
                                scrollY = true;
                                scrollX = false;
                                return false;
                            }else if(scrollX || Math.abs(endPos.y)<Math.abs(endPos.x)){
                                scrollY = false;
                                scrollX = true;
                            };
                        };
                    }else{
                            
                        console.log('阻止默认');
                        event.preventDefault();
                    };
                        
            
                */
                
                if(me.parent && ((me.first && endPos.x>0) || (me.last && endPos.x<0))){
                    event.preventDefault();
                }else{
                    event.stopPropagation()
                };
                
                // 跟随变形
                if(me.scale>0){
                    var active = '.'+me.itemActiveClass;
                    var t = $(active, me.target).css('webkitTransform') || $(active, me.target).css('transform');
                    var scale = t.substring(t.indexOf('(')+1,t.indexOf(','))-1;
                    var n = me.scale/(1024/Math.abs(endPos.x))+1;
                    var a = me.scale-(me.scale/(1024/Math.abs(endPos.x)))+1;
                    //console.log('a '+a);
                    if(endPos.x<0){                            
                        $('.j-next', me.target).css('webkitTransform','scale('+n+')');
                        $(active, me.target).css('webkitTransform','scale('+a+')');
                    }else if(endPos.x>0){
                        $('.j-prev', me.target).css('webkitTransform','scale('+n+')');                            
                        $(active, me.target).css('webkitTransform','scale('+a+')');
                    };
                };
    
                // 执行操作,使元素移动
                $(this.slider).removeClass(me.animateClass);
                this.slider.style.webkitTransform = "translate3d(" + (-this.index * me.scrollWidth + endPos.x/($(window).width()/me.scrollWidth)) + "px,0 ,0)";
                
                // 自定义touchmove事件
                if(element.move){
                    element.move.call(me, event);
                };
            },
    
            // 滑动释放
            end: function(event) {
                started = false;
                var o = $(event.target).closest('._target'); // czy
                if(o.length){
                    if(o.hasClass('_left')){ // 锁定左
                        if(endPos.x>0){ // 往右
                            event.preventDefault(); // 执行动画
                        }else if(endPos.x<0){ // 往左
                            event.stopPropagation(); // 执行原生滚动
                            checkScroll();
                            return ;
                        }
                    }else if(o.hasClass('_right')){ // 锁定右
                        if(endPos.x>0){ // 往右
                            event.stopPropagation(); // 执行原生滚动
                            checkScroll();
                            return ;
                        }else if(endPos.x<0){ // 往左
                            event.preventDefault(); // 执行动画
                        }
                    }else{
                        // 中间
                        event.stopPropagation(); // 执行原生滚动
                        checkScroll();
                        return ;
                    }
                }
                function checkScroll(){
                    var pwidth = o.width();
                    var width = o.children().width();
                    var left = o.scrollLeft();
                    first = left==0;
                    last = pwidth+left>=width;
                    if(first && last){
                        o.addClass('_left');
                        o.addClass('_right');
                    }else if(first){
                        o.addClass('_left');
                        o.removeClass('_right');
                    }else if(last){
                        o.addClass('_right');
                        o.removeClass('_left');
                    }else{
                        o.removeClass('_left');
                        o.removeClass('_right');
                    }
                }
                
                if(me.parent && ((me.first && endPos.x>0) || (me.last && endPos.x<0))){
                }else{
                    event.stopPropagation();
                };
                
                
                var duration = +new Date - startPos.time;    // 滑动的持续时间 
                if(me.titleId)this.icon[this.index].className = '';
                if (Number(duration) > 100) {
                    // 判断是左移还是右移,当偏移量大于50时执行
                    if (endPos.x > 50) {
                        this.index == 0 ? i=0:i=1;
                        this.index = parseInt(this.index) - i;
                        this.index == 0 ? me.first = true : me.first = false;
                        me.last = false;
                   } else if(endPos.x < -50) {
                        this.index == me.count-1 ? i=0:i=1;                           
                        this.index = parseInt(this.index) + i;                            
                        this.index == me.count-1 ? me.last = true : me.last = false;                            
                        me.first = false;
                    };
                };
                //console.log('end '+me.first+', '+me.last);
                
                
                $(this.slider).addClass(me.animateClass);
                this.slider.style.webkitTransform = "translate3d(" + (-this.index*me.scrollWidth) + "px,0 ,0)";                    
    
                if($(me.sImg).size()>0){ // 判断缩略图翻页[1]
                    var i = me.events.index+1;
                    var p = Math.ceil(i/me.page)-1;
                    me.scrollPage(p);
                    $(me.sImg).children().removeClass(me.sImgActiveClass).eq(me.events.index).addClass(me.sImgActiveClass);
                };
                
                
                // 解绑事件
                this.slider.removeEventListener('touchmove', this, false);
                this.slider.removeEventListener('touchend', this, false);
                me.class();
    
    
                // 缩放结束
                if(me.scale>0){
                    var active = '.'+me.itemActiveClass;                        
                    $(active, me.target).css({'webkitTransform':'scale('+(me.scale+1)+')'});
                    $('.j-prev', me.target).add('.j-next', me.target).css('webkitTransform', 'scale(1)');
                    $(me.target).children().addClass('f-slow');                        
                };
                
    
    
                
                //btn
                if($(me.btn).size()>0){
                    var onlyone = me.count==1?true:false;
                    if(me.events.index==0){
                        $('.prev', me.btn).hide();                            
                        if(!(me.count==1))$('.next', me.btn).show();
                        //me.first=true;
                        //me.last=false;
                    }else if(me.events.index==me.count-1){
                        $('.prev', me.btn).show();
                        $('.next', me.btn).hide();
                        //me.first=false;
                        //me.last=true;                            
                    }else{
                        $('.prev', me.btn).show();
                        $('.next', me.btn).show();
                        //me.first=false;
                        //me.last=false;                            
                    };
                };
    
                //自定义touchend事件
                if(element.end){
                    element.end.call(me, event);
                };
                
                //console.log(me.target+', '+me.first+', '+me.last)    ;
            }
        },
        
        this.class = function(){
            
            // 当前,上一个,下一个加类名
            var children = $(element.target).children(),
                i = this.events.index;
                children.removeClass(me.itemActiveClass);
            children.removeClass('j-active').eq(i).addClass(me.itemActiveClass);
            if(me.count>1){
                children.removeClass('j-next').eq(i+1).addClass('j-next');
                children.removeClass('j-prev').eq(i-1).addClass('j-prev');
            };
            
            if(me.titleId){
                $('#'+me.titleId).children().eq(i).addClass(me.titleActiveClass);
            };
        },
        
        // 初始化
        this.init = function() {
            // this指slider对象
            var self = this;
            
            $(this.target).find('._target').each(function(){
                var o = $(this);
                o.scroll(function(){
                    if(!started){ // 滚动结束后继续监控原生滚动条,以解决弹性滚动问题
                        var pwidth = o.width();
                        var width = o.children().width();
                        var left = o.scrollLeft();
                        first = left==0;
                        last = pwidth+left>=width;
                        console.log(first);
                        console.log(last);
                        if(first && last){
                            o.addClass('_left');
                            o.addClass('_right');
                        }else if(first){
                            o.addClass('_left');
                            o.removeClass('_right');
                        }else if(last){
                            o.addClass('_right');
                            o.removeClass('_left');
                        }else{
                            o.removeClass('_left');
                            o.removeClass('_right');
                        }
                    }
                });
            });
            
            // addEventListener第二个参数可以传一个对象,会调用该对象的handleEvent属性
            if(!!self.touch) this.slider.addEventListener('touchstart', self.events, false);
        };
        
        if($(me.btn).size()>0){
            
            //初始化
            $('.prev',me.btn).hide();
            if(me.count==1)$('.next',me.btn).hide();
            
            $(me.btn).click(function(event){
                var t = {
                    p : $(event.target).hasClass('prev'),
                    n : $(event.target).hasClass('next'),                    
                };
                if(!t.p&&!t.n)return false;    
                
                if(t.p){
                    if(me.events.index==0){
                        return false;
                    }else if(me.events.index==1){
                        me.first = true;
                        me.last = false;                                    
                    };
                    me.events.index -= 1;
                    if(me.events.index==0){
                        $('.prev',me.btn).hide();
                        $('.next',me.btn).show();
                    }else{
                        $('.prev',me.btn).show();
                        $('.next',me.btn).show();
                    };
                }else if(t.n){
                    if(me.events.index==me.count-1){
                        return false;
                    }else if(me.events.index==me.count-2){
                        me.first = false;
                        me.last = true;                                    
                    };
                    me.events.index += 1;
                    if(me.events.index==me.count-1){
                        $('.prev',me.btn).show();
                        $('.next',me.btn).hide();
                    }else{
                        $('.prev',me.btn).show();
                        $('.next',me.btn).show();
                    };
                };
                
                me.scrollTo(me.events.index);
                
            });                
        };
        
        this.init();
    };         
  • 相关阅读:
    Html.ActionLink 几种重载方式说明及例子
    2 python 文本特征提取 CountVectorizer, TfidfVectorizer
    模型调参---GridSearchCV
    1 NLP学习大纲
    pandas.dropna/isnull/fillna/astype的用法
    激活函数总结
    LeetCode--53 最大连续子序列(总结)
    LeetCode--44 通配符匹配
    LeetCode--Two_Sum
    css 背景图片自适应元素大小
  • 原文地址:https://www.cnblogs.com/iloveyou-sky/p/5945058.html
Copyright © 2011-2022 走看看