轮播图模块(vue)
轮播图模块(vue)
通过属性方式传值
值为一个数组、每一项含有imgUrl(图片地址)、link(跳转链接),link为可选属性
<template>
<div class="createBannerArea"> <!-- 图片区域 -->
<div class="imgArea" ref="imgArea" style="marginLeft:0" @mouseenter="onMouseenter" @mouseleave="onMouseleave">
<template v-if="arrUrl[0].link">
<a v-for="(item,index) in arrUrl" :key="index" href="item.link">
<img :src=item.imgUrl :alt="item.imgUrl" srcset="">
</a>
<a href="arrUrl[0].link">
<img :src=arrUrl[0].imgUrl alt="" srcset="">
</a>
</template>
<template v-else>
<img v-for="(item,index) in arrUrl" :key="index" :src=item.imgUrl alt="" srcset="">
<img src=arrUrl[0].imgUrl alt="" srcset="">
</template>
</div> <!-- 小圆圈 -->
<div class="circleArea">
<span ref="circle" v-for="(item,index) in arrUrl" :key="index" @click="onClick(index)"></span>
</div> </div>
</template> <script>
export default {
name: 'createBannerArea',
data(){
return {
timer1: null, // 图片切换定时器
timer2: null, // 图片过渡定时器
time1: 2000, // timer1定时器的时间
time2: 10, // timer2定时器的时间
time3: 500, // 多久完成过渡
index: 0, // 当前显示第几张
circleColor: '#ddd', // 圆圈颜色
activeCirclecolor: '#aaa', // 选中状态时圆圈颜色
}
},
props: {
arrUrl: {
type: Array,
default: function(){
return []
}
}
},
methods: {
onMouseenter(){
clearInterval(this.timer1)
this.timer1 = null
},
onMouseleave(){
this.autoChange()
},
onClick(index){
this.index = index
this.setStatus();
this.autoChange();
},
// 轮播
autoChange(){
if(this.timer1){
clearInterval(this.timer1);
this.timer1 = null
}
this.timer1 = setInterval(() => {
if(this.index == this.arrUrl.length){
this.index = 1;
}else{
this.index ++
}
this.setStatus()
}, this.time1);
}, // 设置动画
setStatus(){
for(var i = 0; i < this.arrUrl.length; i++){
if(i == this.index){
this.$refs.circle[i].style.backgroundColor = this.activeCirclecolor;
}else{
this.$refs.circle[i].style.backgroundColor = this.circleColor;
}
if(this.index === this.arrUrl.length){
this.$refs.circle[0].style.backgroundColor = this.activeCirclecolor;
}
}
var start = parseInt(this.$refs.imgArea.style.marginLeft);
var end = -this.index * 100;
var dis = end - start;
var speed = dis / this.time3;
if(this.timer2){
clearInterval(this.timer2);
this.timer2 = null
}
this.timer2 = setInterval(() => {
start += speed * this.time2;
this.$refs.imgArea.style.marginLeft = start + '%';
if(Math.abs(end - start) < 1){
if(this.index == this.arrUrl.length){
this.$refs.imgArea.style.marginLeft = 0 + '%';
}else{
this.$refs.imgArea.style.marginLeft = end + '%';
}
clearInterval(this.timer2);
this.timer2 = null
}
}, this.time2);
}, // 清除定时器
clearTimer(){
clearInterval(this.timer1);
clearInterval(this.timer2);
}, onVisibilitychange(){
document.addEventListener("visibilitychange", this.isDocuHidden)
},
// 判断页面是hidden还是visible状态,目的是当最小化和切换其他标签页时,停止定时器,优化性能
// visible: 页面内容至少是部分可见。 在实际中,这意味着页面是非最小化窗口的前景选项卡。
// hidden: 页面内容对用户不可见。 在实际中,这意味着文档可以是一个后台标签,或是最小化窗口的一部分,或是在操作系统锁屏激活的状态下。
isDocuHidden(){
if(document.visibilityState == 'hidden'){
this.clearTimer()
}else if(document.visibilityState == 'visible'){
this.autoChange();
}
}
}, beforeDestroy(){
// 当组件销毁前清除定时器和document的事件
this.clearTimer()
document.removeEventListener('visibilitychange',this.isDocuHidden)
}, mounted: function () {
this.$nextTick( () => {
this.autoChange()
this.onVisibilitychange();
})
}
}
</script> <style scoped>
.createBannerArea{
width: 100%;
height: 500px;
overflow: hidden;
outline: 1px solid red;
margin: 10px auto;
}
.createBannerArea .imgArea{
display: flex;
flex-wrap: nowrap;
width: 100%;
height: 100%;
}
.createBannerArea .imgArea a{
flex: 0 0 auto;
width: 100%;
height: 100%;
}
.createBannerArea .imgArea img{
width: 100%;
height: 100%;
}
.circleArea{
margin-top: -25px;
text-align: center;
}
.circleArea span{
display: inline-block;
width: 10px;
height: 10px;
margin: 0 10px;
border-radius: 50%;
background-color: #999;
cursor: pointer;
}
.circleArea span:first-child{
background-color: #777;
}
</style>
轮播图模块(vue)的更多相关文章
- 移动端轮播图vue-awesome-swiper
日常写设计文档,日常写Demo,写轮播图的时候觉得bootstrap不适合移动端,或者说不是轻量级的,于是换成Swiper,但是写的时候才发现怎么把这东西嵌到Vue里面啊? Σ( ° △ °|||)︴ ...
- vue轮播图插件vue-awesome-swiper的使用与组件化
不管是APP还是移动端网页开发,轮播图在大部分项目当中都是存在的,这时候如果用vue开发项目,选择一款好的插件并且封装好是很重要的 1. 推荐使用vue-awesome-swiper 安装:cnpm ...
- vue music-抓取歌单列表数据(渲染轮播图)
下载安装新依赖 babel-runtime:对es6语法进行转译 fastclick:对移动端进行点击300毫秒延迟 ,,取消掉 babel-polyfill:API 先添加,在npm install ...
- vue轮播图
vue开发中遇到这样一个需求实现导航栏和中间内容相结合实现页面滑动导航跟随改变的效果.看效果: 这里我用的是vue所带的插件:vue-awesome-swiper,传送门:https://www.np ...
- vue.js学习之better-scroll封装的轮播图初始化失败
vue.js学习之better-scroll封装的轮播图初始化失败 问题一:slider组件初始化失败 原因:页面异步获取数据很慢,导致slider初始化之后,数据还未获取到,导致图片还未加载 解决方 ...
- vue移动音乐app开发学习(三):轮播图组件的开发
本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...
- 用vue写一个仿简书的轮播图
原文地址:用vue写一个仿简书的轮播图 先展示最终效果: Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮 ...
- vue自定义轮播图组件 swiper
1.banner 组件 components/Banner.vue <!-- 轮播图 组件 --> <template> <div class="swiper- ...
- Vue轮播图插件---Vue-Awesome-Swiper
轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...
随机推荐
- python 利用csv模块导入数据
- 网络流24题 餐巾计划(DCOJ8008)
题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快 ...
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB(莫比乌斯反演)
题意:求$\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$. 开始开心(自闭)化简: $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)$ =$\su ...
- Python3 写的远程批量修改文件内容的脚本
一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...
- JDK 8 中包列表及介绍
了解了Java 8中所有包的作用,对Java 8有了一个整体的了解,另外也是提高了自身的阅读能力.本文列出了Java 8中所有的包,并且对每一个包的功能做了简要的说明,希望对你有所帮助. ------ ...
- Kubernetes1.4新特性前瞻:设置JOB执行计划
(一) 核心概念 Kubernetes在新版中会新增了一个设置JOB执行计划的功能,在1.3中已经可以初见端倪了,从进度上来看会在1.4版本中进行发布,下面我们先睹为快. Kubernetes通过这 ...
- MacOS代理设置(桌面应用代理设置&Terminal代理设置)
MacOS代理分为桌面应用代理设置&Terminal代理设置,使用代理软件默认只会开启桌面应用代理,Terminal代理需要单独配置 桌面应用代理设置 Terminal查看桌面应用代理设置 ...
- 《C语言深度解剖》学习笔记之预处理
第3章 预处理 1.下面两行代码都是错的.因为注释先于预处理指令被处理,当这两行被展开成“//……”和“/*……*/”时,注释已处理完毕,所以出现错误 #define BSC // #define B ...
- 解决ViewState过于庞大的问题
这里是我将ViewState持久化保持在服务器端的代码,这样ViewState不占用网络带宽,因此其存取只是服务器的磁盘读取时间.并且它很 小,可以说是磁盘随便转一圈就能同时读取好多ViewState ...
- 怎么清除火狐浏览器的cookie?
火狐浏览器清除Cookie方法/步骤 1.打开火狐浏览器.并在火狐浏览器工具栏找到并单击“工具”下的“选项”. 2.在打开的“火狐浏览器选项”程序窗口中,找到工具栏中的“隐私”并单击,在隐私选项下找到 ...