Vue实现可复用轮播组件的方法

本文用vue简单的实现了一个轮播图的基础功能,并抽离出来作为一个公共组件,方便复用

html和js部分

<template>
  <div
    class="img-box"
    ref="img-box"
    :style="{width: styles.width, height: styles.height}"
  >
    <div v-for="(item, index) in imgList"
         :key="index"
         class="img-item"
         :ref="'img-item-' + index"
         :class="{'active': index === active}"
    >
      <img
        :src="item"
        style="width:100%"
        :style="{height: styles.height}"
      />
    </div>
    <div
      class="img-position"
      v-if="isShowPosition"
    >
      <template v-for="(item, index) in imgList">
        <span :key="index"
              class="img-position-item"
              :ref="'img-position-' + index"
              :class="[
                {'active': index === active},
                isCircle ? 'circle' : '',
                isNums ? 'nums' : ''
              ]"
              @click="clickSpan(index)"
        >
          {{isNums ? index + 1 : ''}}
        </span>
      </template>
    </div>
    <div
      class="left-btn"
      v-if="isShowLeftOrRightBtn"
      @click="clickBtn('left')"
    >
      <i class="iconfont roll-zuo"></i>
    </div>
    <div
      class="right-btn"
      v-if="isShowLeftOrRightBtn"
      @click="clickBtn('right')"
    >
      <i class="iconfont roll-you"></i>
    </div>
  </div>
</template>

<script>
export default {
  name: 'Roll',
  props: {
    imgList: { // 图片列表 src数组
      type: Array,
      default: () => []
    },
    isShowPosition: { // 是否显示下方小圆点
      type: Boolean,
      default: true
    },
    positionInner: { // 圆点内容
      type: String,
      default: 'circle' // 默认圆点,可选值 circle => 圆点 num => 数字 both => 圆点+数字
    },
    isShowLeftOrRightBtn: { // 是否显示左右按钮
      type: Boolean,
      default: true
    },
    duration: { // 切换间隔
      type: [Number, String],
      default: 3000
    },
    styles: { // 自定义轮播图片宽高 默认500*300
      type: Object,
      default: () => {
        return {
          width: '500px',
          height: '300px'
        }
      }
    }
  },
  data () {
    return {
      active: 0, // 当前轮播图片
      timer: null // 定时器
    }
  },
  computed: {
    isCircle () {
      return ['circle', 'both'].includes(this.positionInner)
    },
    isNums () {
      return ['num', 'both'].includes(this.positionInner)
    }
  },
  updated () {
    if (this.timer) this.clearTimer()
    this.setTimer()
  },
  created () {
    this.setTimer()
  },
  methods: {
    clickSpan (index) {
      this.clearTimer()
      this.active = index
    },
    clickBtn (arg) {
      this.clearTimer()
      if (arg === 'left') {
        this.active = this.active - 1 < 0 ? this.imgList.length - 1 : this.active - 1
      } else {
        this.active = this.active + 1 === this.imgList.length ? 0 : this.active + 1
      }
      this.setTimer()
    },
    setTimer () {
      this.timer = setInterval(() => {
        this.clickBtn('right')
      }, Number(this.duration))
    },
    clearTimer () {
      clearInterval(this.timer)
      this.timer = null
    }
  }
}
</script>

css样式部分

<style scoped>
@import url('//at.alicdn.com/t/font_1451815_senarwrqu6.css');
* {
  margin: 0;
  padding: 0;
}
.img-box {
  position: relative;
  margin: 0 auto;
}
.img-item {
  height: 100%;
  width: 100%;
  opacity: 0;
  position: absolute;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  z-index: -5;
  text-align: center;
}
.img-item.active {
  z-index: 0;
  opacity: 1;
  transition: .3s;
}
.img-position {
  position: absolute;
  bottom: 5px;
  left: 50%;
  display: flex;
  transform: translate(-50%, 0);
}
.img-position-item {
  display: inline-block;
  width:10px;
  height:10px;
  box-sizing: border-box;
  cursor: pointer;
}
.img-position-item.circle {
  border-radius: 50%;
  border: 1px solid #606266;
}
.img-position-item.nums {
  width: 18px;
  height: 18px;
  display: flex;
  justify-content: center;
  align-items: center;
  color: #606266;
  font-size:14px;
}
.img-position-item:hover, .img-position-item.active {
  border-color: #d1d2d3;
  color: #d1d2d3;
  transition: .3s;
}
.img-position-item + .img-position-item {
  margin-left: 10px;
}
.left-btn, .right-btn {
  position: absolute;
  top: 50%;
  bottom: 0;
  width: 20px;
  height: 30px;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  color: #d1d2d3;
  font-size: 20px;
  transform: translate(0, -50%);
}
.left-btn:hover, .right-btn:hover {
  color: #fff;
  transition: .3s;
}
.left-btn {
  left: 5px;
}
.right-btn {
  right: 5px;
}
</style>

只是简单的实现了一个轮播图比较基础的部分,之前用原生写了一遍,现在用vue写一遍作为一个组件,也还不错。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于vue实现swipe轮播组件实例代码

    项目背景 图片轮播是前端项目必有项,当前有很多效果很酷炫的轮播插件,例如Swiper. 但是当项目中的图片轮播只需要一个很简单的轮播样式,比如这样的 我们引用这样一个110k的大插件,就大材小用了.再安利一下,swiper2.x和swiper3.x对移动和PC端支持情况如下图 当当当当~~~ 我们今天的主角登场了,thebird/Swipe,这个插件完成了图片轮播需要的基本功能,只有14.2k,真真的轻量级 啊.还有,还有 翻译一下,就是俺们全支持,不管你是PC端(IE7+)还是移动端浏览器.此

  • 利用Vue实现移动端图片轮播组件的方法实例

    前言 轮播图的插件也有很多,用jQuery写起来也不难,这里分享的是关于利用Vue实现移动端图片轮播组件的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: wc-swiper 基于 Vue 的移动端的图片轮播组件. Why 之前一直在用 vue-awesome-swiper, 功能很齐全, 但是唯一的问题就是体积比较大. 我只是想要一个简单的图片轮播, 但是却要引入 100多k 大小的文件, 这样是不对的. 特点 支持自动播放 & 无限轮播 (loop) 效果 支持用户滑

  • 基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能

    VueSliderShow故名思意,vue的轮播图组件插件,该插件: 1.支持浏览器任意放缩,兼容移动端, 2.支持自动切换,鼠标经过停止切换,分页/任意页点击切换,左右切换, 3.支持文字介绍(超过一行自动省略) 本文讲述的是从开发一款基于Vue2x的响应式自适应轮播组件插件的一个全过程,包含发布到npm,构建自己的npm包,供下载安装使用的技巧,阅读本文需要些Vue的语法糖(自定义标签.计算属性.父子组件通信等),以及ES6.npm等基础知识.先来看下Demo 示例源码地址 Install

  • vue移动端轻量级的轮播组件实现代码

    一个简单的移动端卡片滑动轮播组件,适用于Vue2.x c-swipe 2.0 全新归来.重写了全部的代码,更靠谱的质量,更优秀的性能 English Document 安装 npm install c-swipe --save 使用 注册组件 // main.js // 引入 c-swipe 主文件 import 'c-swipe/dist/swipe.css'; import { Swipe, SwipeItem } from 'c-swipe'; // 全局注册组件 Vue.componen

  • 基于vue.js轮播组件vue-awesome-swiper实现轮播图

    一般做移动端轮播图的时候,最常用的就是Swiper插件了,而vue.js也有一个轮播组件vue-awesome-swiper,用法跟swiper相似. 1.安装vie-awesome-swiper nam install vue-awesome-swiper --save-dev 2.引用vie-awesome-swiper组件,这里我是用vie-cli创建的项目,在main.js: import VueAwesomeSwiper from 'vue-awesome-swiper'; Vue.u

  • 使用Vue制作图片轮播组件思路详解

    之前一直都没有认真的写过一个组件.以前在写业务代码的过程中,都是用的别人封装好的组件,这次尝试着写了一个图片轮播组件,虽然比不上知名的轮播组件,但它的功能基本完整,而且在写这个组件的过程中,学的东西也很多,在这里也给大家分享出来,如有疏漏,欢迎指正! 在制作这个组件之前,笔者google了不少关于轮播的文章,发现实现一个轮播的思路虽然各有不同,但是大的逻辑其实差不多,本文主要依据慕课网上焦点轮播图特效这节课,不过慕课网主要用原生JS写,而笔者则用Vue进行了重构,并且进行了一点修改.完成后的组件

  • vue轮播组件实现$children和$parent 附带好用的gif录制工具

    1.先提前预祝大家国庆节玩的愉快,我国庆要见家长去了(忐忑) 2.忍不住想要为小米正名,虽然我是米粉但是我是理智粉. 24号不是mix alpha发布会啊,看了真滴是惊艳(现场直接有人喊" 牛逼 ",看过好多发布会,就没有看到这样直接喊出来"牛逼"的).不知道大家还记不记得13年那会吹苹果的时候的一块ppt手机(其实是媒体做的图),但是现在小米做出来了,甚至更好.但是我最近在uc上面那真是到处黑.以前我不相信水军说法,现在信了.如果关注小米mix alpha新闻的在

  • Vue实现图片轮播组件思路及实例解析

    1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内容. 2.每学一个新东西 ,图片轮播都是很好的练手案例,而且,也很实用. 3.基本要求:页面加载,自动播放.鼠标悬停,停止播放.鼠标离开,继续播放 点击左右箭头切换上一张,下一张图片. 下方小圆点显示当前位第几张图片. 4.使用Vue实现 5.示例代码 结构html: <template> <

  • 解决vue使用vant轮播组件swipe + flex时文字抖动问题

    原抖动效果 改后效果 解决方法 在外层容器的css里加上:transform: translateZ(0); 部分页面代码 <van-swipe-item v-for="(item,index) in meetingList" :key="index"> <div class="d-meet-top"> <div> <van-icon name="clock" class="

  • Vue实现可复用轮播组件的方法

    本文用vue简单的实现了一个轮播图的基础功能,并抽离出来作为一个公共组件,方便复用 html和js部分 <template>   <div     class="img-box"     ref="img-box"     :style="{width: styles.width, height: styles.height}"   >     <div v-for="(item, index) in im

  • 使用JSX实现Carousel轮播组件的方法(前端组件化)

    在我们用 JSX 建立组件系统之前,我们先来用一个例子学习一下组件的实现原理和逻辑.这里我们就用一个轮播图的组件作为例子进行学习.轮播图的英文叫做 Carousel,它有一个旋转木马的意思. 上一篇文章<使用 JSX 建立 Markup 组件风格>中我们实现的代码,其实还不能称为一个组件系统,顶多是可以充当 DOM 的一个简单封装,让我们有能力定制 DOM. 要做这个轮播图的组件,我们应该先从一个最简单的 DOM 操作入手.使用 DOM 操作把整个轮播图的功能先实现出来,然后在一步一步去考虑怎

  • Vue Echarts实现图表轮播图以及图表组件封装和节流函数优化讲解

    目录 一.为什么要优雅的使用echarts 二.最初的表格组件 三.初步的封装 四.性能优化 一.为什么要优雅的使用echarts 为了提高代码的规范性.复用性,vue中最常用的就是将具有某些功能的代码封装到一个插件.如果没有对插件进行封装,在后期使用插件的时候效率会十分低下也不便于后期对程序的维护拓展,在优雅的使用echarts时,首先,我们考虑到多个地方需要用到echarts,就需要封装一个组件出来,由于每一个图中的属性均由配置项option进行控制,所以我们可以将option选项提取出来,

  • VUE开发一个图片轮播的组件示例代码

    本人刚学习vue,用vue做了个图片轮播,下面我来记录一下,有需要了解VUE开发一个图片轮播的组件的朋友可参考.希望此文章对各位有所帮助. 完成效果图如下: vue开发的思路主要是数据绑定,代码如下: <template> <div ref="root" style="user-select: none;-webkit-user-select: none;overflow: hidden"> <div class="slide

随机推荐