首頁 >web前端 >js教程 >用vue寫一個仿簡書的輪播圖的範例程式碼

用vue寫一個仿簡書的輪播圖的範例程式碼

亚连
亚连原創
2018-05-30 16:02:532133瀏覽

本篇文章主要介紹了用vue寫一個仿簡書的輪播圖的範例程式碼,現在分享給大家,也給大家做個參考。

1.先展示最終效果:

#2.解決想法

Vue的理念是以資料驅動視圖,所以拒絕透過改變元素的margin-top來實現滾動效果。寫好css樣式,只要改變每張圖片的class即可達到輪播效果。動畫效果交給transition完成。輪播圖可以看成兩個(mainSlide和extraSlide),各個圖片的位置如圖所示:


3.程式碼實作

各個slide的樣式:

$width: 800px;   // 容器宽度
$height: 300px;   // 容器高度
$bWidth: 500px;   // 大图片宽度
$sWidth: $width - $bWidth; // 小图片宽度
$sHeight: $height / 2; // 小图片高度
#slider-wrapper{
  width: $width;
  height: $height;
  margin: 0 auto;
  cursor: pointer;
  background: #ddd;
  border-radius: 5px;
  box-shadow: 0 1px 6px rgba(0,0,0,0.117647), 0 1px 4px rgba(0,0,0,0.117647);
  display: flex;
  overflow: hidden;
  p{
    display: inline-block;
  }
}
.main-slide{
  width: $bWidth;
  height: $height;
  float: left;
  transition: all .4s ease;
}
.extra-slide{
  width: $sWidth;
  position: relative;
  .extra-slide-item{
    position: absolute;
    width: $sWidth;
    height: $sHeight;
    left: 0;
    transition: .4s ease-out;
  }
  .extra-slide-top{
    top: -$sHeight;
  }
  .extra-slide-middle-first{
    top: 0;
    z-index: 2
  }
  .extra-slide-middle-second{
    top: $sHeight;
    z-index: 2
  }
  .extra-slide-bottom{
    top: $height
  }
  .extra-slide-hide{
    display: none!important;
  }
}

#範本包含兩個輪播圖:

<p id="slider-wrapper" @mouseover="stop" @mouseout="start">
  <!-- 轮播图1,mainSlide -->
  <p class="main-slide" :style="`background: url(${slideConfig[nowIndex].src})`"></p>
  <!-- 轮播图2,extraSlide -->
  <p class="extra-slide">
    <p class="extra-slide-item" :class="slideClass(i)" v-for="(v, i) in slideConfig" :key="i" :style="`background: url(${v.src}); background-size: cover`"></p>
  </p>
</p>

scripts部分,設定一個nowIndex,定時改變nowIndex。所有圖片的class都根據這個nowIndex來變化,這裡使用了es6的map類型,詳情點擊:http://www.jb51.net/article/111734.htm

export default {
  name: &#39;slider&#39;,
  data: function() {  
    return {
      slideInterval: null,
      nowIndex: 0,
      slideLength: this.slideConfig.length
    }
  },
  props: {
    slideConfig: {
      type: Array
    }
  },
  methods: {
    // 限制index不能超出图片列表长度
    resetIndex(i) {
      return i > this.slideLength - 1 ? i - this.slideLength : i
    },
    slideClass(i) {
      let nowIndex = this.nowIndex
      // Map就是key也可以是非字符串的对象,不用Map多写几个 if else 也可以
      let map = new Map([
        [this.resetIndex(nowIndex), &#39;extra-slide-top&#39;],
        [this.resetIndex(nowIndex + 1), &#39;extra-slide-middle-first&#39;],
        [this.resetIndex(nowIndex + 2), &#39;extra-slide-middle-second&#39;],
        [this.resetIndex(nowIndex + 3), &#39;extra-slide-bottom&#39;]
      ])
      // 图片的class根据nowIndex的变化而变化
      return map.get(i) ? map.get(i) : &#39;extra-slide-hide&#39;
    },
    start() {
      // 定时改变nowIndex
      this.slideInterval = setInterval(() => {
        this.nowIndex = this.nowIndex > this.slideLength - 2 ? 0 : this.nowIndex + 1
        console.log(this.nowIndex)
      }, 2000)
    },
    stop() {
      clearInterval(this.slideInterval)
      this.slideInterval = null
    }
  },
  mounted() {
    this.start()
  },
  destroyed() {
    this.stop()
  }
}

slideConfig,元件的props:

const prefix = &#39;/src/assets/&#39;
const slideConfig = [{
 src: prefix + &#39;s1.jpg&#39;,
 title: &#39;图1&#39;,
 desc: &#39;说明1&#39;
}, {
 src: prefix + &#39;s2.jpg&#39;,
 title: &#39;图2&#39;,
 desc: &#39;说明2&#39;
}, {
 src: prefix + &#39;s3.jpg&#39;,
 title: &#39;图3&#39;,
 desc: &#39;说明3&#39;
}, {
 src: prefix + &#39;s4.jpg&#39;,
 title: &#39;图4&#39;,
 desc: &#39;说明4&#39;
}, {
 src: prefix + &#39;s5.jpg&#39;,
 title: &#39;图5&#39;,
 desc: &#39;说明5&#39;
}, {
 src: prefix + &#39;s6.jpg&#39;,
 title: &#39;图6&#39;,
 desc: &#39;说明6&#39;
}]
export default slideConfig

使用:

##
<slider :slideConfig="slideConfig" />

#上面是我整理給大家的,希望未來會對大家有幫助。

相關文章:
詳解Vue文件中幾個易忽略部分的剖析


在vue中使用jointjs的方法


淺談Vue下使用百度地圖的簡易方法

## ###

以上是用vue寫一個仿簡書的輪播圖的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn