JavaScript 自適應輪播圖


代碼

話不多說,先上代碼,方便復制粘貼。演示

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>輪播圖</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    ul {
      list-style: none;
    }

    img {
      display: block;
      width: 100%;
      height: 100%;
    }

    .content {
      width: 1080px;
      margin: 100px auto;
    }

    .banner {
      position: relative;
      overflow: hidden;
    }

    .banner>div {
      width: 790px;
      position: absolute;
      transform: translateX(140px) scale(0.8);
      transform-origin: center bottom;
      transition: .4s;
    }

    .banner .first_item {
      z-index: 10;
      transform: translateX(140px) scale(1);
    }

    .banner .second_item {
      z-index: 1;
      transform: translateX(540px) scale(0.8);
    }

    .banner .last_item {
      z-index: 1;
      transform: translateX(-250px) scale(0.8);
    }

    /* 左右切換按鈕 */
    .btn {
      width: 40px;
      height: 40px;
      position: absolute;
      top: 60%;
      margin-top: -20px;
      background-color: rgba(0, 0, 0, 0.2);
      z-index: 1;
      text-align: center;
      color: rgba(255, 255, 255, 0.6);
      line-height: 40px;
      font-size: 20px;
      font-style: normal;
      cursor: pointer;
      user-select: none;
    }

    .btn_right {
      right: 0;
    }

    .btn:hover {
      background-color: rgba(0, 0, 0, 0.4);
      color: rgba(255, 255, 255, 1);
    }

    /* banner狀態點 */
    .track {
      display: flex;
      justify-content: center;
      overflow: hidden;
    }

    .track>span {
      display: block;
      width: 25px;
      height: 4px;
      background-color: #ccc;
      float: left;
      margin: 10px 6px;
      transition: .4s;
    }

    .track .focus {
      background-color: #c60023;
      transform: scale(1.2);
    }
  </style>
</head>

<body>
  <div class="content">
    <div class="banner">
      <div class="first_item">
        <a href="#"><img src="img/banner/banner1.jpg" alt=""></a>
      </div>
      <div class="second_item">
        <a href="#"><img src="img/banner/banner2.jpg" alt=""></a>
      </div>
      <div class="">
        <a href="#"><img src="img/banner/banner3.jpg" alt=""></a>
      </div>
      <div class="">
        <a href="#"><img src="img/banner/banner4.jpg" alt=""></a>
      </div>
      <div class="last_item">
        <a href="#"><img src="img/banner/banner5.jpg" alt=""></a>
      </div>
      <!-- 這里切換按鈕用大於小於號代替,如果自己有icon圖標自行替換 -->
      <i class="btn_left btn"><</i>
      <i class="btn_right btn">></i>
    </div>
    <div class="track"></div>
  </div>
  <script>
    window.onload = function () {
      // 獲取節點,變量聲明
      var banner = document.querySelector('.banner'),
        btn_left = document.querySelector('.btn_left'),
        btn_right = document.querySelector('.btn_right'),
        track = document.querySelector('.track'),
        list_items = banner.querySelectorAll('div'),
        listArr = [],
        index = 0,
        trackHtml = '',
        tracks,
        timer;
      // 初始化
      function init() {
        // 根據圖片高度自適應
        banner.style.height = list_items[0].offsetHeight + 'px';
        // 生成track坐標點元素
        for (var i = 0, len = list_items.length; i < len; i++) {
          listArr.push(list_items[i].className)
          trackHtml += '<span></span>'
        }
        track.innerHTML = trackHtml;
        // 獲取坐標點元素
        tracks = track.querySelectorAll('span');
        tracks[0].setAttribute('class', 'focus');
        play();
      }
      // 切換動畫 target=1 下一張 target=-1 上一張
      function move(target) {
        list_items.forEach((item, i) => {
          item.setAttribute('class', listArr[i])
        });
        // 計算index下標值
        index = (index + listArr.length + target) % listArr.length;
        tracks.forEach((item, i) => {
          item.setAttribute('class', '')
        });
        tracks[index].setAttribute('class', 'focus')
      }
      // 下一張
      function next() {
        listArr.unshift(listArr[listArr.length - 1]);
        listArr.pop();
        move(1)
      }
      // 上一張
      function previous() {
        listArr.push(listArr[0]);
        listArr.shift();
        move(-1)
      }
      // 自動輪播
      function play() {
        timer = setInterval(next, 4000);
      }
      // 下一張綁定點擊事件
      btn_right.onclick = function () {
        clearInterval(timer);
        next();
        play();
      };
      // 上一張綁定點擊事件
      btn_left.onclick = function () {
        clearInterval(timer);
        previous();
        play();
      };
      // track綁定點擊事件
      track.addEventListener('click', function (e) {
        var e = e || window.e,
          //標准瀏覽器用ev.target,IE瀏覽器用event.srcElement
          target = e.target || e.srcElement,
          n = 0;
        if (target.className !== 'track') {
          clearInterval(timer);
          for (var i = 0, len = tracks.length; i < len; i++) {
            tracks[i].setAttribute('class', '')
            if (tracks[i] === target) {
              n = i;
              tracks[i].setAttribute('class', 'focus');
            }
          }
          // 向右滑動
          if (n - index >= 0) {
            for (var i = 0; i < n - index; i++) {
              setTimeout(next, 160 * i);
            }
          }
          // 向左滑動
          else {
            for (var i = 0; i < index - n; i++) {
              setTimeout(previous, 160 * i);
            }
          }
          play();
        }
      })
      init();
    }
  </script>
</body>

</html>

前言

這里是我按照自己的想法寫的一個原生javascript輪播圖,給初學者提供一個思路。寫輪播圖的方法有很多,這里只是其中一種,最重要的還是能學有所得,舉一反三。

效果

0.PNG

思路

大部分輪播圖都是通過banner左右移動的,這里用的是固定css布局,通過改變class來實現輪播的效果。

注意

本篇文章僅供學習使用,並未做瀏覽器兼容處理,建議使用谷歌或者第三方最新瀏覽器,對於IE這個神經病,不用也罷。

說明

這里簡要說明一些問題,其實代碼里大部分都注釋過了。

這里的css樣式部分,選擇器一定要加上.banner,否則會有權重問題導致無法覆蓋上面的css樣式。

.banner .first_item{
  z-index: 10;
  transform: translateX(140px) scale(1);
}
.banner .second_item{
  z-index: 1;
  transform: translateX(540px) scale(0.8);
}
.banner .last_item{
  z-index: 1;
  transform: translateX(-250px) scale(0.8);
}

方法一的狀態點用的是flex布局做的自適應,也可以使用方法二,但是兼容性貌似還不如方法一,win10自帶的瀏覽器都不支持,索性就用了flex布局。

//方法一
.track{
  display: flex;
  justify-content: center;
  overflow: hidden;
}
//方法二
.track{
  width: fit-content;
  margin: auto;
  overflow: hidden;
}

這里注意要保留前兩個和最后一個div的class名(也就是first_itemsecond_itemlast_item),中間可以自適應隨意添加圖片,最少三張。有人可能會有疑惑,為什么不自動生成class名?這樣就可以隨意添加了,答案是:懶得寫了,如果自己感興趣,可以自己去改造。

<div class="first_item">
  <a href="#"><img src="img/banner/banner1.jpg" alt=""></a>
</div>
<div class="second_item">
  <a href="#"><img src="img/banner/banner2.jpg" alt=""></a>
</div>
<div class="">
  <a href="#"><img src="img/banner/banner3.jpg" alt=""></a>
</div>
<div class="">
  <a href="#"><img src="img/banner/banner4.jpg" alt=""></a>
</div>
<div class="last_item">
  <a href="#"><img src="img/banner/banner5.jpg" alt=""></a>
</div>

track綁定點擊事件函數使用了事件委托,其中的這種切換方式我覺得是最和諧的,也可以用其他的方法。

//向右滑動
if(n-index >= 0){
  for(var i = 0; i < n-index; i ++){
    setTimeout(next, 160*i);
  }
}
//向左滑動
else{
  for(var i = 0; i < index-n; i ++){
    setTimeout(previous, 160*i);
  }
}
play();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM