Vue3.0手写轮播图效果

 更新时间:2021年10月28日 17:12:44   作者:Youyzq  
这篇文章主要为大家详细介绍了Vue3.0手写轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Vue3.0手写轮播图效果的具体代码,供大家参考,具体内容如下

让我们开始把

html结构

<template>
  <div class="xtx-carousel" @mouseleave="enterFn" @mouseenter="leaveFn">
    <ul class="carousel-body">
      <li class="carousel-item " :class="{ fade: indexid === index }" v-for="(item, index) in list" :key="item.id">
        <RouterLink to="/">
          <img :src="item.imgUrl" alt="" />
        </RouterLink>
      </li>
    </ul>
    <a href="javascript:;" class="carousel-btn prev" @click="lastPage"><i class="iconfont icon-angle-left"></i></a>
    <a href="javascript:;" class="carousel-btn next" @click="nextPage"><i class="iconfont icon-angle-right"></i></a>
    <div class="carousel-indicator">
      <span @click="indexid = i - 1" v-for="i in list.length" :key="i" :class="{ active: indexid === i - 1 }"></span>
    </div>
  </div>
</template>

js语法

<script>
import { ref, watch, onUnmounted } from 'vue'
export default {
  name: 'Carousel',
  props: {
    // 图片数据
    list: {
      type: Object,
      default: () => {}
    },
    // 轮播图每张切换的事件
    duration: {
      type: Number,
      default: 2
    },
    // 是否开启轮播图
    autoplay: {
      type: Boolean,
      default: true
    },
    // 点击翻几张
    page: {
      type: Number,
      default: 1
    }
  },
  setup(props) {
    // 索引
    const indexid = ref(0)
    // 轮播
    const timer = ref(null)
    const TimeFn = () => {
      clearInterval(timer)
      // 每次执行前都清除上一次的定时器
      timer.value = setInterval(() => {
        indexid.value++
        // 如果超出界限就重新回填
        if (indexid.value > props.list.length - 1) {
          indexid.value = 0
        }
      }, props.duration * 1000)
    }
    // 点击+下一站图片
    const nextPage = () => {
      indexid.value += props.page
      if (indexid.value > props.list.length - 1) {
        indexid.value = 0
      }
    }
    // 点击+上一张图片
    const lastPage = () => {
      indexid.value -= props.page
      if (indexid.value < 0) {
        indexid.value = props.list.length - 1
      }
    }
    // 清除定时器
    const leaveFn = () => {
      // console.log('清除定时器')
      clearInterval(timer.value)
      // console.log(timer)
    }
    // 组件消耗,清理定时器
    onUnmounted(() => {
      clearInterval(timer.value)
    })
    // 开启定时器
    const enterFn = () => {
      if (props.list.length > 1 && props.autoplay) {
        // console.log('开启定时器')
        TimeFn()
      }
    }
    watch(
      () => props.list,
      () => {
        if (props.list.length > 1 && props.autoplay) {
          TimeFn()
        }
      }
    )
    return { indexid, leaveFn, enterFn, nextPage, lastPage }
  }
}
</script>

css样式

<style scoped lang="less">
.xtx-carousel {
  width: 100%;
  height: 100%;
  min-width: 300px;
  min-height: 150px;
  position: relative;
  .carousel {
    &-body {
      width: 100%;
      height: 100%;
    }
    &-item {
      width: 100%;
      height: 100%;
      position: absolute;
      left: 0;
      top: 0;
      opacity: 0;
      transition: opacity 0.5s linear;
      &.fade {
        opacity: 1;
        z-index: 1;
      }
      img {
        width: 100%;
        height: 100%;
      }
    }
    &-indicator {
      position: absolute;
      left: 0;
      bottom: 20px;
      z-index: 2;
      width: 100%;
      text-align: center;
      span {
        display: inline-block;
        width: 12px;
        height: 12px;
        background: rgba(0, 0, 0, 0.2);
        border-radius: 50%;
        cursor: pointer;
        ~ span {
          margin-left: 12px;
        }
        &.active {
          background: #fff;
        }
      }
    }
    &-btn {
      width: 44px;
      height: 44px;
      background: rgba(0, 0, 0, 0.2);
      color: #fff;
      border-radius: 50%;
      position: absolute;
      top: 228px;
      z-index: 2;
      text-align: center;
      line-height: 44px;
      opacity: 0;
      transition: all 0.5s;
      &.prev {
        left: 20px;
      }
      &.next {
        right: 20px;
      }
    }
  }
  &:hover {
    .carousel-btn {
      opacity: 1;
    }
  }
}
</style>

注册成全局插件

import Carousel from '../carousel.vue'
// vue2.0插件写法要素:导出一个对象,有install函数,默认传入了Vue构造函数,Vue基础之上扩展
// vue3.0插件写法要素:导出一个对象,有install函数,默认传入了app应用实例,app基础之上扩展

export default {
  install(app) {
    // 在app上进行扩展,app提供 component directive 函数
    // 如果要挂载原型 app.config.globalProperties 方式
    app.component(Carousel.name, xtxCarousel)
  }
}

在main.js入口文件挂载

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import libraryUI from '@/components/library/index' //自己的插件
createApp(App)
  .use(store)
  .use(router)
  .use(libraryUI) // 挂载插件
  .mount('#app')

如何使用插件呢?

<Carousel :list="list" duration="1" />

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

相关文章

  • vue动态配置模板 ''component is''代码

    vue动态配置模板 ''component is''代码

    这篇文章主要介绍了vue动态配置模板 'component is'代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 通过Vue实现Excel文件的上传和预览功能

    通过Vue实现Excel文件的上传和预览功能

    在业务系统中,Excel 文件作为一种常用的数据存储和传输格式,经常需要被处理和展示,这篇文章将讲解如何通过 Vue 和 xlsx.js 实现 Excel 文件的上传和预览功能,需要的朋友可以参考下
    2025-04-04
  • 使用Vue3实现交互式雷达图的代码实现

    使用Vue3实现交互式雷达图的代码实现

    雷达图是一种可视化数据的方式,用于比较多个类别中不同指标的相对值,它适用于需要展示多个指标之间的关系和差异的场景,本文给大家介绍了如何用Vue3轻松创建交互式雷达图,需要的朋友可以参考下
    2024-06-06
  • vue仿element实现分页器效果

    vue仿element实现分页器效果

    这篇文章主要介绍了vue仿element实现分页器效果,实现思路是定一个值foldPage, 意为当前最多显示的标签数,当总页数超过即显示省略.省略分为左边省略(folder1)和右边省略(folder2),具体实例代码大家参考下本文
    2018-09-09
  • 详解vue中computed 和 watch的异同

    详解vue中computed 和 watch的异同

    本篇文章主要介绍了vue中computed 和 watch的异同,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • VUE 自定义取色器组件的实现

    VUE 自定义取色器组件的实现

    本文主要介绍了VUE 自定义取色器组件的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • vue3.0报错Cannot find module‘worker_threads‘的解决办法

    vue3.0报错Cannot find module‘worker_threads‘的解决办法

    这篇文章介绍了vue3.0报错Cannot find module‘worker_threads‘的解决办法。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • Vue3中实现代码高亮的两种方法(prismjs和highlight.js)

    Vue3中实现代码高亮的两种方法(prismjs和highlight.js)

    最近忙着开发自己的博客系统,在做界面展示的时候,需要让代码高亮,于是经过在网上查阅,发现有两款比较好用的插件实现代码高亮,分别是prismjs和highlight.js,下面我分别介绍下,方便给需要的同学参考
    2025-04-04
  • vue动态路由实现多级嵌套面包屑的思路与方法

    vue动态路由实现多级嵌套面包屑的思路与方法

    在实际项目中我们会碰到多层嵌套的组件组合而成,比如我们常见的面包屑导航,下面这篇文章就来给大家介绍关于vue实现动态路由多级嵌套面包屑的思路与方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • 详解vue3的沙箱机制

    详解vue3的沙箱机制

    这篇文章主要介绍了vue3的沙箱机制的相关资料,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下
    2021-04-04

最新评论