如何使用純css實現輪播圖

知乎文章地址:https://zhuanlan.zhihu.com/p/48350702

輪播圖一直是一個很有意思的東西,之前沒有好好總結,導致一要寫的時候就要重新開始思考過程然後編碼,這是個特別煩的問題,今天就好好總結一下。

關於輪播器的一些demo,請看:

yaodebian/Carousel​github.com

因爲考慮到方法實在是太多了,這裏就以css的實現方式來進行記錄。yaodebian/Carousel因爲考慮到方法實在是太多了,這裏就以css的實現方式來進行記錄。

首先來看一下示例吧:

接下來看實現的一個思路是怎樣的吧。

首先來看一下主體的html代碼:

  <section class="slider-container">
    <!-- 輪播器 -->
    <ul class="slider">
      <li class="slider-item slider-item1"></li>
      <li class="slider-item slider-item2"></li>
      <li class="slider-item slider-item3"></li>
      <li class="slider-item slider-item4"></li>
      <li class="slider-item slider-item5"></li>
    </ul>
  </section>

上面是slider是輪播器的容器,讓我們再看一下相關的一些css樣式:

* {
  margin: 0;
  padding: 0;
}

ul,
li {
  list-style: none;
}

.slider-container {
  width: 50%;
  position: relative;
  margin: 0 auto;
}

.slider,
.slider-item {
  padding-bottom: 40%;
}

.slider-item {
  position: absolute;
  width: 100%;
  background-size: 100%;
}

.slider-item1 {
  background-image: url(imgs/1.jpg);
}

.slider-item2 {
  background-image: url(imgs/2.jpg);
}

.slider-item3 {
  background-image: url(imgs/3.jpg);
}

.slider-item4 {
  background-image: url(imgs/4.jpg);
}

.slider-item5 {
  background-image: url(imgs/5.jpg);
}

.slider-container充當容器並將其設置爲relative以充當一個定位,爲了圖片能夠自適應輪播器的寬度,我們將圖片通過background-image來進行設置,同時設置background-size爲100%。另外,設置圖片的高度顯然是不合理的,上面我們通過設置padding-bottom來顯示圖片相應高度的區域(利用背景在padding中也可以呈現)。

好了,準備到這裏,我們接下來就需要通過css設置動畫了,我們僅僅通過animation結合@keyframes就可以辦到。我們先來看一張設計圖:

因爲css不能設置每兩張的一個間隔時間,對於我們要應用的動畫,我們將每一張圖片都考慮進去。對於每一張圖片,都會經歷這樣一個過程,我們假設圖片1s內從透明過渡爲不透明,然後保持顯示狀態3秒,然後再通過1s從不透明過渡爲透明,這樣,我們在上面的圖片中進行了每張圖片的一個動畫推演,圖片2在圖片1開始隱藏時開始動畫過程,圖片3在圖片2開始隱藏時開始動畫過程,以此類推,最後發現輪播完全部5張圖片時,總共需要花費20秒,也就是說,每張圖片在完成一個動畫過程後還需要等待15s纔會重新執行該動畫過程。

所以,我們的動畫可以設置成這樣:

@keyframes fade {
  0% {
    opacity: 0;
  }

  5% {
    opacity: 1;
  }

  20% {
    opacity: 1;
  }

  25% {
    opacity: 0;
  }

  100% {
    opacity: 0;
  }
}

對輪播圖應用動畫:

.slider-item {
  position: absolute;
  width: 100%;
  background-size: 100%;
  animation: fade 20s linear;
  animation-iteration-count: infinite;
}

對每個輪播圖設置動畫延遲:

.slider-item{
  opacity:0;
}
.slider-item1{
  animation-delay: -1s;
}
.slider-item2{
  animation-delay: 3s;
}
.slider-item3{
  animation-delay: 7s;
}
.slider-item4{
  animation-delay: 11s;
}
.slider-item5{
  animation-delay: 15s;
}

一開始大家都是透明的,另外因爲一開始圖片1當然是顯示的,所以它的延遲爲-1,即透明度一開始爲1。

通過上面的設置就可以實現基本的輪播動畫效果了。

最後,爲了給輪播進行一個標識,就是我當前是輪播到第幾張圖片了,以及總共有多少張輪播圖片,我們可以對輪播器添加焦點標識(原理和上面的輪播一樣的啦):

  <section class="slider-container">
    <!-- 輪播器 -->
    <ul class="slider">
      <li class="slider-item slider-item1"></li>
      <li class="slider-item slider-item2"></li>
      <li class="slider-item slider-item3"></li>
      <li class="slider-item slider-item4"></li>
      <li class="slider-item slider-item5"></li>
    </ul>
    <!-- 輪播焦點 -->
    <div class="focus-container">
      <ul class="floatfix">
        <li>
          <div class="focus-item focus-item1"></div>
        </li>
        <li>
          <div class="focus-item focus-item2"></div>
        </li>
        <li>
          <div class="focus-item focus-item3"></div>
        </li>
        <li>
          <div class="focus-item focus-item4"></div>
        </li>
        <li>
          <div class="focus-item focus-item5"></div>
        </li>
      </ul>
    </div>
  </section>

css樣式:

.focus-container{
  position:absolute;
  bottom:2%;
  z-index:7;
  left:50%;
  margin-left: -45px;
}
.focus-container li{
  width:10px;
  height:10px;
  border-radius:50%;
  float:left;
  margin-right:10px;
  background:#fff;
}
.focus-item{
  width:100%;
  height:100%;
  opacity: 0;
  background:#51B1D9;
  border-radius:inherit;
  animation-duration: 20s;
  animation-timing-function: linear;
  animation-name:fade;
  animation-iteration-count: infinite;
}
.focus-item1{
  animation-delay: -1s;
}
.focus-item2{
  animation-delay: 3s;
}
.focus-item3{
  animation-delay: 7s;
}
.focus-item4{
  animation-delay: 11s;
}
.focus-item5{
  animation-delay: 15s;
}

最後,完整的代碼詳見:

https://github.com/yaodebian/Carousel/tree/master/%E7%BA%AFcss%E5%AE%9E%E7%8E%B0%E8%BD%AE%E6%92%AD%E6%95%88%E6%9E%9C/demo1​github.com

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章