热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue封装轮播图组件(传入链接、图片即可使用)

1.先看效果图:2.目录:3.Swiper.vue源码:

1.先看效果图:
《Vue封装 轮播图 组件 (传入链接、图片即可使用)》

2.目录:
《Vue封装 轮播图 组件 (传入链接、图片即可使用)》
3.Swiper.vue源码:

<template>
<div id="mySwiper">
<div
class="swiper"
@touchstart="touchStart"
@touchmove="touchMove"
@touchend="touchEnd"
>
<slot></slot>
</div>
<div class="indicator">
<div
class="indicatorItem"
v-for="(item, index) in slideCount"
:key="index"
:class="{ active: index === currentIndex - 1 }"
></div>
</div>
</div>
</template>
<script>
export default {
name: "Swiper",
props: { },
data: function() {
return {
slideCount: 0,
interval: 3000,
imgWidth: 0, //swiper每张图片的宽度一样
swiperStyle: { }, //利用swiper的style对象来控制着“过渡”
currentIndex: 1, //记录当前滑动的下标
scrolling: false, //当用手触摸和移动时,则暂停滚动
animalDuration: 300, //切换一张图片0.3
showIndicator: true, //当只有一张图片时,不显示小点点
moveRatio: 0.25,
playTimer: null, //控制着计时器的开始与暂停
moveRatio: 0.25
};
},
methods: {
handleDom: function() {
let swiperEle = document.querySelector(".swiper");
let slideEles = document.getElementsByClassName("slide");
this.slideCount = slideEles.length;
console.log(this.slideCount);
if (this.slideCount > 1) {
let cloneFirst = slideEles[0].cloneNode(true);
let cloneLast = slideEles[this.slideCount - 1].cloneNode(true);
swiperEle.insertBefore(cloneLast, slideEles[0]);
swiperEle.appendChild(cloneFirst);
console.log(slideEles);
this.imgWidth = swiperEle.offsetWidth;
this.swiperStyle = swiperEle.style;
}
//显示第一张图片(不是刚刚从最后面添加到前面的那张)
this.setTransform(-this.imgWidth);
},
startTimer: function() {
let that = this;
this.playTimer = setInterval(function() {
that.currentIndex++;
that.scrollContent(-that.currentIndex * that.imgWidth); //使用过渡实现移动轮播图,效果更舒适
}, that.interval);
},
setTransform: function(movePosition) {
//控制着轮播图向左右移动
this.swiperStyle.transform = `translateX(${ movePosition}px)`;
this.swiperStyle["-webkit-transform"] = `translateX(${ movePosition}px)`;
this.swiperStyle["-ms-transform"] = `translateX(${ movePosition}px)`;
},
scrollContent: function(position) {
this.scrolling = true; //滚动时不能用手滑动图片
this.swiperStyle.transition = `transform ${ this.animalDuration}ms ease`;
this.setTransform(position);
this.checkPosition();
this.scrolling = false;
},
checkPosition: function() {
//在确保“过渡”结束后再检查下标是否合理
let that = this;
setTimeout(function() {
that.swiperStyle.transition = "0ms";
if (that.currentIndex >= that.slideCount + 1) {
that.currentIndex = 1;
that.setTransform(-that.currentIndex * that.imgWidth); //当移动到最后一张,直接移动到第一张,不用过渡
} else if (that.currentIndex <= 0) {
that.currentIndex = that.slideCount;
that.setTransform(-that.currentIndex * that.imgWidth);
}
}, that.animalDuration);
},
touchStart: function(e) {
//如果图片正在滚动,则不能滑动图片
if (this.scrolling) return;
//滑动时,暂停计时器
this.stopTimer();
this.startX = e.touches[0].pageX; //记录手指进入屏幕的距离,用于判断划痕的距离判断是否滑动图片
},
touchMove: function(e) {
this.currentX = e.touches[0].pageX;
this.distance = this.currentX - this.startX;
let currentPosition = -this.currentIndex * this.imgWidth;
let moveDistance = this.distance + currentPosition;
this.setTransform(moveDistance);
},
touchEnd: function(e) {
let endDistance = Math.abs(this.distance); //取绝对值
let movePercentage = this.imgWidth * this.moveRatio; //当手指滑动到这个距离,则自动跳到下一张图片
if (this.distance === 0) {
return;
} else if (this.distance > 0 && endDistance > movePercentage) {
//this.distance>0 则说明手指向右滑
this.currentIndex--;
} else {
this.currentIndex++;
}
this.scrollContent(-this.currentIndex * this.imgWidth);
this.startTimer();
},
stopTimer: function() {
clearInterval(this.playTimer);
}
},
mounted: function() {
//1.操作dom,在前后添加slide
setTimeout(() => {
this.handleDom();
this.startTimer();
}, 200);
}
};
</script>
<style>
* {
margin: 0px;
padding: 0px;
}
#mySwiper {
overflow: hidden;
position: relative;
}
.swiper {
display: flex;
}
.indicator {
display: flex;
position: absolute;
justify-content: center;
bottom: 12px;
width: 100%;
}
.indicatorItem {
width: 8px;
height: 8px;
margin: 5px 3px;
border-radius: 50%;
background-color: #fff;
}
.active {
background-color: rgba(212, 62, 46, 1);
}
</style>

4.SwiperItem.vue源码:

<template>
<div class="slide">
<slot></slot>
</div>
</template>
<script>
export default {
name: "Slide"
};
</script>
<style scoped>
.slide {
width: 100%;
flex-shrink: 0;
}
.slide img {
width: 100%;
}
</style>

5.在主组件中使用轮播图:

import Swiper from "./components/swiper/Swiper";
import SwiperItem from "./components/swiper/SwiperItem";
//注册
components: {
Swiper,
SwiperItem
}
//使用
<template>
<div id="app">
<Swiper>
<SwiperItem v-for="(item, index) in arr" :key="index"
><a :href="item.link">
<img :src="item.image" />
</a>
</SwiperItem>
</Swiper>
</div>
</template>

注意:上面的arr是一个存储着a标签和img标签链接的数组。


推荐阅读
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 在什么情况下MySQL的可重复读隔离级别会导致幻读现象? ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 优化Vite 1.0至2.0升级过程中遇到的某些代码块过大问题解决方案
    本文详细探讨了在将项目从 Vite 1.0 升级到 2.0 的过程中,如何解决某些代码块过大的问题。通过具体的编码示例,文章提供了全面的解决方案,帮助开发者有效优化打包性能。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文介绍如何在将数据库从服务器复制到本地时,处理因外键约束导致的数据插入失败问题。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 如何在任意浏览器中轻松安装并使用VSCode——Codeserver简易指南
    code-server 是一款强大的工具,允许用户在任何服务器上部署 VSCode,并通过浏览器进行访问和使用。这一解决方案不仅简化了开发环境的搭建过程,还提供了高度灵活的工作方式。用户只需访问 GitHub 上的官方仓库(GitHub-coder/code-server),即可获取详细的安装和配置指南,快速启动并运行 code-server。无论是个人开发者还是团队协作,code-server 都能提供高效、便捷的代码编辑体验。 ... [详细]
author-avatar
听天由命____497
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有