Rumah  >  Artikel  >  hujung hadapan web  >  用vue写一个仿简书的轮播图的示例代码

用vue写一个仿简书的轮播图的示例代码

亚连
亚连asal
2018-05-30 16:02:532124semak imbas

本篇文章主要介绍了用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下使用百度地图的简易方法

Atas ialah kandungan terperinci 用vue写一个仿简书的轮播图的示例代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn