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( cur1 ){
                        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//闭包防止作用域内活动对象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>

注:getElementsByClassName()是我在另外一个js文件里封装的函数,可以参考我的另一篇博客: JS封装通过className获取元素的函数
以上就是关于Jquery和纯JS实现轮播图–左右切换式的内容了。

你可能感兴趣的:(javascript,jquery,前端小实例,图片特效)