js轮播

封装一个animation函数

实现的动画效果是:最开始运动速度快,然后逐渐减小,并且到最后,速度为零,且正好到达目的地即目标所在的位置,在此过程中改变透明度,以及宽高,left、top这些值还要实现同时改变多个元素。

//封装一个getStyle()的函数,通过这个函数可以处理兼容性,来取得当前元素正在应用的样式,
function getStyle(el,property) {
    if(getComputedStyle){
        return getComputedStyle(el)[property];//ie8之后获取方式
    }else{
        return el.currentStyle[property]; //ie8以前
    }
}
//参数:所改变的元素,改变的属性,目标(属性和目标合为properties)
function animate(el,properties) {
    clearInterval(el.timerId);
    el.timerId=setInterval(function () {
        for(var property in properties){
            var current;
            var target=properties[property];
            if(property==='opacity'){
                current=parseFloat(getStyle(el,'opacity'))*100;
            }else{
                current=parseInt(getStyle(el,property));
            }
            //当target和current相等时,速度就变为0,为了每次都缓慢变化,所以要乘以一个系数
            var speed=(target-current)/30;
            speed=speed>0?Math.ceil(speed):Math.floor(speed);
            if(property==='opacity'){
                el.style.opacity=(current+speed)/100;
            }
            el.style[property]=current+speed+"px";
        }
    },20)
}

水平轮播

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
        }
        .slider{
            width: 700px;
            height: 504px;
            border: 5px solid rebeccapurple;
            position: relative;
            overflow: hidden;
        }
        .slider .list{
            position: absolute;

        }
        .slider .list .item{
            width: 700px;
            height: 504px;
            float: left;

        }
        .slider .list .item img{
            width: 700px;
            height: 504px;
            display: block;
        }
        .slider .prev,.slider .next{
            position: absolute;
            top: 245px;
        }
        .slider .next{
            right: 0;
        }
        .slider .pagination {
            position: relative;
            top: 350px;
        }
        .slider .pagination .bullet{
            width: 20px;
            height: 20px;
            background:black;
            border: 2px solid yellow;
            float: left;
            margin-left: 5px;
            color: white;
            text-align: center;
            line-height: 20px;
            cursor: pointer;
        }
        .slider .pagination .bullet.focus{
            background-color: yellow;
        }
    </style>
</head>
<body>
<div class="slider">
    <ul class="list">
        <li class="item"><img src="./images/1.jpeg" alt=""></li>
        <li class="item"><img src="./images/2.jpeg" alt=""></li>
        <li class="item"><img src="./images/3.jpeg" alt=""></li>
        <li class="item"><img src="./images/4.jpeg" alt=""></li>
    </ul>
    <button class="prev"><</button>
    <button class="next">></button>
    <ul class="pagination">
        <li class="bullet focus">1</li>
        <li class="bullet">2</li>
        <li class="bullet">3</li>
        <li class="bullet">4</li>
    </ul>
</div>
<script src="animation.js"></script>
<script>
    (function () {
        var currentIndex;//当前显示的索引
        var lis;//所有的li
        var liWidth;//li的宽度
        var len;//li的个数
        var id;
        //是图片顺序排列为3 0 1 2 3 0  两边的两张是假定的,中间的四张是真正显示的长度
        init();
        function init() {
            currentIndex=1;
            var li_1=document.querySelector('.slider .list .item:first-of-type');
            var copy_1=li_1.cloneNode(true);
            var li_last=document.querySelector('.slider .list .item:last-of-type');
            var copy_last=li_last.cloneNode(true);
            var list=document.querySelector('.slider .list');
            list.appendChild(copy_1);
            list.insertBefore(copy_last,li_1);

            //根据list的长度,设定ul的宽度
            lis=document.querySelectorAll('.slider .list .item');//取到所有的li
            liWidth=lis[0].offsetWidth;
            len=lis.length;//6
            list.style.width=liWidth*len+"px";//ul的宽度
            document.querySelector('.prev').onclick=function () {
                sliderPrev();
            };
            document.querySelector('.next').onclick=function () {
              sliderNext();
            };
            list.style.left=-liWidth+"px";
            var bullets=document.querySelectorAll('.slider .pagination .bullet');
            for(var i=0;i<bullets.length;i++){
                bullets[i].index=i;
                bullets[i].onclick=function () {
                    index=this.index+1;
                    sliderTo(index);
                }
            }
            auto();
            var slider=document.querySelector('.slider');
            //鼠标移入,停止自动轮播
            slider.onmouseover=function () {
                stop();
            };
            //鼠标移出,开始自动轮播
            slider.onmouseout=function () {
                auto();
            };
        }
        //显示下一张函数
        function sliderPrev() {
            currentIndex--;
            sliderTo(currentIndex);
        }
        //显示前一张函数
        function sliderNext() {
            currentIndex++;
            sliderTo(currentIndex);
        }
        //图片切换
        function sliderTo(index) {
            var list=document.querySelector('.slider .list');
            if(index===len){
                currentIndex=index=2;
                list.style.left=-liWidth+"px";
            }
            if(index===-1){
                currentIndex=index=3;
                list.style.left=-(4*liWidth)+"px";
            }
            var left=-index*liWidth;
            animate(list,{
                left:left
            });
            var focusIndex;
            var bullets=document.querySelectorAll('.pagination .bullet');
            for(var i=0;i<bullets.length;i++){
                if(index===0){
                    focusIndex=bullets.length-1;
                }else if(index===5){
                    focusIndex=0;
                }else{
                    focusIndex=index-1;
                }
            }
            document.querySelector('.focus').className='bullet';
            bullets[focusIndex].className='bullet focus';


        }
        //自动轮播
        function auto() {
            clearInterval(id);
            id=setInterval(function () {
                sliderNext();
            },2000)

        }
        //停止自动轮播
        function stop() {
            clearInterval(id);
        }
    })()
</script>

</body>
</html>

透明度轮播

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style: none;
        }
        .slider{
            width: 700px;
            height: 504px;
            border: 5px solid rebeccapurple;
            position: relative;
        }
        .slider .list .item{
            position: absolute;
            left: 0;
            top: 0;
            opacity: 0;
        }
        .slider .list .item:nth-of-type(1){
            opacity: 1;
        }
        .slider .list .item img{
            width: 700px;
            height: 504px;
            display: block;
        }
        .slider .prev,.slider .next{
            position: absolute;
            top: 245px;
        }
        .slider .next{
            right: 0;
        }
        .slider .pagination{
            position: relative;
            top: 350px;
        }
        .slider .pagination .bullet{
            width: 20px;
            height: 20px;
            background:black;
            border: 2px solid yellow;
            float: left;
            margin-left: 5px;
            color: white;
            text-align: center;
            line-height: 20px;
            cursor: pointer;
        }
        .slider .pagination .bullet.focus{
            background-color: yellow;
        }

    </style>
</head>
<body>
<div class="slider">
    <ul class="list">
        <li class="item"><img src="./images/1.jpeg" alt=""></li>
        <li class="item"><img src="./images/2.jpeg" alt=""></li>
        <li class="item"><img src="./images/3.jpeg" alt=""></li>
        <li class="item"><img src="./images/4.jpeg" alt=""></li>
    </ul>
    <button class="prev"><</button>
    <button class="next">></button>
    <ul class="pagination">
        <li class="bullet focus">1</li>
        <li class="bullet">2</li>
        <li class="bullet">3</li>
        <li class="bullet">4</li>
    </ul>
</div>
<script src="animation.js"></script>
<script>
   /* 立即执行函数:声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;
    (function(){})()
    可以避免污染全局作用域*/
    (function () {
        //切换时前一张的索引,和后一张的索引
      var prevIndex,nextIndex;
      var len;
      var id;
      init();

      function init() {
          prevIndex=nextIndex=0;
          len=document.querySelectorAll('.list .item').length;
          document.querySelector('.prev').onclick=function(){
            sliderPrev()
          };
          document.querySelector('.next').onclick=function () {
              sliderNext()
          };
          var bullets=document.querySelectorAll('.slider .pagination .bullet');
          for(var i=0;i<bullets.length;i++){
             bullets[i].index=i;
             bullets[i].onclick=function () {
                 prevIndex=nextIndex;
                 nextIndex=this.index;
                 sliderTo(prevIndex,nextIndex);
             }
          }
         auto();
          var slider=document.querySelector('.slider');
          //鼠标移入,停止自动轮播
          slider.onmouseover=function () {
              stop();
          };
          //鼠标移出,开始自动轮播
          slider.onmouseout=function () {
            auto();
          };
      }

      //处理点击prev button时的动作,计算prevIndex
      function sliderPrev(){
          prevIndex=nextIndex;
          nextIndex--;
          if(nextIndex===-1){
                nextIndex=len-1;
          }
          sliderTo(prevIndex,nextIndex);

      }

      //处理点击next button时的动作,计算nextIndex
      function sliderNext() {
          prevIndex=nextIndex;
          nextIndex++;
          if(nextIndex===len){
              nextIndex=0;
          }
          sliderTo(prevIndex,nextIndex);
      }

      //参数为:前一张图片的索引,和后一张图片的索引
      function sliderTo(prev,next) {
          var lis=document.querySelectorAll('.list .item');
          var bullets=document.querySelectorAll('.slider .pagination .bullet');

          bullets[prev].className='bullet';
          bullets[next].className='bullet focus';

          animate(lis[prev],{opacity:0});
          animate(lis[next],{opacity:100})
      }

      //自动轮播函数
      function auto() {
          clearInterval(id);
          id=setInterval(function () {
              sliderNext();
          },2000)
      }

      //停止自动轮播
      function stop() {
            clearInterval(id);
      }
    })()
</script>
</body>
</html>
原文地址:https://www.cnblogs.com/wahaha-/p/14123469.html