Jquery和纯JS实现轮播图--左右切换式

一、页面结构
对于左右切换式的轮播图的结构主要分为以下几个部分:
1、首先是个外围部分(其实也就是最外边的整体wrapper)
2、其次就是你设置图片轮播的地方(也就是一个container吧)
3、然后是一个图片组(可以用新的div 也可以直接使用 ul–>li形式)
4、然后是图片两端的左箭头和右箭头
7、然后是一个按钮层,用来定位图片组的index吧,一般放在图片的下方(div 或 ul–>li)

<div id="warpper">
        <div class="container">
            <!-- 图片区域 -->
            <ul class="imgList">
                <li><img src="./images/img1.jpg" alt=""></li>
                <li><img src="./images/img2.jpg" alt=""></li>
                <li><img src="./images/img3.jpg" alt=""></li>
                <li><img src="./images/img4.jpg" alt=""></li>
                <li><img src="./images/img5.jpg" alt=""></li>
                <li><img src="./images/img6.jpg" alt=""></li>
            </ul>
            <!-- 左右切换图标 -->
            <img src="./images/pre.png" width="40px" height="60px" class="pre">
            <img src="./images/next.png" width="40px" height="60px" class="next">
            <!-- 下方控制图片按钮 -->       
            <ul class="dollList">
                <li class="sec"><a href="#"></a></li>
                <li><a href="#"></a></li>
                <li><a href="#"></a></li>
                <li><a href="#"></a></li>
                <li><a href="#"></a></li>
                <li><a href="#"></a></li>
            </ul>
        </div> 
    </div>

二、CSS样式
左右切换式则是采用图片li 浮动,父层元素ul 总宽为总图片宽,并设定为有限container宽度下隐藏超出宽度的部分;然后当想切换到某序号的图片时,则采用其ul 定位 left样式设定相应属性值实现
比如显示第一张图片初始定位left为0px, 要想显示第二张图片则需要left:-800px 处理;;

<style>
        *{ margin: 0; padding: 0; }
        ul{ list-style: none; }
        a{ text-decoration: none; }

        #warpper{ width: 800px; height: 600px; margin: 20px auto;}
        .container{ width: 100%; height: 100%; overflow: hidden; position: relative; }

        .imgList{ width: 4800px; position: absolute; z-index: 5; }
        .imgList>li{ float: left; width: 800px; height: 600px; }
        .imgList>li>img{ width: 100%; height: 100%; }

        .pre,.next{ position: absolute; top: 275px; background: rgba(220,220,220,0.7); padding: 10px 0; z-index: 100; opacity: 0.6; filter: alpha(opacity=60); }
        .pre:hover,.next:hover{ cursor: pointer; opacity: 1; filter: alpha(opacity=100); }
        .pre{ left: 10px; }
        .next{ right: 10px; }

        .dollList{ width:180px;  position: absolute; z-index: 10; bottom: 20px; left: 310px ; }
        .dollList li{ float: left; margin-right: 10px; }
        .dollList li.sec a{ background: orange; }
        .dollList li a{ width: 15px; height: 15px; background: rgba(230,230,230,0.6); border-radius: 50%; display: inline-block;  }
</style>

三、JS处理
(1)jquery处理:

    <script>
        $(function(){
            //设置全局变量
            var cur = 0;    //当前的图片序号
                imgLen = $(".imgList li").length;  //获取图片的数量
                timer = null;   //设置定时定时器的名字,方便后面关闭

            //当鼠标移到向左和向右的图标上关闭定时器,离开时则重置定时器
            $(".pre,.next").hover(function(){
                clearInterval( timer );
            },function(){
                changeImg( );
            });

            //当鼠标移到图片上关闭定时器,离开时则重置定时器
            $(".imgList").hover(function(){
                clearInterval( timer );
            },function(){
                changeImg( );
            });

            //点击向左图标根据cur进行上一个图片处理
            $(".pre").click(function(){
                cur = cur>0 ? (--cur) : (imgLen-1);
                changeTo( cur );
            });

            //点击向右图标根据cur进行上一个图片处理
            $(".next").click(function(){
                cur = cur<( imgLen-1 ) ? (++cur) : 0;
                changeTo( cur );
            });

            //为下方的圆点按钮绑定事件
            $(".dollList li").hover(function(){
                clearInterval(timer);
                var index = $(this).index();
                cur = index
                changeTo(cur);
            },function(){
                changeImg();
            });

            //封装图片自动播放函数
            function changeImg(){

                timer = setInterval(function(){
                    if( cur<imgLen-1 ){
                        cur++;
                    }else{
                        cur=0;
                    }
                    changeTo( cur );
                },2000);        
            }

            //调用函数
            changeImg();

            //图片切换函数
            function changeTo( num ){
                var go = num*800;
                $(".imgList").animate({ "left" : -go },500);
                $(".dollList").find("li").removeClass("sec").eq(num).addClass("sec");

            }

        });
    </script>

jquery这样就能实现左右切换式轮播图了,简便,原生JS代码量就有些多了;
(2)原生JS处理:

<script>
    var cur = 0, //当前的图片序号
      imgLis = getElementsByClassName("imgList")[0].getElementsByTagName("li"), //获取图片组
      imgLen = imgLis.length,   //获取图片的数量
      timer = null; //设置定时定时器的名字,方便后面关闭
      dollLis = getElementsByClassName("dollList")[0].getElementsByTagName("li"); //获取下方圆点

  //封装图片自动播放函数
  function changeImg(){ 
      timer = setInterval(function(){ 
        if(cur < imgLen -1){ 
          cur ++;
        }else{ 
        cur = 0;
        }
        //调用变换处理函数
        changeTo(cur); 
      },2500);
  }
  changeImg();

  //调用添加事件处理
  addEvent();

  //给左右箭头和右下角的图片index添加事件处理
 function addEvent(){
  for(var i=0;i<imgLen;i++){ 
    //闭包防止作用域内活动对象item的影响
    (function(_i){ 
    //鼠标滑过则清除定时器,并作变换处理
    dollLis[_i].onmouseover = function(){ 
      clearTimeout(timer);
      changeTo(_i);
      cur = _i;
    };
    //鼠标滑出则重置定时器处理
    dollLis[_i].onmouseout = function(){ 
      changeImg();
    };
     })(i);
  }

  //给左箭头prev添加上一个事件
  var pre = getElementsByClassName("pre")[0];
  pre.onmouseover = function(){ 
    //滑入清除定时器
    clearIntervcural(timer);
  };
  pre.onclick = function(){ 
    //根据curIndex进行上一个图片处理
    cur = (cur > 0) ? (--cur) : (imgLen - 1);
    changeTo(cur);
  };
  pre.onmouseout = function(){ 
    //滑出则重置定时器
    changeImg();
  };

   //给右箭头next添加下一个事件
  var next = getElementsByClassName("next")[0];
  next.onmouseover = function(){ 
    clearInterval(timercur);
  };
  next.onclick = function(){ 
    cur = (cur < imgLen - 1) ? (++cur) : 0;
    changeTo(cur);
  };
  next.onmouseout = function(){ 
    changeImg();
  };
}

  //左右切换处理函数
  function changeTo(num){ 
    //设置image
    var imgList = getElementsByClassName("imgList")[0];
    goLeft(imgList,num*800); //左移一定距离

    //设置image的控制下标 index
    var _curIndex = getElementsByClassName("sec")[0];
    removeClass(_curIndex,"sec");
    addClass(dollLis[num],"sec");
  }

  //图片组相对原始左移dist px距离
  function goLeft(elem,dist){ 
    if(dist == 800){ //第一次时设置left为0px 或者直接使用内嵌法 style="left:0;"
      elem.style.left = "0px";
    }
    var toLeft; //判断图片移动方向是否为左
    dist = dist + parseInt(elem.style.left); //图片组相对当前移动距离
    if(dist<0){  
      toLeft = false;
      dist = Math.abs(dist);
    }else{ 
      toLeft = true;
    }
    for(var i=0;i<= dist/20;i++){ //这里设定缓慢移动,10阶每阶80px
      (function(_i){ 
        var pos = parseInt(elem.style.left); //获取当前left
        setTimeout(function(){ 
          pos += (toLeft)? -(_i * 20) : (_i * 20); //根据toLeft值指定图片组位置改变
          //console.log(pos);
          elem.style.left = pos + "px";
        },_i * 25); //每阶间隔50毫秒
      })(i);
    }
  }
</script>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,406评论 1 45
  • 请参看我github中的wiki,不定期更新。https://github.com/ivonzhang/Front...
    zhangivon阅读 7,097评论 2 19
  • 1. tab列表折叠效果 html: 能源系统事业部 岗位名称: 工作地点 岗位名...
    lilyping阅读 1,824评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,157评论 0 1
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,321评论 0 2