用Vue以及transition过滤制作一个简单的轮播图

由于现在Vue比较流行以及确实对数据绑定以及交互都挺不错的,所以用vue做了一个轮播图,效果图如下:

 

 

<template>
  <div class="hello">
    <div id="header-scoller" @mouseenter="hoverSlide" @mouseleave="leaveSlide">
      <ul class="slider">
          <li style="position:relative;">
            <transition :name="tn">
              <a href="#">
                <img :src="src" :key="src"/>
              </a>
            </transition>
              <!-- <img :src="src" :key="src"/> -->
          </li>
      </ul>
      <ul class="items" ref="slider">
        <li v-for="i in ns" :key="i" @mouseenter="mouseEnter(i)"></li>
      </ul>
    </div>
  </div>
</template>
<script>
export default {
  name: 'HelloWorld',
  data () {
    return {
      n: 1,
      tn: 'fade',
      intervals: '',
      ns: [1, 2, 3, 4, 5, 6],
      sliderHover: '',
      slider: ''
    }
  },
  computed: {
    src () {
      return require('../../assets/headerScoller/' + this.n + '.jpg')
    }
  },
  mounted () {
    // 获取slide数组并保存到data中复用
    this.slider = this.$refs.slider.getElementsByTagName('li')
    // 页面加载完设置第一个被选中的slide样式
    this.slider[0].className = 'sliderChanged'
    // 设置轮播图定时器
    this.intervals = setInterval(this.sliderWork, 4500)
  },
  methods: {
    // 设置当前图片的导航slide样式
    sliderWork () {
      this.slider[this.n - 1].className = ''
      this.n = this.n === 6 ? 1 : this.n += 1
      this.slider[this.n - 1].className = 'sliderChanged'
    },
    // 当鼠标悬停在slide时切换到指定的图片并清除定时器并设置具体的样式
    mouseEnter (i) {
      if (this.intervals) {
        clearInterval(this.intervals)
      }
      for (let item = 0; item < 6; item++) {
        this.slider[item].className = ''
      }
      // 设置slide样式
      this.slider[i - 1].className = 'sliderChanged'
      this.n = i
    },
    // 当鼠标悬停在slider时清除轮播图定时器
    hoverSlide () {
      if (this.intervals) {
        clearInterval(this.intervals)
      }
    },
    // 鼠标离开slider时重新设置定时器使轮播图工作
    leaveSlide () {
      if (this.intervals) {
        clearInterval(this.intervals)
      }
      this.intervals = setInterval(this.sliderWork, 4500)
    }
  },
  // 当页面被销毁前销毁定时器
  beforeDestroy () {
    clearInterval(this.intervals)
  }
}
</script>

  

<style scoped>
#header-scoller{
  min-width: 1200px;
  margin: 0;
  padding: 0;
  position:relative;
}
#header-scoller .items {
  position: absolute;
  bottom: 30px;
  height: 20px;
  width: 240px;
  margin: 0 auto;
  left: 50%;
  margin-left: -120px;
}
.sliderChanged {
  background: #3a3a3a !important;
  border: 3px solid #aaa;
  border-radius: 7px !important;
}
#header-scoller .items li {
  height: 8px;
  width: 8px;
  float: left;
  border-radius: 4px;
  background: #fff;
  margin: 0 15px;
  cursor: pointer;
}
/* 轮播图的高度以及超出高度隐藏,由于vue中transition过渡时会有两个img,不设置overflow:hidden会导致页面混乱 */
#header-scoller ul li {
  width: 100%;
  height: 550px;
  overflow: hidden;
}
/* 设置轮播图片的大小以及不变形 */
#header-scoller ul li a img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* 清除所有的浮动效果防止后面得元素布局混乱 */
#header-scoller::after {
  content: "";
  display: block;
  clear: both;
}
/* 轮播图淡入淡出样式 */
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
  position: absolute;
}
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
  opacity: .1;
}
</style>

其中特别要注意的是transition会导致轮播图在切换图片的时候滚动条会跳回顶部
这个是因为transition过滤的时候会插入一个新元素导致父元素被撑大,过渡完成之后删除元素就会导致跳回顶部,
所以需要在transition过渡期间给他加一个绝对定位

 

 图中两个样式都是transition的六个样式之一,具体了解可以看vue的官方文档

posted @ 2020-02-22 20:14  蕾姆大人  阅读(432)  评论(0编辑  收藏  举报