Vue2首页banner轮播

简介: 这篇文章介绍了如何在Vue 2框架中创建一个首页轮播图(Banner)组件,允许自定义轮播数据、切换间隔、宽度和高度,并提供了组件的实现代码和使用示例。

可自定义设置以下属性:

  • banner数组(bannerData)
  • 切换间隔(interval),默认3000ms
  • 宽度(width),默认100%
  • 高度(height),默认600px

效果如图:

69028166c2a9711ee4d5c2b1482460d9.png

①创建Banner.vue组件:

<template>
  <div class="m-banner-wrap" :style="`width: ${width}; height: ${height}`" v-if="bannerData.length">
    <div class="m-banner-list">
      <div
        class="u-banner-item fade"
        v-for="(item, index) in bannerData"
        :key="index"
        v-show="index===activeIndex"
        :style="`background: url(${item.imgUrl}) no-repeat center; background-size: cover;`"
        @mouseenter="onStop" @mouseleave="onStart">
        <a :href="item.link" target="_blank"></a>
      </div>
    </div>
    <div class="m-dot-list" v-if="bannerData.length > 1">
      <div v-for="n of bannerData.length" :key="n" :class="['u-dot-item', {active: (n-1)===activeIndex}]" @mouseenter="onEnter(n-1)">
      </div>
    </div>
  </div>
</template>
<script>
export default {
  name: 'Banner',
  props: {
    bannerData: { // banner数组
      type: Array,
      default: () => {
        return []
      }
    },
    interval: { // 切换间隔ms
      type: Number,
      default: 3000
    },
    width: { // 宽度
      type: String,
      default: '100%'
    },
    height: { // 高度
      type: String,
      default: '600px'
    }
  },
  data () {
    return {
      activeIndex: 0,
      timer: null
    }
  },
  mounted () {
    setTimeout(() => {
      this.onStart()
    }, 1000)
    window.onfocus = () => { // 页面激活
      this.onStart()
    }
    window.onblur = () => { // 页面失焦
      this.onStop()
    }
  },
  methods: {
    onStart () {
      clearInterval(this.timer)
      if (this.bannerData.length > 1) {
        this.timer = setInterval(this.onMove, this.interval)
      }
    },
    onStop () {
      clearInterval(this.timer)
    },
    onEnter (index) {
      clearInterval(this.timer)
      this.activeIndex = index
      this.onStart()
    },
    onMove () {
      if (this.activeIndex === this.bannerData.length - 1) {
        this.activeIndex = 0
      } else {
        this.activeIndex++
      }
    }
  },
  beforeDestroy () {
    clearInterval(this.timer)
    this.timer = null
  }
}
</script>
<style lang="less" scoped>
@themeColor: #1890FF;
.m-banner-wrap {
  width: 100%;
  height: 585px;
  min-width: 1200px;
  margin: 0 auto;
  overflow: hidden;
  position: relative;
  z-index: 9;
  .m-banner-list {
    height: 100%;
    .u-banner-item {
      min-width: 1200px;
      height: 100%;
      width: 100%;
      a {
        display: block;
        height: 100%;
      }
    }
    .fade { // 切换banner时的过渡效果
      -webkit-animation: fadein 0.3s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
      animation: fadein 0.3s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
    }
    @-webkit-keyframes fadein {
      0% {
        opacity: 0;
      }
      100% {
        opacity: 1;
      }
    }
    @keyframes fadein {
      0% {
        opacity: 0;
      }
      100% {
        opacity: 1;
      }
    }
  }
  .m-dot-list {
    width: 100%;
    line-height: 4px;
    position: absolute;
    bottom: 65px;
    text-align: center;
    .u-dot-item { // 圆点样式
      display: inline-block;
      width: 36px;
      height: 4px;
      background: #E3E3E3;
      border-radius: 1px;
      vertical-align: bottom;
      cursor: pointer;
      &:not(:last-child) {
        margin-right: 10px;
      }
    }
    .active { // 圆点选中样式
      background: @themeColor;
    }
  }
}
</style>

②在要使用的页面引入:

<Banner :bannerData="bannerData" :interval="3000"/>
import Banner from '@/components/Banner'
components: {
    Banner
}
bannerData: [
    {
        title: 'image-1',
        link: 'javascript:;',
        imgUrl: require('@/assets/images/1.jpg')
    },
    {
        title: 'image-2',
        link: 'javascript:;',
        imgUrl: require('@/assets/images/2.jpg')
    },
    {
        title: 'image-3',
        link: 'javascript:;',
        imgUrl: require('@/assets/images/3.jpg')
    }
]

相关文章
|
7月前
uniapp Vue3 面包屑导航 带动态样式
uniapp Vue3 面包屑导航 带动态样式
143 1
vue3进入页面全屏
vue3进入页面全屏
203 0
|
3月前
|
JavaScript 索引
轮播图,用vue来写一个简单的轮播图
本文介绍了如何使用Vue.js编写一个简单的轮播图功能,包括左右箭头的点击事件处理和使用v-bind、v-show指令进行图片地址绑定和箭头显示隐藏的逻辑。
轮播图,用vue来写一个简单的轮播图
|
4月前
|
前端开发 JavaScript
Vue2瀑布流图片展示(Waterfall)
这篇文章介绍了如何在Vue 3框架中实现瀑布流图片展示组件,提供了两种实现方式:一种使用CSS的`column-count`和`column-gap`属性,另一种使用JavaScript计算图片位置,以实现图片在多列中的动态分布。
290 1
Vue2瀑布流图片展示(Waterfall)
|
2月前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day03【20.获取Banner轮播图的数据+21.使用swiper轮播图插件】
vue尚品汇商城项目-day03【20.获取Banner轮播图的数据+21.使用swiper轮播图插件】
42 0
|
4月前
|
JavaScript
SpringBoot+Vue+ElementUI 实现视频播放 轮播图效果
这篇文章介绍了如何在SpringBoot+Vue+ElementUI项目中使用vue-awesome-swiper插件实现视频播放轮播图效果,包括安装插件、引入项目和使用案例的步骤。
SpringBoot+Vue+ElementUI 实现视频播放 轮播图效果
|
4月前
|
JavaScript
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
这篇文章介绍了在Vue中如何使用Swiper插件创建轮播图,解决Swiper左右切换按钮不生效的问题,并展示了如何将Swiper轮播图抽离成一个可复用的公共组件,同时提供了详细的安装、配置和优化建议。
在Vue中使用Swiper轮播图、同时解决点击轮播图左右切换按钮不生效的问题、同时将轮播图抽离出为一个公共组件
|
5月前
|
开发框架 JavaScript 前端开发
循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示
循序渐进BootstrapVue,开发公司门户网站(4)--- 使用b-carousel-slide组件实现图片轮播以及vue-awesome-swiper实现图片滑动展示
|
5月前
|
JavaScript
Vue 轮播图
Vue 轮播图
43 4