• JS(JQ)-实现图片横向滑动效果


    先看效果:

     

          

    这是一个常用的js实现图片滑动的效果

    这里面的代码很值得去研究:(勘称完美~)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>JavaScript 图片切换展示效果</title>
    </head>
    <body>
    <style type="text/css"> 
    .container, .container *{margin:0; padding:0;}
    
    .container{408px; height:168px; overflow:hidden;position:relative;}
    
    .slider{position:absolute;}
    .slider li{ list-style:none;display:inline;}
    .slider img{ 408px; height:168px; display:block;}
    
    .slider2{2000px;}
    .slider2 li{float:left;}
    
    .num{ position:absolute; right:5px; bottom:5px;}
    .num li{
        float: left;
        color: #FF7300;
        text-align: center;
        line-height: 16px;
         16px;
        height: 16px;
        font-family: Arial;
        font-size: 12px;
        cursor: pointer;
        overflow: hidden;
        margin: 3px 1px;
        border: 1px solid #FF7300;
        background-color: #fff;
    }
    .num li.on{
        color: #fff;
        line-height: 21px;
         21px;
        height: 21px;
        font-size: 16px;
        margin: 0 1px;
        border: 0;
        background-color: #FF7300;
        font-weight: bold;
    }
    </style>
    <div class="container" id="idTransformView">
      <ul class="slider" id="idSlider">
        <li><img src="images/01.jpg"/></li>
        <li><img src="images/02.jpg"/></li>
        <li><img src="images/03.jpg"/></li>
      </ul>
      <ul class="num" id="idNum">
        <li>1</li>
        <li>2</li>
        <li>3</li>
      </ul>
    </div>
    <br />
     
      <script type="text/javascript">
      
    var $ = function (id) {
        return "string" == typeof id ? document.getElementById(id) : id;
    };
    //尼玛这坨代码不好看懂滴呀;
    var Class = {
      create: function() {
        return function() {
          this.initialize.apply(this, arguments);
        }
      }
    }
    //这个应该是通过复制的方式来实现继承滴呀
    //而且是一种浅拷贝;
    Object.extend = function(destination, source) {
        for (var property in source) {
            destination[property] = source[property];
        }
        return destination;
    }
    
    var TransformView = Class.create();
    TransformView.prototype = {
      //相当于构造函数,来实现参数的额初始化滴呀
      //用存面向对象的方式来实现滴呀 
      initialize: function(container, slider, parameter, count, options) {
        if(parameter <= 0 || count <= 0) return;
        var oContainer = $(container), oSlider = $(slider), oThis = this;
    
        this.Index = 0;//当前索引
            //标签运算符啊
        
        this._timer = null;//定时器
        this._slider = oSlider;//滑动对象
        this._parameter = parameter;//切换参数
        this._count = count || 0;//切换数量
        this._target = 0;//目标参数
        
        this.SetOptions(options);
        
        this.Up = !!this.options.Up;
        this.Step = Math.abs(this.options.Step);
        this.Time = Math.abs(this.options.Time);
        this.Auto = !!this.options.Auto;
        this.Pause = Math.abs(this.options.Pause);
        this.onStart = this.options.onStart;
        this.onFinish = this.options.onFinish;
        
        oContainer.style.overflow = "hidden";
        oContainer.style.position = "relative";
        
        oSlider.style.position = "absolute";
        oSlider.style.top = oSlider.style.left = 0;
      },
      //设置默认属性
      SetOptions: function(options) {
        this.options = {//默认值
            Up:            true,//是否向上(否则向左)
            Step:        5,//滑动变化率
            Time:        10,//滑动延时
            Auto:        true,//是否自动转换
            Pause:        2000,//停顿时间(Auto为true时有效)
            onStart:    function(){},//开始转换时执行
            onFinish:    function(){}//完成转换时执行
        };
        Object.extend(this.options, options || {});
      },
      //开始切换设置
      Start: function() {
        if(this.Index < 0){
            this.Index = this._count - 1;
        } else if (this.Index >= this._count){ this.Index = 0; }
        
        this._target = -1 * this._parameter * this.Index; //这个就是物体运动的总结点;比如width=100 第一个移动100*1 第二个移动:100*2 第三个:100*3
        this.onStart();
        this.Move();
      },
      //移动
      Move: function() {
        clearTimeout(this._timer);
        var oThis = this, style = this.Up ? "top" : "left", iNow = parseInt(this._slider.style[style]) || 0, iStep = this.GetStep(this._target, iNow);
        
        if (iStep != 0) {
            this._slider.style[style] = (iNow + iStep) + "px";
            this._timer = setTimeout(function(){ oThis.Move(); }, this.Time);
        } else {
            this._slider.style[style] = this._target + "px";
            this.onFinish();
            if (this.Auto) { this._timer = setTimeout(function(){ oThis.Index++; oThis.Start(); }, this.Pause); }
        }
      },
      //获取步长
      GetStep: function(iTarget, iNow) {
        var iStep = (iTarget - iNow) / this.Step;
        if (iStep == 0) return 0;
        if (Math.abs(iStep) < 1) return (iStep > 0 ? 1 : -1);
        //iStep= iStep>0?Math.ceil(iStep):Math.floor(iStep);
        return iStep;
      },
      //停止
      Stop: function(iTarget, iNow) {
        clearTimeout(this._timer);
        this._slider.style[this.Up ? "top" : "left"] = this._target + "px";
      }
    };
    
    //真是面向对象的全部讲解啊
    //我操*你*妈的啊
    
    window.onload=function(){
        function Each(list, fun){
            for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); }
        };
        
        var objs = $("idNum").getElementsByTagName("li");
        //这个是以我们的li为移动对象滴呀;
        
        var tv = new TransformView("idTransformView", "idSlider", 168, 3, {
            onStart : function(){ Each(objs, function(o, i){ o.className = tv.Index == i ? "on" : ""; }) }//按钮样式
        });
        
        tv.Start();
        
        Each(objs, function(o, i){
            o.onmouseover = function(){
                o.className = "on";
                tv.Auto = false;
                tv.Index = i;
                tv.Start();
            }
            o.onmouseout = function(){
                o.className = "";
                tv.Auto = true;
                tv.Start();
            }
        })
    }
    </script>
    </body>
    </html>

     2.下面的是以jq的方式来实现滴呀 (都值得去研究哈)

    $(function ($) {
        $.fn.extend({ "focusScroll": function (o) {
            o = $.extend({
                thumbObj: "#myTab_btns li", //导航对象(jQuery表达式‘容器 元素’)
                botPrev: null, //按钮上一个(jQuery表达式)
                botNext: null, //按钮下一个(jQuery表达式)
                changeType: 'top', //切换方式,可选:top(垂直滚动),left(左右滚动),fade(淡入淡出),默认为top
                fadeSpeed: 'fast', //淡入淡出速度(slow,normal,fast或指定毫秒)
                thumbNowClass: 'hot', //导航对象当前的class,默认为hot
                thumbOverEvent: true, //鼠标经过thumbObj时是否切换对象,默认为true,为false时,只有鼠标点击thumbObj才切换对象
                overStop: true, //鼠标经过切换对象时,是否停止切换,并于鼠标离开后重启自动切换,前提是已开启自动切换
                auto: true, //是否自动切换,默认为true
                interval: 5000, //自动切换时间            
                len: 420, //单个尺寸
                start: 0, //初始显示位置
                lazyAttr: "backload",//图片延迟加载img属性
                onChange:function(li){}//切换时触发(动画可能未完成)
            }, o || {});
            var _self = $(this), _selfDom = $(this).get(0);
            var dir = o.changeType == 'top' ? 'scrollTop' : 'scrollLeft';
            var curIndex = 0;
            var autoTimer = null, stopPlay = false; imgLoaded = false;
            var navLis = _self.find("li");
            var timers={};
            
            var go = function (i) {
                if (!imgLoaded)
                    lzyLoad();
                $(o.thumbObj).removeClass(o.thumbNowClass).eq(i).addClass(o.thumbNowClass);
                
                if (o.changeType == 'fade' && i != curIndex) {
                    navLis.stop(true, true);
                    var fadeoutSpeed=o.fadeSpeed;
                    switch(o.fadeSpeed){
                        case "fast":
                        case "normal":
                            fadeoutSpeed = "fast";
                            break;
                        case "slow":
                            fadeoutSpeed = "normal";
                            break;
                        default:
                            if(!isNaN(parseInt(o.fadeSpeed))){
                                fadeoutSpeed = parseInt(o.fadeSpeed)/2;
                            }
                    }            
                    navLis.eq(curIndex).fadeOut(fadeoutSpeed, "linear");
                    navLis.eq(i).fadeIn(o.fadeSpeed, "linear");    
                } else {
                    (function (me) {
                        //一次性计算出动画过程中的位置
                        var diffs = [];
                        var dis = i * o.len, pos = _selfDom[dir];
                        while (dis != pos) {
                            var remain = dis - pos;
                            var d = Math[remain > 0 ? 'ceil' : 'floor'](remain * 0.1);
                            pos += d;
                            diffs.push(pos);
                        };
                        clearTimeout(me.only);
                        var run = function () {
                            _selfDom[dir] = diffs.shift();
                            if (diffs.length > 0)
                                me.only = setTimeout(run, 10);
                        }
                        if (diffs.length > 0)
                            me.only = setTimeout(run, 0);
                    })(timers);
                }
                curIndex = i;
                o.onChange(navLis.eq(curIndex));
            };
            if (o.overStop) {
                _self.hover(function () { stopPlay = true; }, function () { stopPlay = false; });
            }
            if ($(o.thumbObj).length == 0) {//自动生成数字导航
                var content = o.thumbObj.split(" ")[0];
                var tag = o.thumbObj.split(" ")[1];
                for (var i = 1; i <= _self.find("li").length; i++)
                    $(content).append("<" + tag + ">" + i + "</" + tag + ">");
                $(content).find(tag).eq(0).addClass(o.thumbNowClass);
            }
            $(o.thumbObj).each(function (i) {
                if (o.thumbOverEvent) {
                    $(this).hover(function () { stopPlay = true; go(i); }, function () { stopPlay = false; });
                } else {
                    $(this).click(function () { go(i); })
                }
            });
            var auto = function () {
                if (!stopPlay) {
                    var nextIndex = (curIndex >= $(o.thumbObj).length - 1 ? 0 : curIndex + 1);
                    go(nextIndex);
                }
            };
    
            if (o.botPrev)
                $(o.botPrev).click(function () {
                    var nextIndex = (curIndex <= 0 ? $(o.thumbObj).length - 1 : curIndex - 1);
                    go(nextIndex)
                }).hover(function () { stopPlay = true; }, function () { stopPlay = false; });
    
            if (o.botNext)
                $(o.botNext).click(function () {
                    var nextIndex = (curIndex >= $(o.thumbObj).length - 1 ? 0 : curIndex + 1);
                    go(nextIndex)
                }).hover(function () { stopPlay = true; }, function () { stopPlay = false; });
    
            if (o.start > 0) {
                curIndex = o.start;
                $(o.thumbObj).removeClass(o.thumbNowClass).eq(curIndex).addClass(o.thumbNowClass);
                if (o.changeType == 'fade')
                    _self.find("li").hide().eq(curIndex).show();
                else
                    _self.attr(dir, curIndex * o.len);
            }
            var lzyLoad = function () {
                imgLoaded = true;
                if (o.lazyAttr != "") {
                    _self.find("img[" + o.lazyAttr + "]").each(function () {
                        if (this.src != this.getAttribute(o.lazyAttr)) this.src = this.getAttribute(o.lazyAttr)
                    })
                }
            }
    
            var init = function () {
                /*update20121101 begin,curIndexImg show immediately*/
                var firstImg = _self.find("li").eq(curIndex).find("img[" + o.lazyAttr + "]");
                if (firstImg) {
                    firstImg.attr("src", firstImg.attr(o.lazyAttr));
                }
                //淡入淡出隐藏非当前li
                if (o.changeType == 'fade'){
                    _self.find("li").each(function(i){
                        if(i!=curIndex){
                            $(this).hide();
                        }
                    });
                }
                /*update20121101 end */
                if (o.auto) {
                    autoTimer = window.setInterval(auto, o.interval);
                    //提前1秒加载图片
                    window.setTimeout(lzyLoad, o.interval > 2000 ? o.interval - 1000 : 1000);
                } else {//推迟1秒加载图片
                    window.setTimeout(lzyLoad, 1000);
                }
            }
    
            //获取元素偏移顶部距离
            var offsettop = function (element) {
                var actualtop = element.offsetTop;
                var current = element.offsetParent;
                while (current !== null) {
                    actualtop += current.offsetTop;
                    current = current.offsetParent;
                }
    
                return actualtop;
            }
    
            //获取浏览器当前可视区域大小
            var clientHeight = function () {
                var pageHeight;
                if (typeof pageHeight != "number") {
                    if (document.compatMode == "CSS1Compat") {
                        pageHeight = document.documentElement.clientHeight;
                    } else {
                        pageHeight = document.body.clientHeight;
                    }
                }
    
                return pageHeight;
            }
    
            var offsetTop = offsettop(_selfDom);
            var scroll = function () {
                var scrollTop = document.body.scrollTop | document.documentElement.scrollTop;
                //如果是滚动到滚动图当前屏
                if (offsetTop <= (clientHeight() + scrollTop)) {
                    init();
                    $(window).off("scroll", scroll);
                }
            }
            //如果是当前屏是滚动图所在屏
            if (offsetTop <= (clientHeight() + (document.body.scrollTop | document.documentElement.scrollTop))) {
                init();
            } else {
                $(window).on("scroll", scroll);
            }
    
        } 
        });
    });

       

  • 相关阅读:
    【IoT平台北向API调用】使用Postman调用Https接口
    【LiteOS】LiteOS移植常见问题
    搞IT产品,请谨记Mobile First
    Modelarts与无感识别技术生态总结(浅出版)
    高性能Web动画和渲染原理系列(1)——CSS动画和JS动画
    使用蓝图构建Flask项目目录
    一统江湖的大前端(8)- velocity.js 运动的姿势(上)
    只需两步手把手教你玩转图像识别
    秉承初心,砥砺奋进!华为云助力锦江都城开启云服务时代
    HBase 索引创建
  • 原文地址:https://www.cnblogs.com/mc67/p/4806331.html
Copyright © 2020-2023  润新知