轮播图组件封装, 我们主要分为三大步来完成:

1. 基本布局

2. 渲染结构

3. 逻辑封装

我们这里封装的轮播图组件和 Element UI 所封装的走马灯组件有所不同

Element UI 是直接渲染组件来决定的, 我们所封装的是根据数据来决定

首先我们来完成第一大步(基本布局)

思路分析:

1. 首先需要一个父盒子对轮播图组件进行约束, 父盒子根据情况来是否给定位; 设置宽高

2. 轮播图组件根据外部的父盒子的宽高走, 设置100%; 自身设置相对定位

3. 通过样式去设置好左右切换图片的按钮位置, 用户自定义图片位置的圆点位置和显示图片的位置

4. 显示的图片我们可以将所有的图片叠在一起, 定义一个 fade 类; 通过图片的下标值来动态的控制 opacity 类的值

5. 还需要设置 active 类, 用户点击圆点的时候; 将点击的那一个高亮

<template><div class='xtx-carousel'><ul class="carousel-body"><!-- 所有图片列表 --><li class="carousel-item fade"><RouterLink to="/"><img src="http://yjy-xiaotuxian-dev.oss-cn-beijing.aliyuncs.com/picture/2021-04-15/1ba86bcc-ae71-42a3-bc3e-37b662f7f07e.jpg" alt=""></RouterLink></li></ul><!-- 左箭头 --><a href="javascript:;" class="carousel-btn prev"><i class="iconfont icon-angle-left"></i></a><!-- 右箭头 --><a href="javascript:;" class="carousel-btn next"><i class="iconfont icon-angle-right"></i></a><!-- 计数器 --><div class="carousel-indicator"><span v-for="i in 5" :key="i"></span></div></div>
</template><script>
export default {name: 'XtxCarousel'
}
</script><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类&.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类&.active {background:  #fff;}}}&-btn {width: 44px;height: 44px;background: rgba(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>

第二步(渲染结构)

思路分析:

1. 我们结构是根据后端的数据来的, 所以轮播图组件需要暴露出一个 sliders 出去接收父组件传入来的数据

2. 轮播图组件内部还需要暴露出一个记录下标值的响应式变量, 它的默认值是 0 , 默认显示第一种图片和默认高亮第一个计步器按钮

<template><div class='xtx-carousel'><ul class="carousel-body"><!-- 所有图片列表 --><li class="carousel-item" v-for="(item, i) in sliders" :key="item.id" :class="{fade: i===index}"><RouterLink to="/"><img :src="item.imgUrl" alt=""></RouterLink></li></ul><!-- 左箭头 --><a href="javascript:;" class="carousel-btn prev"><i class="iconfont icon-angle-left"></i></a><!-- 右箭头 --><a href="javascript:;" class="carousel-btn next"><i class="iconfont icon-angle-right"></i></a><!-- 计数器 --><div class="carousel-indicator"><span v-for="(item, i) in sliders" :key="item" :class="{active: i===index}"></span></div></div>
</template><script>
import { ref } from 'vue'
export default {name: 'XtxCarousel',props: {sliders: {type: Array,default: () => []}},setup () {// 记录图片的下标值变量const index = ref(0)return { index }}
}
</script>

第三步(逻辑封装)

先梳理一下大致要实现的效果:

1. 需要兼容自动轮播效果

2. 鼠标进入停止自动轮播, 鼠标离开继续

3. 点击左右切换按钮, 切换前后图片

4. 点击计步器时, 切换对应的图片

5. 组件销毁时, 清除定时器

第一个需求(兼容自动轮播)

思路分析:

1. 首先是否自动轮播是用户来决定的, 且轮播时间间隔也是一样

2. 所以, 轮播图组件内部需要暴露出 autoPlay 和 duration 两个属性

3. 将自动轮播效果封装成一个函数

4. 使用定时器, 通过修改 index 值来控制图片的切换

5. 调用自动轮播是有条件的, sliders 是否有数据(没有图片的时候, 去做轮播是没有必要的); autoPlay 的值是否为真

<script>
import { ref, watch } from 'vue'
export default {name: 'XtxCarousel',props: {// 轮播图数据sliders: {type: Array,default: () => []},// 是否制动轮播autoPlay: {type: Boolean,default: false},// 轮播时间间隔duration: {type: Number,default: 3000}},setup (props) {// 记录图片的下标值变量const index = ref(0)let timer = nullconst autoPlayFn = () => {// 清除掉上一个定时器, 避免定时器的累加// 特别是开发热更新的项目时clearInterval(timer)timer = setInterval(() => {index.value++if (index.value >= props.sliders.length) {index.value = 0}}, props.duration)}// 监听sliders值的变化watch(() => props.sliders, (newVal) => {if (newVal.length && props.autoPlay) {autoPlayFn()}// 加上immediate的含义在于, 可能父组件传进来的数据并不是发请求获取的数据// 可能是定死的数据, 那么组件初始化的时候就会有数据// 不加上immediate的话, 就永远监听不到sliders的变化的了// 那么永远就不会做轮播}, { immediate: true })return { index }}
}
</script>
// 因为autoPlay是一个布尔值, 所以直接写autoPlay就代表为true
<XtxCarousel :sliders="sliders" autoPlay />

第二个需求(鼠标进入停止轮播, 离开继续)

思路分析:

1. 定义一个 stop 函数, 判断如果 timer 存在; 则清除定时器

2. 定义一个 start 函数, 鼠标离开时开启轮播

3. @mouseenter事件调用 stop 函数, @mouseleave事件调用start函数

<template><div class='xtx-carousel' @mouseenter="stop" @mouseleave="start"><ul class="carousel-body"><!-- 所有图片列表 --><li class="carousel-item"v-for="(item, i) in sliders" :key="item.id":class="{fade: i===index}"><RouterLink to="/"><img :src="item.imgUrl" alt=""></RouterLink></li></ul>......</div>
</template><script>
import { ref, watch } from 'vue'
export default {name: 'XtxCarousel',props: {// 轮播图数据sliders: {type: Array,default: () => []},// 是否制动轮播autoPlay: {type: Boolean,default: false},// 轮播时间间隔duration: {type: Number,default: 1000}},setup (props) {......// 鼠标进入停止轮播const stop = () => {if (timer) clearInterval(timer)}// 鼠标离开开始轮播const start = () => {if (props.sliders.length && props.autoPlay) {autoPlayFn()}}return { index, stop, start }}
}
</script>

第三个需求(点击左右切换按钮, 切换图片)

思路分析:

1. 封装一个 toggle 函数, 此函数接收一个 step 数据

2. 用户点击上一张按钮时 step 值为 -1, 下一张按钮时 step 值为 1

<template><div class='xtx-carousel' @mouseenter="stop" @mouseleave="start">......<!-- 左箭头 --><a @click="toggle(-1)" href="javascript:;" class="carousel-btn prev"><i class="iconfont icon-angle-left"></i></a><!-- 右箭头 --><a @click="toggle(1)" href="javascript:;" class="carousel-btn next"><i class="iconfont icon-angle-right"></i></a>......</div>
</template><script>
import { ref, watch } from 'vue'
export default {name: 'XtxCarousel',......setup (props) {......// 点击左右切换按钮, 切换图片const toggle = (step) => {// 重新定义一个变量的原因是, 可能index.value + step的值会大于可控范围// 所以需要定义新的变量, 判断const newIndex = index.value + stepif (newIndex > props.sliders.length - 1) {index.value = 0return}if (newIndex <= 0) {index.value = props.sliders.length - 1return}// 正常情况index.value = newIndex}return { index, stop, start, toggle }}
}
</script>

第四个需求(点击计步器切换按钮, 切换图片)

点击时, 将对于的下标值赋值

<!-- 计数器 -->
<div class="carousel-indicator"><span @click="index=i" v-for="(item, i) in sliders" :key="item" :class="{active: i===index}"></span>
</div>

第五个需求(组件销毁时清除定时器)

<script>
// 组件销毁时, 清除定时器
onUnmounted(() => {clearInterval(timer)
})
</script>

组件封装 - 轮播图组件相关推荐

  1. js实现轮播图_高性能轻量级零依赖的轮播图组件——Glider.js

    介绍 Glider.js是一个依赖原生js的轮播图组件库,因为其压缩后仅仅2.8k大小,其拥有着很好的性能,Glider.js在Github上开源,目前已拥有2.4kstars. Github htt ...

  2. vue开发一个实用美观的轮播图组件

    网上有不少vue开发的轮播图资源,相信读者也看过不少,这里笔者开发了一个轮播图组件,简单美观实用. 先上示例图: 常见的轮播图都是占满屏幕的形式,像上图所示的轮播图虽然经常见到,但是在一些常见的轮播组 ...

  3. 使用原生js将轮播图组件化

    代码地址如下: http://www.demodashi.com/demo/11316.html   这是一个轮播图组件,这里是代码地址,需要传入容器的id和图片地址,支持Internet Explo ...

  4. ionic组件-Slides轮播图

    Slides轮播图组件 ionic中的轮播图组件是基于swiper插件,所以配置slides的属性需要在swiper的API中找: Swiper触摸滑动插件:https://www.swiper.co ...

  5. Vue2 轮播图组件 slide组件

    Vue2原生始轮播图组件,支持宽度自适应.高度设置.轮播时间设置.左右箭头按钮控制,圆点按钮切换,以及箭头.圆点按钮是否显示. <v-carousel :slideData="slid ...

  6. Vue2 轮播图组件 原生slide组件

    Vue2原生始轮播图组件,支持宽度自适应.高度设置.轮播时间设置.左右箭头按钮控制,圆点按钮切换,以及箭头.圆点按钮是否显示. <v-carousel :slideData="slid ...

  7. 小程序轮播图组件跳转到自定义页面

    1.轮播图组件wxml代码 2.轮播图组件js 3.在页面引入轮播图组件 4.设置页面js 5.未跳转之前页面 6.点击轮播图跳转

  8. 微信小程序---swiper轮播图组件

    微信小程序-swiper轮播图组件 在components中新建文件夹swiper components/swiper/swiper.wxml <!--components/swiper/swi ...

  9. 【微信小程序】好看的轮播图组件

    微信小程序好看的轮播图组件效果示例 使用步骤 第一步: 新建components文件夹 第二步: 按照以下目录创建文件:(文件名可以自定义,但后面引入组件时应保持前后一致) 第三步: 各个文件的代码: ...

最新文章

  1. 整型和浮点型的区别_C的基础内容:常量之数值型常量,适合新手的学习
  2. Windows——Windows恢复环境(Windows RE)
  3. Spring Boot Starters介绍
  4. C++等级考试知识点总结
  5. Exchange Server 2003 部署手册
  6. h:commandButton
  7. 电话号码 手机号码 等准确详细 正则表达式
  8. android蓝牙协议名词解释 OPP HFP HDP A2DP PAN
  9. python中property干什么用的?
  10. 矩池云上安装MATLAB R2020a遇到的坑
  11. 与计算机专业相关的英语科普短文,英语科普文选-中英文对照(计算机.doc
  12. 利用格林函数解泊松方程
  13. jsp代码项目例子_【jav笔记】057天,jsp。
  14. Chrome OS:“比 Linux 更好的 Linux”,这样你就可以忘记 Windows
  15. 【算法设计与分析】三个博弈论算法分析
  16. chrome 设置保护眼睛颜色
  17. 检测站营销系列文章:机动车检测站如何做精益营销?
  18. 计算机web二级考试内容,2015年全国计算机二级Web考试内容
  19. go语言宕机(panic)——程序终止运行
  20. 【bioinfo】sam文件可选区域字段(Optional Feild)含义

热门文章

  1. fcntl的详细使用
  2. php 自动翻译函数(中文翻译成英文)
  3. 详细介绍idea实现javaweb项目登入注册(华东交通大学教务处信息管理系统)、模糊查询...
  4. 服务器中的编码解码问题
  5. Boost用法split
  6. 18. SPI协议,spi转can,MCP2515裸机驱动详解
  7. 凌恩生物美文分享|HGTree v2.0:水平基因转移数据库
  8. jenkins执行状态stable unstable是什么
  9. 制作你自己的yolov5数据集并进行训练
  10. STM32F4关键寄存器总结