Mr. Lei

jquery实现无缝轮播banner
效果 html <div id="banner"> <!-- 图片区域 -->...
扫描右侧二维码阅读全文
02
2019/07

jquery实现无缝轮播banner

效果

banner_demo.gif

html

<div id="banner">
  <!-- 图片区域 -->
  <ul id="banner_img" style="transition:all 0.3s linear;left: 0;">
    <li>
      <a href="javascript:;" title="轮播1">
        <img src="images/banner1.jpg" title="轮播广告1">
      </a>
    </li>
    <li>
      <a href="javascript:;" title="轮播2">
        <img src="images/banner2.jpg" title="轮播广告2">
      </a>
    </li>
    <li>
      <a href="javascript:;" title="轮播3">
        <img src="images/banner3.jpg" title="轮播广告3">
      </a>
    </li>
    <li>
      <a href="javascript:;" title="轮播4">
        <img src="images/banner4.jpg" title="轮播广告4">
      </a>
    </li>
    <li>
      <!-- 为了衔接轮播效果在结尾添加第一个banner图 -->
      <a href="javascript:;" title="轮播1">
        <img src="images/banner1.jpg" title="轮播广告1">
      </a>
    </li>
  </ul>
  <!--左右按钮-->
  <a href="javascript:;" id="btn_lf">〈</a>
  <a href="javascript:;" id="btn_rt">〉</a>
  <!--小圆点-->
  <ul id="dot">
    <li class=""></li>
    <li class=""></li>
    <li class=""></li>
    <li class=""></li>
  </ul>
</div>

css

  ul {
    padding: 0;
    margin: 0;
  }

  li {
    list-style: none;
  }

  img {
    width: 960px;
    float: left;
  }

  #banner {
    width: 960px;
    height: 384px;
    margin: 0 auto;
    overflow: hidden;
    position: relative;
  }

  #banner_img {
    list-style: none;
    width: 4800px;
    margin: 0;
    padding: 0;
    position: relative;

  }

  #banner_img li {
    float: left;
  }

  #btn_lf,
  #btn_rt {
    position: absolute;
    top: 157px;
    width: 25px;
    height: 70px;
    border-radius: 3px;
    opacity: 0.5;
    transition: all .3s linear;
    background: #fff;
    text-decoration: none;
    line-height: 70px;
    color: #000;
    font-weight: 900;
  }

  #btn_lf:hover,
  #btn_rt:hover {
    opacity: 1;
  }

  #btn_lf {
    text-align: left;
    left: 5px;
  }

  #btn_rt {
    text-align: right;
    right: 5px;
  }

  #dot {
    position: absolute;
    bottom: 10px;
    left: 50%;
    margin-left: -34px;
  }

  #dot li {
    width: 12px;
    height: 12px;
    background: #fff;
    border-radius: 50%;
    float: left;
    margin-right: 5px;
    transition: all .2s linear;
  }

  .hover {
    cursor: pointer;
    background: orange !important;
  }

javascript

<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
  <script>
  //自动轮播
  const WIDTH = 960; //banner宽度
  var
    timer = null,
    i = 0, //用于计算轮播的序号,
    $banner = $("#banner_img"), //定义变量保存当前banner的ul
    len = $banner.children("li").length, //定义变量保存li的个数
    $dot = $("#dot"); //小圆点
  $dot.children(":first").addClass("hover"); //第一个小圆点添加hover样式
  //轮播
  function move() {
    timer = setTimeout(() => {
      if (i < len - 1) { //如果i小于当前banner数量-1
        i++;
        $banner.css("left", -WIDTH * i); //移动banner的left值为WIDTH*i
        move(); //重复调用
      } else {
        $banner.css({
          //否则先把transition属性设置为空,暂时其失去过渡效果
          "transition": "",
          //让left属性瞬间回到第0个banner的位置
          left: 0
        });
        i = 1; //下一个轮播为第1个banner图
        //设置定时器
        setTimeout(() => {
          $banner.css({
            //恢复transition属性
            "transition": "all .3s linear",
            //并把left属性设置到WIDTH*i的位置
            "left": -WIDTH * i
          })
        }, 5)
        move(); //重复调用
      }
    }, 3000);
    //小圆点跟随banner
    if (i < len - 1) {
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    } else {
      //添加第0个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + 0 + ")").addClass("hover").siblings().removeClass("hover");
    }
  }
  move();

  //鼠标经过banner停止自动轮播
  $("#banner").hover(() => {
    clearTimeout(timer);

  }, () => {
    move();
  })

  //小圆点鼠标经过改变轮播
  $dot.on("mouseover", "li", function() {
    var $this = $(this);
    if (!$this.hasClass("hover")) {
      i = $this.index(); //设置i的值为当前li下的位置
      $banner.css("left", -WIDTH * i); //设置banner的left属性
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    }
  });

  //左按钮
  $("#btn_lf").click(function() {
    var $this = $(this);
    if (i >0) { //如果i小于当前banner数量-1
      i--;
      $banner.css("left", -WIDTH * i); //移动banner的left值为WIDTH*i
    } else {
      $banner.css({
        //否则先把transition属性设置为空,暂时其失去过渡效果
        "transition": "",
        //让left属性瞬间回到第0个banner的位置
        left: -WIDTH*(len-1)
      });
      i = 3; //下一个轮播为第1个banner图
      //设置定时器
      setTimeout(() => {
        $banner.css({
          //恢复transition属性
          "transition": "all .3s linear",
          //并把left属性设置到WIDTH*i的位置
          "left": -WIDTH * i
        });
      }, 50);
    }
    if (i >0) {
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    } else {
      //添加第0个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    }
  });

  //右按钮
  $("#btn_rt").click(function() {
    var $this = $(this);
    if (i < len - 1) { //如果i小于当前banner数量-1
      i++;
      $banner.css("left", -WIDTH * i); //移动banner的left值为WIDTH*i

    } else {
      $banner.css({
        //否则先把transition属性设置为空,暂时其失去过渡效果
        "transition": "",
        //让left属性瞬间回到第0个banner的位置
        left: 0
      });
      i = 1; //下一个轮播为第1个banner图
      //设置定时器
      setTimeout(() => {
        $banner.css({
          //恢复transition属性
          "transition": "all .3s linear",
          //并把left属性设置到WIDTH*i的位置
          "left": -WIDTH * i
        });
      }, 50);
    }
    if (i < len - 1) {
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    } else {
      //添加第0个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + 0 + ")").addClass("hover").siblings().removeClass("hover");
    }
  });
  </script>

完整代码

<html>

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>banner轮播</title>
  <meta name="description" content="">
  <meta name="keywords" content="">
  <style type="text/css">
  ul {
    padding: 0;
    margin: 0;
  }

  li {
    list-style: none;
  }

  img {
    width: 960px;
    float: left;
  }

  #banner {
    width: 960px;
    height: 384px;
    margin: 0 auto;
    overflow: hidden;
    position: relative;
  }

  #banner_img {
    list-style: none;
    width: 4800px;
    margin: 0;
    padding: 0;
    position: relative;

  }

  #banner_img li {
    float: left;
  }

  #btn_lf,
  #btn_rt {
    position: absolute;
    top: 157px;
    width: 25px;
    height: 70px;
    border-radius: 3px;
    opacity: 0.5;
    transition: all .3s linear;
    background: #fff;
    text-decoration: none;
    line-height: 70px;
    color: #000;
    font-weight: 900;
  }

  #btn_lf:hover,
  #btn_rt:hover {
    opacity: 1;
  }

  #btn_lf {
    text-align: left;
    left: 5px;
  }

  #btn_rt {
    text-align: right;
    right: 5px;
  }

  #dot {
    position: absolute;
    bottom: 10px;
    left: 50%;
    margin-left: -34px;
  }

  #dot li {
    width: 12px;
    height: 12px;
    background: #fff;
    border-radius: 50%;
    float: left;
    margin-right: 5px;
    transition: all .2s linear;
  }

  .hover {
    cursor: pointer;
    background: orange !important;
  }
  </style>
</head>

<body>
  <div id="banner">
    <!-- 图片区域 -->
    <ul id="banner_img" style="transition:all 0.3s linear;left: 0;">
      <li>
        <a href="javascript:;" title="轮播1">
            <img src="images/banner1.jpg" title="轮播广告1">
          </a>
      </li>
      <li>
        <a href="javascript:;" title="轮播2">
            <img src="images/banner2.jpg" title="轮播广告2">
          </a>
      </li>
      <li>
        <a href="javascript:;" title="轮播3">
            <img src="images/banner3.jpg" title="轮播广告3">
          </a>
      </li>
      <li>
        <a href="javascript:;" title="轮播4">
            <img src="images/banner4.jpg" title="轮播广告4">
          </a>
      </li>
      <li>
        <!-- 为了衔接轮播效果在结尾添加第一个banner图 -->
        <a href="javascript:;" title="轮播1">
            <img src="images/banner1.jpg" title="轮播广告1">
          </a>
      </li>
    </ul>
    <!--左右按钮-->
    <a href="javascript:;" id="btn_lf">〈</a>
    <a href="javascript:;" id="btn_rt">〉</a>
    <!--小圆点-->
    <ul id="dot">
      <li class=""></li>
      <li class=""></li>
      <li class=""></li>
      <li class=""></li>
    </ul>
  </div>
  <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
  <script>
  //自动轮播
  const WIDTH = 960; //banner宽度
  var
    timer = null,
    i = 0, //用于计算轮播的序号,
    $banner = $("#banner_img"), //定义变量保存当前banner的ul
    len = $banner.children("li").length, //定义变量保存li的个数
    $dot = $("#dot"); //小圆点
  $dot.children(":first").addClass("hover"); //第一个小圆点添加hover样式
  //轮播
  function move() {
    timer = setTimeout(() => {
      if (i < len - 1) { //如果i小于当前banner数量-1
        i++;
        $banner.css("left", -WIDTH * i); //移动banner的left值为WIDTH*i
        move(); //重复调用
      } else {
        $banner.css({
          //否则先把transition属性设置为空,暂时其失去过渡效果
          "transition": "",
          //让left属性瞬间回到第0个banner的位置
          left: 0
        });
        i = 1; //下一个轮播为第1个banner图
        //设置定时器
        setTimeout(() => {
          $banner.css({
            //恢复transition属性
            "transition": "all .3s linear",
            //并把left属性设置到WIDTH*i的位置
            "left": -WIDTH * i
          })
        }, 5)
        move(); //重复调用
      }
    }, 3000);
    //小圆点跟随banner
    if (i < len - 1) {
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    } else {
      //添加第0个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + 0 + ")").addClass("hover").siblings().removeClass("hover");
    }
  }
  move();

  //鼠标经过banner停止自动轮播
  $("#banner").hover(() => {
    clearTimeout(timer);

  }, () => {
    move();
  })

  //小圆点鼠标经过改变轮播
  $dot.on("mouseover", "li", function() {
    var $this = $(this);
    if (!$this.hasClass("hover")) {
      i = $this.index(); //设置i的值为当前li下的位置
      $banner.css("left", -WIDTH * i); //设置banner的left属性
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    }
  });

  //左按钮
  $("#btn_lf").click(function() {
    var $this = $(this);
    if (i >0) { //如果i小于当前banner数量-1
      i--;
      $banner.css("left", -WIDTH * i); //移动banner的left值为WIDTH*i
    } else {
      $banner.css({
        //否则先把transition属性设置为空,暂时其失去过渡效果
        "transition": "",
        //让left属性瞬间回到第0个banner的位置
        left: -WIDTH*(len-1)
      });
      i = 3; //下一个轮播为第1个banner图
      //设置定时器
      setTimeout(() => {
        $banner.css({
          //恢复transition属性
          "transition": "all .3s linear",
          //并把left属性设置到WIDTH*i的位置
          "left": -WIDTH * i
        });
      }, 50);
    }
    if (i >0) {
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    } else {
      //添加第0个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    }
  });

  //右按钮
  $("#btn_rt").click(function() {
    var $this = $(this);
    if (i < len - 1) { //如果i小于当前banner数量-1
      i++;
      $banner.css("left", -WIDTH * i); //移动banner的left值为WIDTH*i

    } else {
      $banner.css({
        //否则先把transition属性设置为空,暂时其失去过渡效果
        "transition": "",
        //让left属性瞬间回到第0个banner的位置
        left: 0
      });
      i = 1; //下一个轮播为第1个banner图
      //设置定时器
      setTimeout(() => {
        $banner.css({
          //恢复transition属性
          "transition": "all .3s linear",
          //并把left属性设置到WIDTH*i的位置
          "left": -WIDTH * i
        });
      }, 50);
    }
    if (i < len - 1) {
      //添加第i个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + i + ")").addClass("hover").siblings().removeClass("hover");
    } else {
      //添加第0个li的class属性hover,并把同级兄弟的class清除
      $dot.children("li:eq(" + 0 + ")").addClass("hover").siblings().removeClass("hover");
    }
  });
  </script>
</body>

</html>
Last modification:July 2nd, 2019 at 06:49 pm

Leave a Comment