轮播图模块(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)的更多相关文章

  1. 移动端轮播图vue-awesome-swiper

    日常写设计文档,日常写Demo,写轮播图的时候觉得bootstrap不适合移动端,或者说不是轻量级的,于是换成Swiper,但是写的时候才发现怎么把这东西嵌到Vue里面啊? Σ( ° △ °|||)︴ ...

  2. vue轮播图插件vue-awesome-swiper的使用与组件化

    不管是APP还是移动端网页开发,轮播图在大部分项目当中都是存在的,这时候如果用vue开发项目,选择一款好的插件并且封装好是很重要的 1. 推荐使用vue-awesome-swiper 安装:cnpm ...

  3. vue music-抓取歌单列表数据(渲染轮播图)

    下载安装新依赖 babel-runtime:对es6语法进行转译 fastclick:对移动端进行点击300毫秒延迟 ,,取消掉 babel-polyfill:API 先添加,在npm install ...

  4. vue轮播图

    vue开发中遇到这样一个需求实现导航栏和中间内容相结合实现页面滑动导航跟随改变的效果.看效果: 这里我用的是vue所带的插件:vue-awesome-swiper,传送门:https://www.np ...

  5. vue.js学习之better-scroll封装的轮播图初始化失败

    vue.js学习之better-scroll封装的轮播图初始化失败 问题一:slider组件初始化失败 原因:页面异步获取数据很慢,导致slider初始化之后,数据还未获取到,导致图片还未加载 解决方 ...

  6. vue移动音乐app开发学习(三):轮播图组件的开发

    本系列文章是为了记录学习中的知识点,便于后期自己观看.如果有需要的同学请登录慕课网,找到Vue 2.0 高级实战-开发移动端音乐WebApp进行观看,传送门. 完成后的页面状态以及项目结构如下: 一: ...

  7. 用vue写一个仿简书的轮播图

    原文地址:用vue写一个仿简书的轮播图 先展示最终效果: Vue的理念是以数据驱动视图,所以拒绝通过改变元素的margin-top来实现滚动效果.写好css样式,只需改变每张图片的class即可实现轮 ...

  8. vue自定义轮播图组件 swiper

    1.banner 组件 components/Banner.vue <!-- 轮播图 组件 --> <template> <div class="swiper- ...

  9. Vue轮播图插件---Vue-Awesome-Swiper

    轮播图插件 Vue-Awesome-Swiper 地址:https://github.com/surmon-china/vue-awesome-swiper 安装:npm install vue-aw ...

随机推荐

  1. JavaScript--微博发布效果

    效果图: 实现思路:  当发布按钮被点击时,又会分为三种情况 1.如果输入的内容为空,弹出提示:不能发布空微博 2.如果输入的文字超过120,弹出提示,微博内容不能超过120 3.正常发布微博到列表里 ...

  2. 洛谷 P3768 简单的数学题 (莫比乌斯反演)

    题意:求$(\sum_{i=1}^{n}\sum_{j=1}^{n}ijgcd(i,j))mod p$(p为质数,n<=1e10) 很显然,推式子. $\sum_{i=1}^{n}\sum_{j ...

  3. MyEclipse2014,java文件无法编译,run as上是none applicable,不是文件本身的问题

    1.配置一下JDK目录 2.window -> Preferences -> java -> Installed JREs -> Add

  4. 【ToReadList】六种姿势拿下连续子序列最大和问题,附伪代码(以HDU 1003 1231为例)(转载)

    问题描述:       连续子序列最大和,其实就是求一个序列中连续的子序列中元素和最大的那个. 比如例如给定序列: { -2, 11, -4, 13, -5, -2 } 其最大连续子序列为{ 11, ...

  5. *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<_UIFeedbackParameters 0x1d4442e50> setNilValueForKey]: could not set nil as the value for the key rate.'

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '[<_UIFeedbac ...

  6. Hadoop及HIVE学习宝典收集

    Hive经常使用命令https://cwiki.apache.org/confluence/display/Hive/GettingStartedhttp://richardxu.com/hiveql ...

  7. @hdu - 6594@ Double Tree

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定两棵 N 个点的树,以及树上每条边的权值 w(u, v),每 ...

  8. 动画删除cell出问题

    删除UITableView行的代理时出了问题 解决办法 先remove数据,再执行 [_mTableView deleteRowsAtIndexPaths:[NSArray arrayWithObje ...

  9. behavior planning——14.implement a cost function in C++

    n most situations, a single cost function will not be sufficient to produce complex vehicle behavior ...

  10. 【Activiti工作流引擎】官方快速入门demo

    Activiti官方快速入门demo 地址: https://www.activiti.org/quick-start 0. 版本 activiti 5.22.0 JDK 1.8 1. 介绍 这个快速 ...